Makefile:在同一隐含目标中的两个不同先决条件之间交替

时间:2015-07-29 08:35:45

标签: unix build makefile

我正在编写我的第一个makefile,而且我遇到了问题。

我有许多先决条件,其中第一个是需要处于特殊位置的模板。我这样做是这样的:

pts3d = pts3d.astype('float32')
pts2d = pts2d.astype('float32')

# This can be omitted and can be substituted with None below.
camera_matrix = cv2.initCameraMatrix2D([pts3d],[pts2d]), self.imgsize)  

cv2.calibrateCamera([pts3d], [pts2d], self.imgsize, camera_matrix, None, 
                    flags=cv2.CALIB_USE_INTRINSIC_GUESS)

问题是,有时我需要将该模板切换为另一个模板,同时保留其他先决条件,以便

target : req1 req2 req3
    command $(filter-out $<,$^) $@ --template=$<

我正在寻找一种方法,使用我现在的目标来实现这一目标,而无需编写特定的明确目标,也许可以使用参数或类似的东西调用# Changing just the first prerequisite target : req1b req2 req3 command $(filter-out $<,$^) $@ --template=$< ,但我也知道很少有关于makefile的完成。

1 个答案:

答案 0 :(得分:1)

一般的想法是你会想要使用一个变量,你如何设置该变量取决于你。一种方法是通过命令行传递变量。你的Makefile看起来像:

self.property1('');

然后执行target : $(REQ_ONE) req2 req3 command $(filter-out $<,$^) $@ --template=$< make target REQ_ONE=reg1

如果您希望使用首选默认值(例如make target REQ_ONE=reg1b),并且您希望在极少数情况下使用替代方法,则可以使用上一示例的修改后的形式。

req1

最后,这种方法的一个变体是让你的Makefile调用使用变量赋值:

# only set if the variable doesn't exist
REQ_ONE ?= req1

target : $(REQ_ONE) req2 req3
    command $(filter-out $<,$^) $@ --template=$<

另一种解决方案是使用二次扩展,如SO post on target specific variables as a prerequisites中所示。