我在linux下有一个c ++项目。我正在使用GNU make和GCC
我有以下规则:
all: ...
version:
config:
rm -f config.h
@$(MAKE) --no-print-directory config.h
config.h:
# ..... create the file config.h here
make version增加内部版本号。 1.1-123,然后1.2-124 ......等版本用config.h文件编写,config.h包含在项目的所有文件中。
现在的想法是在其中一种情况下重建config.h: - 发布程序版本时(而不仅仅是开发/测试) - 当它不存在时
所以我不想让这种依赖:
all: config
config: version
因为然后配置文件将在每个make上重建,并且每个文件都将被重新编译,而不仅仅是已更改的文件。所以我想在开发时不重新构建配置文件,但只有在make release_version
时才这样做
现在。让我们说规则是:
release_version: config version all
问题在于,当我执行make release_version -j 3
时,它会同时生成所有3个目标(config,version,all),这意味着该版本可能尚未准备好创建config.h, config.h可能尚未准备好all
。所以我必须做出这种依赖:
release_version:全部 all:config config:version
执行make release_version
时 但仅。如果make all
被执行,我不想拥有这些依赖项。
也许我需要类似的东西:
release_version:version_release config_release all_release
all_release:config config_release:config version_release:version
答案 0 :(得分:1)
你的例子有点杂乱无章。如果你重读你所拥有的东西并澄清它会很好。 version
目标有什么作用? version
和config
之间的关系是什么?您未在任何地方显示的release_version
与config
和version
之间的关系是什么?
如果我理解正确,您希望拥有all
规则,该规则将使用现有版本的config.h
构建代码(如果它不存在则创建它),以及{{1}将更新release_version
的规则,然后像config.h
一样构建代码。我不确定all
和version
是做什么的。
你可以这样做,除非我遗漏了一些东西:
config
还有很多其他选择。
答案 1 :(得分:0)
使用GNU-make,您可以使用仅限订单的先决条件来强制规则以特定顺序运行,如果其他内容不需要它们,则强制它们运行:
all: ...other targets... | config
...actions...
release_version: config version all
现在,如果您执行make all
,它只会在|
之前重建其他目标。如果由于其他原因需要config
,则会在运行...actions...
之前等待它完成。
这可能还不够,因为其他目标可能会在config
之前运行。如果您需要他们等到config
之后,您还需要将| config
添加到他们的先决条件中。