为子目录中的文件制定规则,并将工作目录设置为此子目录

时间:2013-04-07 23:32:48

标签: makefile

我在子目录中有一些源文件:

$ ls subdir
foo.x bar.x other_file

现在我想创建一个像

这样的规则
subdir/%.y: subdir/%.x
        cmd $< -a option -o $@

只需将cmd工作目录设置为subdir

我想要一些如果需要subdir/bar.y则会生成类似

的内容
cd subdir && cmd bar.x -a option -o bar.y

是否有一种说法$<$@但没有前导subdir/的方法?

3 个答案:

答案 0 :(得分:2)

如果您使用的是GNU make,则可以使用$(notdir $<)$(notdir $@)来获取没有目录的文件名。您可以使用$(dir $@)获取目录部分:

subdir/%.y: subdir/%.x
        cd $(dir $@) && cmd $(notdir $<) -a option -o $(notdir $@)

或硬编码子目录,如果您愿意。

答案 1 :(得分:2)

您可以分别使用FD后缀作为文件和目录部分。

subdir/%.y: subdir/%.x
    cd $(@D) && cmd $(<F) -a option -o $(@F)

有关详细信息,请参阅manual

答案 2 :(得分:0)

使用$(patsubst)怎么样?

subdir/%.y: subdir/%.x
        cd subdir && cmd $(patsubst subdir/%,%,$<) -a option -o $(patsubst subdir/%,%,$@)

或者,相当但更简单:

subdir/%.y: subdir/%.x
        cd subdir && cmd $(<:subdir/%=%) -a option -o $(@:subdir/%=%)