我正在处理一些文件,并希望在某一点创建两个类别,具体取决于文件名,以便我可以比较两者。这是否可以在makefile中使用?
%.output1: %.input
ifneq (,$(findstring filename1,$(echo $<)))
mv $<.output1 $@
endif
%.output2: %.input
ifneq (,$(findstring filename2,$(echo $<)))
mv $<.output2 $@
endif
%.output_final: %.output1 %.output2
do_something
我认为此代码存在两个问题:
答案 0 :(得分:0)
你有tab缩进ifneq
行,所以make不认为它是一个make指令,并且正在考虑将它作为shell命令并试图将它传递给shell来执行(因此你删除了shell错误)你最近的编辑。)
在该行上使用空格(或没有缩进)以使其正确处理。据说这样做你不能在比较中使用$<
,因为它不会在那时设置。
$(echo)
也不是make函数。你有混合/混淆的处理时间。您无法以这种方式组合make和shell操作。 (并不是说你需要echo
开始。)
如果你想在shell时间进行比较,那么不要使用make构造,而是使用shell构造:
%.output1: %.input
if [ filename1 = '$<' ]; then
mv $<.output1 $@
fi
虽然这也是不正确的,因为$<
为%.input
而$@
为%.output1
,因为任何词干与%
匹配。这个规则应该看起来更像这样(虽然我很难理解你甚至试图让这条规则做到这一点,所以我可能错了)。
%.output1: %.input
# If the stem that matched the '%' is equal to 'filename1'
if [ filename1 = '$*' ]; then
# Then copy the prerequisite/input file to the output file name.
cp $< $@
fi
我不确定我理解你的第二个问题。单个规则中的%
将始终匹配相同的内容,但在规则之间可能会有所不同。
此%.output_final: %.output1 %.output2
目标会将目标文件foo.output_final
映射到先决条件文件foo.output1
和foo.output2
。但是也会将任何其他*.output_final
文件映射到适当匹配的必备文件。