哪个构建系统最"自然"地做到这一点?



我想将代码组织成包含在子文件夹中的模块,而不是当前的平面结构(如果模块足够大,可能还会组织成子文件夹)。

每个模块将有一个或多个翻译单元,每个单元将产生一个。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导师,所以我将留下我的观察

相关内容

  • 没有找到相关文章

最新更新