【问题标题】:How to run some commands globally in a Gnu Make file如何在 Gnu Make 文件中全局运行一些命令
【发布时间】:2012-01-30 13:25:20
【问题描述】:

我有一个通过环境变量收集版本信息的 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 平台上进行,不必是多平台的。

【问题讨论】:

    标签: gnu-make


    【解决方案1】:

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

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

    我建议不要使用这种 hack,但我可以想象它可能会派上用场的情况。

    【讨论】:

    • 这不会为我执行 - 仅当我删除 IGNORE: = 时。但是我得到了描述的错误。顺便说一句,使用 Make 3.82。
    • 这在这里工作,例如IGNORE := $(shell rm foobar) 将删除 foobar,无论您调用哪个目标。你确定你没有在“:”和“=”之间加空格吗?
    • 备注:你可以将你的命令写在一个批处理文件或shell脚本中,并像IGNORE := $(shell foo.bat)一样调用它,将疯狂程度降到最低。
    • 我们今天刚刚使用了这种技术;确实感觉很hacky,但很有用
    • 来自@echo-call 的“缺少分隔符”错误接缝 - 所以这条线与您的“hack”相结合对我来说很好:$(foreach Item, $(EnvFilenames), $(shell @echo $(Item) >> $(subst /,\,$(products)filenames.h)))
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多