2014-10-29 50 views
0

我有一个Makefile,我试图创建一个规则,如果它们尚不存在(基于查看特定目录)将生成RPMs,否则只是复制这些RPMs到其他目录。Makefile规则有条件地运行脚本,然后复制文件

基本上我想要做的是:

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

cp -R somedir/build/* destination 

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

+0

如果该目录没有任何* * RPMs?你可以通过make创建单独的RPM,或者运行一个单独的“gotta build'em all”脚本?什么目标或先决条件目前处理您的RPM?有一个吗? – 2014-10-29 12:55:16

+0

如果你使用make,为什么不把rpms作为依赖链的一部分?你如何确定哪些rpms需要在shell脚本中构建? – user657267 2014-10-29 12:56:15

+0

@EtanReisner,因此'somedir/build.sh'构建RPM。根据这个我还没有目标。 – codecraig 2014-10-29 13:54:08

回答

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 \; 

不是最漂亮的,但很有效。

+0

是否要将目录结构复制到目标或平面复制.rpms。前者是你的问题。你的答案是后者。所以你的答案在技术上不正确。你想要什么? – 2014-10-30 09:49:13

+0

问题显示我需要将RPM复制到目标(cp -R somedir/build/* destination),这也是我在答案中显示的内容,对不对? – codecraig 2014-10-30 15:23:54

+0

没有你的答案不复制目录结构 - 它将所有文件平复制到目的地,而不复制目录。我的答案其实也是这样,但那是因为我根据自己的猜测回答了你的真实想法。 – 2014-10-31 03:01:59

0

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

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

somedir/build/rpms: $(PACKEES) Makefile 
    somedir/build.sh 
    touch [email protected] 

PACKEES现在是空的,但你应该将其设置为你想要的已经包装成任何你的RPM的文件换句话说,build.sh读取的所有文件。如果你坚持要用一个build.sh脚本来构建的,一旦你所有进去(这是不是一个好主意),上述最好的,你会得到:)

+0

虽然我完全同意这个*概念*作为一个更好的概念,然而我在我的评论中给了我。事实上,我认为这个实施并不更好。如果RPM被删除但没有源文件改变(除非你将它们包含在'$(PACKEES)'中,你当然可以这么做)它不重建RPMS。它还需要手动保存一份清单,如果保存错误,清单不会在您希望的时候生成(更简单的缺少生成测试的失败模式)。有一个原因,我花了一段时间的脚本来从我的spec文件中提取需求文件。 =) – 2014-10-30 23:14:01

+0

@Etan,好,所以我们在这里礼貌地不同意哲学。我不允许在构建系统中进行任意删除。对我而言,构建系统是一种状态机器,只允许某些操作:触摸源,制作目标,包括清洁。但不能手工删除。如果用户这样做,他们是自己的。这正是我在我的手册中所说的。其次,我认为“手动保存名单”实际上是一个加号,而不是减号。恕我直言,所有的文件列表,应该由用户明确声明,如果可能的话,通配符或某些类似找不到。当然,只在一个地方宣布,不会重复。 – 2014-10-31 02:58:30

+0

我几乎完全同意这一理念,我一直在努力让工作中的构建工作达到一切正常工作并且可以可靠重建的程度(尽管CI似乎每次都希望完全清理构建,可能是因为大多数人们没有得到这个权利)。但是,我认为这有点清楚,但这种情况并非如此。在另一种情况下,我相信我们可以花一段时间讨论这些我想象中的卓有成效的事情。 – 2014-10-31 13:04:26