如何写一个makefile 文件 枚举其子目录下所有makefile 文件并且make 他们 make 的时候可以指定参数

时间:2022-10-25 12:49:40
如何写一个makefile 文件 枚举其子目录下所有makefile 文件并且make 他们 make 的时候可以指定参数

15 个解决方案

#1


dirs := $(shell dir /b /a:d)
subs:
   $(foreach N,$(dirs),make -C $(N) &)
这个是我在windows下面的

#2


例如主目录中有子目录1,子目录2,子目录3等等,子目录下分别有其自己的makefile(submakefile1等),主目录中建立makefile,内容如下:
test:
cd ./subdir1 && $(MAKE) -f submakefile1
cd ./subdir2 && $(MAKE) -f submakefile2
cd ./subdir3 && $(MAKE) -f submakefile3
    ...

主目录中直接make即可

#3


楼上的你那是一个一个写,如何make 枚举执行呢?

#4


引用 3 楼 aaadddzxc 的回复:
楼上的你那是一个一个写,如何make 枚举执行呢?

find . -name "makefile" -o -name "Makefile"
这句话就找到了所有的Makfile,,然后看看语法怎么写了.

#5



files := $(shell find . -name "makefile" -o -name "Makefile")
#dirs := $(dir $(files))

.PHONY: all
all: 
for i in $(files); do make -C `dirname $$i`; done


貌似满足你的要求,你自己根据需要修改下..自己写Makefile机会真不多,

#6


参数应该都在各个Makefile中写好了呀,
或者单用建立一个目录config/Makefile
这个文件里面都是些设置参数的,CXXFLAGS,CFLAGS等等.

然后其余的Makefile都include $(PROJECT_DIR)/config/Makefile,...参数就统一到一个文件中设置了.
http://blog.sina.com.cn/s/blog_6cc850810100r8fr.html
没实践过,你自己试吧

注意,上面的例子没考虑子目录的make顺序.. 考虑make顺序,就得人为指定了.

#7


是的,参数我已经写好了,我只是想掉用我下级MAKEFILE的参数而已,比如我RELEASE参数可以指定带不带调试编译

do make -C `dirname $$i`; done  这句话是什么意思?

RELEASE = 0
MAKEFILES := $(shell find . -name "makefile" -o -name "Makefile")

all:$(MAKEFILES)
for i in $(files); do make $(RELEASE) `dirname $$i`; done

执行不成功哦呢。。。

#8


引用 7 楼 aaadddzxc 的回复:
是的,参数我已经写好了,我只是想掉用我下级MAKEFILE的参数而已,比如我RELEASE参数可以指定带不带调试编译

do make -C `dirname $$i`; done  这句话是什么意思?

RELEASE = 0
MAKEFILES := $(shell find . -name "makefile" -o -name "Makefile")
……


make -C `dirname $$i`

上面是个for循环,就对所有的Makefiles执行,然后make -C Makefile所在目录.. 

加参数的情况不知道,
我上面的例子,我自己测试过没问题.

#9


efile:22: 警告:忽略关于目标“all”的旧命令
Makefile:26: 警告:覆盖关于目标“tinystr.o”的命令
./Makefile:26: 警告:忽略关于目标“tinystr.o”的旧命令
Makefile:28: 警告:覆盖关于目标“tinyxml.o”的命令
./Makefile:28: 警告:忽略关于目标“tinyxml.o”的旧命令
Makefile:30: 警告:覆盖关于目标“tinyxmlerror.o”的命令
./Makefile:30: 警告:忽略关于目标“tinyxmlerror.o”的旧命令
Makefile:32: 警告:覆盖关于目标“tinyxmlparser.o”的命令
./Makefile:32: 警告:忽略关于目标“tinyxmlparser.o”的旧命令
Makefile:34: 警告:覆盖关于目标“XML_Parse.o”的命令
./Makefile:34: 警告:忽略关于目标“XML_Parse.o”的旧命令



谈一堆这些出来 什么意思?

#10


不知道了,,

#11


引用 9 楼 aaadddzxc 的回复:
efile:22: 警告:忽略关于目标“all”的旧命令
Makefile:26: 警告:覆盖关于目标“tinystr.o”的命令
./Makefile:26: 警告:忽略关于目标“tinystr.o”的旧命令
Makefile:28: 警告:覆盖关于目标“tinyxml.o”的命令
./Makefile:28: 警告:忽略关于目标“tinyxml.o”的旧命令
……


你看看是不是和子目录执行make时的顺序有关,,即子目录中的project是否有相互依赖关系。

#12


这个项目没有。这个项目是用TINYXML来弄的,代码都包含了
我单独make编译没问题,用你提供的脚本全部编译的花所有都弹出这个警告!

#13


搞不定啊搞不定啊  2楼的还是提示那个警告

RELEASE = 0

NETCORE_PATH = cd ./NetEngine_Core/NetEngine_Core
DATABASE_PATH = cd ./NetEngine_Core/NetEngine_DataBase
MAKEFILES = $(MAKE_DATABASE) $(MAKE_NETCORE)

.PHONY:MakeAll
MakeAll:
$(MAKEFILES)

MAKE_NETCORE = $(NETCORE_PATH) && make -f Makefile $(RELEASE)
MAKE_DATABASE = $(DATABASE_PATH) && make -f Makefile $(RELEASE)

#14


你就把makefile写成下面这样,试一下能编过不;如果能,再加其他的makefile;如果不能,呃,那真不了解了。。
RELEASE=0
test:
    cd ./NetEngine_Core/NetEngine_Core && $(MAKE) -f Makefile $(RELEASE)

