我想将代码组织成包含在子文件夹中的模块,而不是当前的平面结构(如果模块足够大,可能还会组织成子文件夹)。
每个模块将有一个或多个翻译单元,每个单元将产生一个。o文件。最终的目标是将所有这些对象文件整合到一个静态库中(目前是这样)。
我用的是简单的"make",它已经足够复杂了。
与手工编写makefile相比,是否存在一种系统,其中指定的模型是自然产生的,或者比手工编写makefile更省力?(如果你要推荐cmake,我需要一些提示,因为我已经尝试过了,无法提出一个好的解决方案。)
从我当前项目的makefile中摘录的一些内容,可能会帮助您使用老式的GNU make:
SOURCEDIR := dir1 dir2/subdir1 dir3 dir4 dir5/subdir1 dir6/subdir1
SOURCES := $(foreach srcdir,$(SOURCEDIR),$(wildcard $(srcdir)/*.c))
OBJECTS := $(patsubst %.c,build/%.o,$(SOURCES))
OBJDIRS := $(addprefix build/,$(SOURCEDIR))
MAKEDEPS := $(patsubst %.c,build/%.d,$(SOURCES))
all: example
$(OBJDIRS):
-mkdir -p $@
build: $(OBJDIRS)
build/%.o : %.c | build
cc -MMD -c -o $@ $<
example: $(OBJECTS)
cc -o $@ $(OBJECTS)
-include $(MAKEDEPS)
本质上,它将在指定目录中找到的所有源文件构建为位于build
目录的子目录中的目标文件,其层次结构与其源目录布局平行(如果多个源文件具有相同的名称,这一点很重要),然后将结果链接到可执行的example
。
作为奖励,动态依赖生成和包含通过MAKEDEPS
变量和clang的-MMD
标志。
这实际上取决于您的目的:构建包通常是为观众而不是执行者准备的。通常,他们会考虑人们部署到的不同环境。我尝试了一下tup,它似乎更像是在编辑后尽快生成可执行文件的一种方式。"Premake"似乎针对多个平台,但我发现指定编译器选项并不比使用Cmake更开明。
看起来好像你已经找到了一个很好的Makefile导师,所以我将留下我的观察