我有一个正在处理的大型项目,其中我想对某个.mak文件执行include
,但只有在我通过原始makefile中的命令更改此文件内容之后。由于它是一个大型项目,因此编写代码很困难,所以我会给出这个荒谬的例子:
我有一个小C项目,它的所有C和头文件都在同一个目录中,我需要编写一个makefile。我不允许在我编写的makefile中使用clean
规则,但我有一个名为file.mak
的文件,我可以将其包含在我的makefile中。内容file.mak
:
.PHONY: clean
cleam:
$(RM) $(objs) test
此处的问题是该规则为cleam
而非clean
。我也不允许手动更改file.mak
,但我允许使用原始makefile中的命令执行此操作。这可以通过以下方式轻松完成:
sed -i 's/cleam/clean/g' file.mak
所以我想写这样的makefile:
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有问题,那么有没有办法实现我想要的呢?
答案 0 :(得分:1)
(GNU)make
有一个功能Remaking Makefiles,可以用于这样的场景,但你的方法是错误的。 include
是指令,无法在食谱中使用。
相反,当您include
文件时,make
会首先检查创建此确切文件的规则并执行它们。在您的情况下,您要包含的文件已经存在,您必须使此规则.PHONY
强制执行。它看起来像这样:
.PHONY: file.mak
file.mak:
sed -i 's/cleam/clean/g' file.mak
include file.mak
作为一个更强大的替代方案(不需要 phony 规则),请考虑创建固定版本(副本)并包含此内容:
file_fixed.mak: file.mak
sed -e 's/cleam/clean/g' <file.mak >file_fixed.mak
include file_fixed.mak