我正在编写我的第一个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的完成。
答案 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中所示。