用于将根文件与";合并的Makefile;hadd";

用于将根文件与";合并的Makefile;hadd";,makefile,root-framework,Makefile,Root Framework,我目前正在编写一个Makefile,它有几个几乎相同的规则/配方,可以使用hadd合并.root文件。有没有一个好办法把这些浓缩成更少的规则?我不确定%对于案例数据[4-6]有多大用处。完成了,因为数字4-6与目录路径中的1-4不匹配 非常感谢 [Makefile] DIR=/hdfs/store/user/$(USER) DATA.root : data1.done data2.done data3.done data4.done data5.done data6.done had

我目前正在编写一个Makefile,它有几个几乎相同的规则/配方,可以使用
hadd
合并
.root
文件。有没有一个好办法把这些浓缩成更少的规则?我不确定
%
对于案例
数据[4-6]有多大用处。完成了
,因为数字4-6与目录路径中的1-4不匹配

非常感谢

[Makefile]

DIR=/hdfs/store/user/$(USER)

DATA.root : data1.done data2.done data3.done data4.done data5.done data6.done
    hadd DATA.root $(addsuffix .root,$(basename $^))
    rm $(addsuffix .root,$(basename $^))
    rm $^

data1.done :
    hadd data1.root $(DIR)/de2012A_loose2Aug-DATA/1/*.root
    touch data1.done

data2.done :
    hadd data2.root $(DIR)/de2012A_loose2Aug-DATA/2/*.root
    touch data2.done

data3.done :
    hadd data3.root $(DIR)/de2012B_loose2Aug-DATA/1/*.root
    touch data3.done

data4.done :
    hadd data4.root $(DIR)/de2012B_loose2Aug-DATA/2/*.root
    touch data4.done

data5.done :
    hadd data5.root $(DIR)/de2012B_loose2Aug-DATA/3/*.root
    touch data5.done

data6.done :
    hadd data6.root $(DIR)/de2012B_loose2Aug-DATA/4/*.root
    touch data6.done

我想试一下,但你可以重新考虑一下你的设计

DIR=/hdfs/store/user/$(USER)

DATA.root : data[1-6].done
    hadd DATA.root $(^:.done=.root)
    rm $(^:.done=.root)
    rm $^

data1.done data2.done : PATHLEFT=A
data3.done data4.done data5.done data6.done : PATHLEFT=B
data1.done : PATHRIGHT=1
data2.done : PATHRIGHT=2
data3.done : PATHRIGHT=1
data4.done : PATHRIGHT=2
data5.done : PATHRIGHT=3
data6.done : PATHRIGHT=4

data%.done : 
    hadd data1.root $(DIR)/de2012$(PATHLEFT)_loose2Aug-DATA/$(PATHRIGHT)/*.root
    touch $@

(是的,我知道,我可以再挤出两三行,但我不想让它太神秘。)

我会尝试一下,但你可能会重新考虑你的设计

DIR=/hdfs/store/user/$(USER)

DATA.root : data[1-6].done
    hadd DATA.root $(^:.done=.root)
    rm $(^:.done=.root)
    rm $^

data1.done data2.done : PATHLEFT=A
data3.done data4.done data5.done data6.done : PATHLEFT=B
data1.done : PATHRIGHT=1
data2.done : PATHRIGHT=2
data3.done : PATHRIGHT=1
data4.done : PATHRIGHT=2
data5.done : PATHRIGHT=3
data6.done : PATHRIGHT=4

data%.done : 
    hadd data1.root $(DIR)/de2012$(PATHLEFT)_loose2Aug-DATA/$(PATHRIGHT)/*.root
    touch $@

(是的,我知道,我可以再挤出两三行,但我不想让它太神秘。)

那是
数据[1-6]。完成了
伪代码,还是真的有效?你确定要使用那些
数据*。完成了
文件吗?我看不出它们是必要的。
data*.done
文件的目的是确保
hadd
在允许执行依赖规则之前完成
hadd
在文件完成之前生成一个文件,因此
DATA.root
规则将过早运行。这听起来不太正确。如果
hadd
没有生成子进程,那么Make在
hadd
完成之前不会执行
DATA.root
规则。如果是这样,那么
data*.done
不会保存您。这是
data[1-6].done
伪代码,还是真的有效?您确定要使用这些
data*.done
文件吗?我看不出它们是必要的。
data*.done
文件的目的是确保
hadd
在允许执行依赖规则之前完成
hadd
在文件完成之前生成一个文件,因此
DATA.root
规则将过早运行。这听起来不太正确。如果
hadd
没有生成子进程,那么Make在
hadd
完成之前不会执行
DATA.root
规则。如果是这样的话,
data*.done
将不会保存您。