用文件名分隔make中的输出

时间:2015-05-14 10:26:36

标签: bash makefile

我正在处理一些文件,并希望在某一点创建两个类别,具体取决于文件名,以便我可以比较两者。这是否可以在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

我认为此代码存在两个问题:

  1. ifneq系列中有错误。
  2. %。output1%.output2将始终使用相同的文件名 - 可能无法在&#39; make&#39;中执行此操作。这可能需要褶皱。

1 个答案:

答案 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.output1foo.output2。但是也会将任何其他*.output_final文件映射到适当匹配的必备文件。