哪种构建系统最“自然”?

时间:2013-06-18 22:09:04

标签: build makefile cmake build-system

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

每个模块都有一个或多个翻译单元,每个翻译单元都会生成一个.o文件。 最终目标是将所有这些目标文件混合到一个静态库中(暂时)。

我使用简单的'make',它已经足够复杂了 是否有一个系统,与手工编写makefile相比,指定的模型自然而然地或者更少的努力? (如果你打算推荐cmake,我需要一些提示,因为我已经尝试过,但是无法找到一个好的解决方案。)

2 个答案:

答案 0 :(得分:2)

我当前项目的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目录子目录中的目标文件中,该目录位于与其源目录布局相同的层次结构中(如果多个源文件具有相同的内容,则很重要) name)然后将结果链接到可执行文件example

作为奖励,通过MAKEDEPS变量和clang的-MMD标志生成和包含动态依赖关系。

答案 1 :(得分:0)

这实际上取决于您的目的:构建包通常是针对观众而不是表演者。通常,他们会考虑人们部署的不同环境。我玩'tup',这似乎是一种在编辑后尽快生成可执行文件的方法。 'Premake'似乎在多个平台上拍摄,但我发现指定编译器选项不比Cmake更明智。

看起来好像你找到了一个好的Makefile导师,所以我会留下我的意见。