在Makefile中编译时忽略具有相似名称的文件

时间:2016-05-06 08:58:06

标签: makefile

假设我们有一个目录两个foo和bar。其中foo包含文件example.S,run.c,exec.S和bar包含example.S 当我传递foo和bar作为依赖。 我想通过忽略目录foo中的example.S来在目录栏中仅编译example.S

DEP:= foo bar

DIR:= $(foreach $ dirs,$(DEP),$(shell $(HOME)-find -type d -name $(dirs)))

将为我提供foo和bar目录的绝对路径。

FILES:= $(foreach文件,$(DIR),$(通配符$(文件)/ *)),会为我提供文件列表foo和bar为

foo / example.S foo / run.c foo / exec.S bar / example.S

我想检查多个同名文件的出现。并且只编译最新的,即代替foo / example.S我喜欢编译bar / example.S ...

我不知道怎么做,因为我对创建Makefile非常陌生。

2 个答案:

答案 0 :(得分:0)

这实际上是一个shell问题而不是makefile问题。你要做的是创建一个shell命令,为每个文件生成两个列列表 - 第一列是完整文件名,第二列只是文件名。然后对其进行排序,并删除具有重复文件名的那些,然后仅输出第一列。

基本上你会使用:

- (BOOL)didReceiveVoiceResponse:(NSData *)data
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
        NSLog(@"Dict=%@",dict);
}

您必须将DIRS = ./A ./B files=`find $(DIRS) -type f -exec sh -c 'echo {} $$(basename {})' \; | sort -u --stable -k2,2 | awk '{print $$1}'` 替换为您要搜索的目录的排序列表。请注意./B ./A - 在运行shell之前将这些解析为$$命令。 $只有一个$(DIRS),因此在执行命令之前会展开它。

说明:

$:这会搜索目录find ./B ./A -type f -exec sh -c 'echo {} $(basename {})' \;,然后搜索B(按此顺序)

A仅指定文件 - 它不会返回目录。

type -f:对于找到的每个文件,它将运行echo命令,其中-exec sh -c 'echo {} $(basename {})' \;解析为它找到的文件。因此,它将打印完整的文件路径,然后只打印文件名。

{}:根据第2列(文件名)对文件列表进行排序。 sort -u --stable -k2,2表示唯一,因此如果有匹配的文件,则只打印第一个。 -u表示如果有两条匹配的行,它将始终输出第一行。

--stable:打印输出的第一列(完整路径名)。

然后您有一个唯一文件名列表,包括awk '{print $1}'

中的目录

答案 1 :(得分:0)

有一种(相对)简单的方法来获得你想要的东西,从reversing a list开始(感谢@simona)。按照自己的方式计算DIR后,

reverse = $(if $(1),$(call reverse,$(wordlist 2,$(words $(1)),$(1)))) $(firstword $(1))

DIR := $(call reverse,$(DIR))

然后使用VPATH

VPATH = $(DIR)

现在您可以告诉Make搜索文件(例如example.S),它会找到最后一个实例(在本例中为.../bar/example.S):

example: example.S
    @echo building $@ from $^