而不是我的代码当前具有的平面结构,我想将它组织成包含在子文件夹中的模块(如果模块足够大,可能还有子文件夹)。
每个模块将有一个或多个翻译单元,每个翻译单元将生成一个 .o 文件。最终目标是将所有这些目标文件混搭到一个静态库中(目前)。
我正在使用普通的“make”,它已经足够复杂了。
与手动编写 makefile 相比,是否有一个系统可以自然生成指定模型或省力得多?(如果您要推荐 cmake,我需要一些提示,因为我已经尝试过但无法提出一个好的解决方案。)
而不是我的代码当前具有的平面结构,我想将它组织成包含在子文件夹中的模块(如果模块足够大,可能还有子文件夹)。
每个模块将有一个或多个翻译单元,每个翻译单元将生成一个 .o 文件。最终目标是将所有这些目标文件混搭到一个静态库中(目前)。
我正在使用普通的“make”,它已经足够复杂了。
与手动编写 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 导师,所以我将把我的观察留在那里。