Makefile规则有条件地运行脚本然后复制文件

时间:2014-10-29 11:49:33

标签: makefile

我有一个Makefile,我试图创建一个规则来构建RPM,如果它们不存在(基于查看特定目录),否则只需将这些RPM复制到其他目录。 / p>

基本上我想做的是:

if somedir/build does NOT has RPMs:
  somedir/build.sh

cp -R somedir/build/* destination

我一直在使用$(shell if [[ -d somedir/build ]] ....)但没有太多运气。

2 个答案:

答案 0 :(得分:0)

这是有效的:

someproject_rpms:
    @if [[ -d somedir/build ]] ; then \
        count=$$(find somedir/build -name "*.rpm" -type f | wc -l); \
        if [[ $$count -eq 0 ]]; then \
            $$(cd somedir && ./build.sh); \
        fi \
    else \
        $$(cd somedir && ./build.sh); \
    fi; \
    find somedir/build -name "*.rpm" -type f -exec cp {} somedestination \;

不是最漂亮的,但它确实有效。

答案 1 :(得分:0)

您应该使用所谓的“哨兵”文件。这些是空文件,仅用于其时间戳,时间戳表示某些操作的完成,通常会创建一堆其他文件,我们可能知道也可能不知道。名为rpms的两个文件是sentinel文件,这是您的解决方案Makefile

destination/rpms: somedir/build/rpms Makefile
    find $(<D) -name *.rpm -exec cp {} $(@D) \;
    touch $@

somedir/build/rpms: $(PACKEES) Makefile
    somedir/build.sh
    touch $@

PACKEES现在是空的,但你应该将它设置为你想要打包到任何rpms中的所有文件,换句话说,就是build.sh读取的所有文件。如果你坚持使用一个build.sh脚本一次构建所有的rpms(这不是一个好主意),上面的你将得到的最好的东西:)