install-component-a:
cp ...
db reload
install-component-b:
cp ...
db reload
install-component-b:
cp ...
db reload我的Makefile不仅构建软件,而且还将软件安装到系统中。
该代码片段阐明了该软件有3个组成部分。有时我更新组件a,而其他时间我可能更新组件b和c。
这三个目标都需要刷新数据库。
如果我更新所有三个组件,并运行make install,我只需要刷新数据库一次,而不是三次。
有没有办法安排额外的目标在一个目标内运行?
我喜欢这样的东西:
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这样的a-make-command-to-add-new-target存在吗?
将reload-database添加到all目标或install目标可能并不理想,因为如果组件a、b和c都没有更改,则不必重新加载数据库。
发布于 2021-05-30 16:41:08
Make recipes有自动变量$?,它扩展到比目标更新的先决条件。
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您的示例表明目标不是文件。这可能是一个问题,因为所有先决条件都被认为比不存在的文件新。如果它们不考虑让组件接触文件并使用该文件时间戳来确定重建的必要性。
发布于 2021-05-30 23:20:34
不能在makefile中添加要构建的新目标。您似乎想要的是一种定义命令的方法,该命令将在所有其他规则运行后始终运行一次。没有这样的东西可用。
据我所知,要做到这一点,唯一的方法是递归调用make。它看起来像这样:
install-component-a install-component-b install-component-c: recurse ;
recurse:
$(MAKE) $(MAKECMDGOALS:%=r-%)
db reload
r-install-component-a:
cp ...
r-install-component-b:
cp ...
r-install-component-b:
cp ...发布于 2021-06-01 01:23:06
使用make的eval函数,例如查看Metaprogramming Make VI — The eval Function
https://stackoverflow.com/questions/67759058
复制相似问题