Makefile来自不同目录的几个二进制文件和库

时间:2015-12-25 15:18:43

标签: c++ c makefile gnu-make

有一个项目布局:

.
├── 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.solibt1.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

0 个答案:

没有答案