有一个项目布局:
.
├── bin # <= executables go here
├── build # <= object files created here
├── lib # <= libraries go here
├── Makefile
├── src
│ ├── bin1 # <= if there is no "lib" prefix
│ ├── bin2 # <= it must be considered as executable
│ │ ├── a.c
│ │ ├── b.c
│ │ └── foo.h
│ ├── include # <= shared .h files, nothing to build here
│ ├── libt1 # <= if there is "lib" prefix - it must be
│ │ ├── blah.c # a library
│ │ └── blah.h
│ └── libt2
└── test
所以我希望gnu make通过&#34; lib&#34;浏览src中的每个目录。前缀并构建一个与目录同名的静态和共享库,即libt1.so
和libt1.a
,并将它们全部放在lib
目录中。让我们假设图书馆之间没有相互联系,所以不要相互依赖。
构建lib之后,它必须遍历除include
之外的每个目录,然后bin一个与目录同名的可执行文件,并将其放入bin
目录。 build
目录用于临时目标文件。
使用gnu make执行此操作的最佳方法是什么?我希望尽可能依赖隐含的规则。
所以现在我只是将所有目录收集到变量中:
LIBS_TO_BUILD=$(wildcard $(SOURCES_DIR)/lib*)
BINS_TO_BUILD=$(filter-out $(INCLUDE_DIR) $(LIBS_TO_BUILD),\
$(wildcard $(SOURCES_DIR)/*))
但我无法弄清楚如何做所有其他步骤,我应该如何迭代所有dirs?假设,如果我这样做,那就用手#34;它看起来像:
lib/libt1.a:
$(CC) -o build/libt1.o $(CFLAGS) -c $(wildcard $(SOURCES_DIR)/libt1/*.c)
ar rcs lib/libt1.a build/libt1.o