Makefile 在目标中追加目标

Makefile 在目标中追加目标,makefile,gnu-make,Makefile,Gnu Make,我的Makefile不仅构建软件,还将软件安装到系统中 该片段阐述了该软件有3个组件。有时我会更新组件a,而其他时候我可能会更新组件b和c 这三个目标都需要刷新数据库 如果我更新了所有三个组件,并且运行了makeinstall,我只需要数据库刷新一次,而不是三次 是否有办法安排在目标内运行其他目标 我喜欢这样的东西: install-component-a: cp ... db reload install-component-b: cp ... db relo

我的Makefile不仅构建软件,还将软件安装到系统中

该片段阐述了该软件有3个组件。有时我会更新组件a,而其他时候我可能会更新组件b和c

这三个目标都需要刷新数据库

如果我更新了所有三个组件,并且运行了
makeinstall
,我只需要数据库刷新一次,而不是三次

是否有办法安排在目标内运行其他目标

我喜欢这样的东西:

install-component-a:
    cp ...
    db reload

install-component-b:
    cp ...
    db reload

install-component-b:
    cp ...
    db reload
install-component-a:
    cp ...

install-component-b:
    cp ...

install-component-c:
    cp ...

reload-database: install-component-a install-component-b install-component-c
    add new target $?
    db reload
这样的
a-make-command-to-add-new-target
是否存在


重新加载数据库
添加到
所有
目标或
安装
目标可能并不理想,因为如果组件a、b和c均未更改,则数据库不必重新加载。

使配方具有自动变量
$?
,该变量扩展到比目标更新的先决条件

install-component-a:
    cp ...
    a-make-command-to-add-new-target reload-database

install-component-b:
    cp ...
    a-make-command-to-add-new-target reload-database

install-component-b:
    cp ...
    a-make-command-to-add-new-target reload-database

reload-database:
    db reload

您的示例表明目标不是文件。这可能是一个问题,因为所有先决条件都被认为比不存在的文件更新。如果他们不考虑组件触摸文件,并使用该文件时间戳来确定重建的必要性。

< P>不能在Mag文件中添加要建立的新目标。您似乎想要的是一种定义命令的方法,该命令将在所有其他规则运行后始终运行一次。没有这样的东西

我所知道的使之工作的唯一方法是递归调用make。它看起来像这样:

install-component-a:
    cp ...
    db reload

install-component-b:
    cp ...
    db reload

install-component-b:
    cp ...
    db reload
install-component-a:
    cp ...

install-component-b:
    cp ...

install-component-c:
    cp ...

reload-database: install-component-a install-component-b install-component-c
    add new target $?
    db reload

使用make的
eval
功能,例如,请参见

I可能不够清晰。是否有make命令允许我动态添加新目标?在您的代码中,我的贡献者在更改组件a、B或C时必须记住何时调用
make reload database
。我希望他们调用
make install
,make工具确定是否应该调用
reload database
,而且只打一次电话。@gqnbig是这样吗?根据这条规则,他们永远不会真正执行
makecomponent
,只执行
makereloaddatabase
(或者
makeinstall
,这取决于它应该执行的操作)。确保依赖关系确保仅重建更改的零件。您也可以考虑在MaKeCMMeX目标上打印一个消息(“记住也运行命令XXX”),例如模式匹配组件。即使没有重构组件,也会运行<代码> DB重新加载< /代码>。啊,递归制造的悲哀:-(好的解决方案当然,我们不能确定,因为这个问题并不清楚,但从我们所看到的情况来看,这些
install-component-X
规则基本上是虚假的规则:也就是说,如果你调用
make install-component-a
,它将始终运行这个公式:没有办法进行检测不管它是不是最新的。再说一次,我可能是错的,因为我们没有展示实际的配方。这只是我的直觉。你没有展示你想要的解决方案,但请注意,即使使用
eval
,也不可能从配方中添加额外的先决条件。试试吧……谢谢你的澄清!