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

时间:2017-09-07 07:12:55

标签: makefile

我有一个正在处理的大型项目,其中我想对某个.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有问题,那么有没有办法实现我想要的呢?

1 个答案:

答案 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