makefile:在对.mak文件执行某些操作后,对其执行包含操作

makefile:在对.mak文件执行某些操作后,对其执行包含操作,makefile,Makefile,我有一个大型项目正在进行中,我想对某个.mak文件执行include,但只有在我通过原始makefile中的命令更改此文件内容之后。由于这是一个大型项目,很难编写代码,因此我将给出一个荒谬的示例: .PHONY: clean cleam: $(RM) $(objs) test sed -i 's/cleam/clean/g' file.mak CC = gcc srcs = $(wildcard ./*.c) objs = $(srcs:.c=.o) test: $(ob

我有一个大型项目正在进行中,我想对某个.mak文件执行
include
,但只有在我通过原始makefile中的命令更改此文件内容之后。由于这是一个大型项目,很难编写代码,因此我将给出一个荒谬的示例:

.PHONY: clean

cleam:
    $(RM) $(objs) test  
sed -i 's/cleam/clean/g' file.mak 
CC = gcc
srcs = $(wildcard ./*.c)
objs = $(srcs:.c=.o)


test: $(objs) change_file include_file
    $(CC) $^ -o $@

%.o: %.c
    $(CC) -c $< -o $@

change_file:
    $(shell sed -i 's/cleam/clean/g' file.mak)

include_file: change_file
    include file.mak 
include: Command not found                
我有一些小的C项目,所有的C和头文件都在同一个目录中,我需要编写一个makefile。我不允许在我编写的makefile中使用
clean
规则,但我有一个名为
file.mak
的文件,可以包含在我的makefile中。
文件.mak的内容

.PHONY: clean

cleam:
    $(RM) $(objs) test  
sed -i 's/cleam/clean/g' file.mak 
CC = gcc
srcs = $(wildcard ./*.c)
objs = $(srcs:.c=.o)


test: $(objs) change_file include_file
    $(CC) $^ -o $@

%.o: %.c
    $(CC) -c $< -o $@

change_file:
    $(shell sed -i 's/cleam/clean/g' file.mak)

include_file: change_file
    include file.mak 
include: Command not found                
这里的问题是规则是
cleam
,而不是
clean
。我也不允许手动更改
file.mak
,但我可以使用原始makefile中的命令来执行此操作。这可以通过以下方式轻松实现:

.PHONY: clean

cleam:
    $(RM) $(objs) test  
sed -i 's/cleam/clean/g' file.mak 
CC = gcc
srcs = $(wildcard ./*.c)
objs = $(srcs:.c=.o)


test: $(objs) change_file include_file
    $(CC) $^ -o $@

%.o: %.c
    $(CC) -c $< -o $@

change_file:
    $(shell sed -i 's/cleam/clean/g' file.mak)

include_file: change_file
    include file.mak 
include: Command not found                
所以我想这样写makefile:

.PHONY: clean

cleam:
    $(RM) $(objs) test  
sed -i 's/cleam/clean/g' file.mak 
CC = gcc
srcs = $(wildcard ./*.c)
objs = $(srcs:.c=.o)


test: $(objs) change_file include_file
    $(CC) $^ -o $@

%.o: %.c
    $(CC) -c $< -o $@

change_file:
    $(shell sed -i 's/cleam/clean/g' file.mak)

include_file: change_file
    include file.mak 
include: Command not found                
所以我知道在规则中使用include有一个问题,那么有没有办法实现我想要的呢

(GNU)
make
有一个功能,可以用于这样的场景,但您的方法是错误的
include
是一个指令,不能在配方中使用

.PHONY: clean

cleam:
    $(RM) $(objs) test  
sed -i 's/cleam/clean/g' file.mak 
CC = gcc
srcs = $(wildcard ./*.c)
objs = $(srcs:.c=.o)


test: $(objs) change_file include_file
    $(CC) $^ -o $@

%.o: %.c
    $(CC) -c $< -o $@

change_file:
    $(shell sed -i 's/cleam/clean/g' file.mak)

include_file: change_file
    include file.mak 
include: Command not found                
相反,当您
包含
一个文件时,
make
首先检查创建这个确切文件的规则并执行它们。与您的情况一样,要包含的文件已经存在,您必须使此规则
.PHONY
强制执行。它看起来是这样的:

.PHONY: clean

cleam:
    $(RM) $(objs) test  
sed -i 's/cleam/clean/g' file.mak 
CC = gcc
srcs = $(wildcard ./*.c)
objs = $(srcs:.c=.o)


test: $(objs) change_file include_file
    $(CC) $^ -o $@

%.o: %.c
    $(CC) -c $< -o $@

change_file:
    $(shell sed -i 's/cleam/clean/g' file.mak)

include_file: change_file
    include file.mak 
include: Command not found                
.PHONY: file.mak

file.mak:
    sed -i 's/cleam/clean/g' file.mak

include file.mak

作为一个更健壮的替代品(不需要伪造规则),考虑创建一个固定版本(拷贝),并将其包含:

.PHONY: clean

cleam:
    $(RM) $(objs) test  
sed -i 's/cleam/clean/g' file.mak 
CC = gcc
srcs = $(wildcard ./*.c)
objs = $(srcs:.c=.o)


test: $(objs) change_file include_file
    $(CC) $^ -o $@

%.o: %.c
    $(CC) -c $< -o $@

change_file:
    $(shell sed -i 's/cleam/clean/g' file.mak)

include_file: change_file
    include file.mak 
include: Command not found                
file_fixed.mak: file.mak
    sed -e 's/cleam/clean/g' <file.mak >file_fixed.mak

include file_fixed.mak
file\u fixed.mak:file.mak
sed-e's/cleam/clean/g'文件_fixed.mak
包括文件_fixed.mak

我是否可以添加与make一样好、文档完整的工具,最终,它的级别太低了,我建议使用诸如CMake之类的工具生成makefile。它们已经使用了足够长的时间,能够可靠和可预测。使用我自己的构建系统只基于GNU make,我不同意这一点:)但我必须承认,正确灵活地使用GNU make需要大量的学习,许多人可能会发现使用其他工具更容易。。。只要我远离GNU自动工具,否则你可能会脱发:)自动工具的问题是,一旦你努力使用自动工具,它会占用你太多的时间,你绝对必须通过使用所有的自动工具来证明它的合理性。对我来说,这很简单:我必须维护多少行代码?“我自己的构建系统”恰恰与这种方法背道而驰。如果你正在这么做,并且你已经说服了你的客户/雇主让你这么做……对你有好处。让我们明确一点:这不符合他们的最佳利益。(除非你是开放式项目的作者,比如scons、cmake或所有我一直记不起名字的更新的东西)