#15


不行 还是那个问题!

#1


dirs := $(shell dir /b /a:d)
subs:
   $(foreach N,$(dirs),make -C $(N) &)
这个是我在windows下面的

#2


例如主目录中有子目录1,子目录2,子目录3等等,子目录下分别有其自己的makefile(submakefile1等),主目录中建立makefile,内容如下:
test:
cd ./subdir1 && $(MAKE) -f submakefile1
cd ./subdir2 && $(MAKE) -f submakefile2
cd ./subdir3 && $(MAKE) -f submakefile3
    ...

主目录中直接make即可

#3


楼上的你那是一个一个写,如何make 枚举执行呢?

#4


引用 3 楼 aaadddzxc 的回复:
楼上的你那是一个一个写,如何make 枚举执行呢?

find . -name "makefile" -o -name "Makefile"
这句话就找到了所有的Makfile,,然后看看语法怎么写了.

#5



files := $(shell find . -name "makefile" -o -name "Makefile")
#dirs := $(dir $(files))

.PHONY: all
all: 
for i in $(files); do make -C `dirname $$i`; done


貌似满足你的要求,你自己根据需要修改下..自己写Makefile机会真不多,

#6


参数应该都在各个Makefile中写好了呀,
或者单用建立一个目录config/Makefile
这个文件里面都是些设置参数的,CXXFLAGS,CFLAGS等等.

然后其余的Makefile都include $(PROJECT_DIR)/config/Makefile,...参数就统一到一个文件中设置了.
http://blog.sina.com.cn/s/blog_6cc850810100r8fr.html
没实践过,你自己试吧

注意,上面的例子没考虑子目录的make顺序.. 考虑make顺序,就得人为指定了.

#7


是的,参数我已经写好了,我只是想掉用我下级MAKEFILE的参数而已,比如我RELEASE参数可以指定带不带调试编译

do make -C `dirname $$i`; done  这句话是什么意思?

RELEASE = 0
MAKEFILES := $(shell find . -name "makefile" -o -name "Makefile")

all:$(MAKEFILES)
for i in $(files); do make $(RELEASE) `dirname $$i`; done

执行不成功哦呢。。。

#8


引用 7 楼 aaadddzxc 的回复:
是的,参数我已经写好了,我只是想掉用我下级MAKEFILE的参数而已,比如我RELEASE参数可以指定带不带调试编译

do make -C `dirname $$i`; done  这句话是什么意思?

RELEASE = 0
MAKEFILES := $(shell find . -name "makefile" -o -name "Makefile")
……


make -C `dirname $$i`

上面是个for循环,就对所有的Makefiles执行,然后make -C Makefile所在目录.. 

加参数的情况不知道,
我上面的例子,我自己测试过没问题.

#9


efile:22: 警告:忽略关于目标“all”的旧命令
Makefile:26: 警告:覆盖关于目标“tinystr.o”的命令
./Makefile:26: 警告:忽略关于目标“tinystr.o”的旧命令
Makefile:28: 警告:覆盖关于目标“tinyxml.o”的命令
./Makefile:28: 警告:忽略关于目标“tinyxml.o”的旧命令
Makefile:30: 警告:覆盖关于目标“tinyxmlerror.o”的命令
./Makefile:30: 警告:忽略关于目标“tinyxmlerror.o”的旧命令
Makefile:32: 警告:覆盖关于目标“tinyxmlparser.o”的命令
./Makefile:32: 警告:忽略关于目标“tinyxmlparser.o”的旧命令
Makefile:34: 警告:覆盖关于目标“XML_Parse.o”的命令
./Makefile:34: 警告:忽略关于目标“XML_Parse.o”的旧命令



谈一堆这些出来 什么意思?

#10


不知道了,,

#11


引用 9 楼 aaadddzxc 的回复:
efile:22: 警告:忽略关于目标“all”的旧命令
Makefile:26: 警告:覆盖关于目标“tinystr.o”的命令
./Makefile:26: 警告:忽略关于目标“tinystr.o”的旧命令
Makefile:28: 警告:覆盖关于目标“tinyxml.o”的命令
./Makefile:28: 警告:忽略关于目标“tinyxml.o”的旧命令
……


你看看是不是和子目录执行make时的顺序有关,,即子目录中的project是否有相互依赖关系。

#12


这个项目没有。这个项目是用TINYXML来弄的,代码都包含了
我单独make编译没问题,用你提供的脚本全部编译的花所有都弹出这个警告!

#13


搞不定啊搞不定啊  2楼的还是提示那个警告

RELEASE = 0

NETCORE_PATH = cd ./NetEngine_Core/NetEngine_Core
DATABASE_PATH = cd ./NetEngine_Core/NetEngine_DataBase
MAKEFILES = $(MAKE_DATABASE) $(MAKE_NETCORE)

.PHONY:MakeAll
MakeAll:
$(MAKEFILES)

MAKE_NETCORE = $(NETCORE_PATH) && make -f Makefile $(RELEASE)
MAKE_DATABASE = $(DATABASE_PATH) && make -f Makefile $(RELEASE)

#14


你就把makefile写成下面这样,试一下能编过不;如果能,再加其他的makefile;如果不能,呃,那真不了解了。。
RELEASE=0
test:
    cd ./NetEngine_Core/NetEngine_Core && $(MAKE) -f Makefile $(RELEASE)

#15


不行 还是那个问题!