假设我们有一个目录两个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非常陌生。
答案 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 $^