先有
autobj = a.o b.o c.o
all_dir =src src/common src/core src/engine
SRC_DIR =src/
OBJ_DIR=obj/
然后有:
$(foreach
file,$(autobj:.o=.cpp),$(foreach dir,$(all_dir),$(subst
$(SRC_DIR),$(OBJ_DIR),$(firstword $(subst .cpp,.o,$(wildcard
$(SRC_DIR)$(dir)/$(file)))))))
解释:
1:foreach file,$(autobj:.o=.cpp)这半句的意思是,从上面autobj里头取每一个.o文件,将后缀改成.c;
2:$(foreach dir,$(all_dir),$(subst $(SRC_DIR),$(OBJ_DIR)这半句意思是,从all_dir把路径取出来,将字符串替换,src/将替换成obj/
3:$(firstword
$(subst .cpp,.o,$(wildcard $(SRC_DIR)$(dir)/$(file)))))))
这半句是利用wildcard从目录下提取这个.cpp文件,如果有就返回.cpp文件带目录的文件名,如果没有就返回空,然后再将返回的文件名.cpp
替换成.o,然后再提供这个这个字符串的第一个字给上一层替换;
最后,这个整个效果是,给定一堆.o文件名,给定一堆的目录,如果在某个目录下具有该.o对应的.cpp文件,则返回这个点.cpp文件的长路径名,这样就可以自动搜索目录,写makefile就去掉了一些繁琐,对于大工程复杂目录,方便很多
阅读(1616) | 评论(0) | 转发(0) |