如何在Gnu Make文件中全局运行某些命令

时间:2012-01-30 13:25:20

标签: gnu-make

我有一个gnu Makefile,它通过环境变量收集版本信息。现在,我想在使用gnumake语法构建任何目标之前全局地做“某事”。作为伪代码,这意味着:

  • 当指定文件存在时,将其删除
  • 运行字符串数组并将其值放入指定的文件

我试过了:

$(shell if exist $(subst /,\,$(products)filenames.h) del /F/Q $(subst /,\,$(products)filenames.h))
$(foreach Item, $(EnvFilenames), @echo $(Item) >> $(subst /,\,$(products)filenames.h))

这给了我一个错误:

C:\temp\Makefile.mak:72: *** missing separator.  Stop.

其中第72行是$(shell ...行。如果我把它放在define部分:

define foobar
$(shell if exist $(subst /,\,$(products)filenames.h) del /F/Q $(subst /,\,$(products)filenames.h))
$(foreach Item, $(EnvFilenames), @echo $(Item) >> $(subst /,\,$(products)filenames.h))
endef

并将其称为目标,运行正常:

$(products)$test.o : test.c $(commons)
$(call foobar)
$(cc) $(cflags_m) test.c -o$@ 

并做了它应该做的......但是一旦我想从另一个define内部调用它,它就会再次失败并失去分隔符。

这是什么意思,我该如何解决?

编译在Win32平台上进行,不必是多平台的。

1 个答案:

答案 0 :(得分:6)

如果每次Make调用一次就足够了,可以将它放在全局赋值中。

# Ignore the value, calling for side effects
IGNORE := $(shell commands with side effects)

我会建议反对这个黑客攻击,但我可以想象它可能派上用场的情况。