Build 哪个构建系统最能做到这一点';自然地';?

Build 哪个构建系统最能做到这一点';自然地';?,build,makefile,cmake,build-system,Build,Makefile,Cmake,Build System,我希望将代码组织到包含在子文件夹中的模块中(如果模块足够大,可能还有子文件夹),而不是当前的扁平结构 每个模块将有一个或多个翻译单元,每个翻译单元将生成一个.o文件。 最终的目标是将所有这些对象文件混搭到一个静态库中(目前) 我使用的是简单的“make”,它已经够复杂了。 是否有一个系统,其中指定的模型是自然生成的,或者与手工编写makefiles相比工作量要小得多? (如果你打算推荐cmake,我需要一些提示,因为我已经尝试过了,但没有找到一个好的解决方案。)我当前项目的makefile中的一

我希望将代码组织到包含在子文件夹中的模块中(如果模块足够大,可能还有子文件夹),而不是当前的扁平结构

每个模块将有一个或多个翻译单元,每个翻译单元将生成一个.o文件。 最终的目标是将所有这些对象文件混搭到一个静态库中(目前)

我使用的是简单的“make”,它已经够复杂了。
是否有一个系统,其中指定的模型是自然生成的,或者与手工编写makefiles相比工作量要小得多?
(如果你打算推荐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)
SOURCEDIR:=dir1 dir2/subdir1 dir3 dir4 dir5/subdir1 dir6/subdir1
来源:=$(foreach srcdir,$(SOURCEDIR),$(通配符$(srcdir)/*.c))
对象:=$(patsubst%.c,build/%.o,$(源代码))
OBJDIRS:=$(addprefix build/,$(SOURCEDIR))
MAKEDEPS:=$(patsubst%.c,build/%.d,$(源代码))
所有人:举例
美元(OBJDIRS):
-mkdir-p$@
生成:$(OBJDIRS)
构建/%.o:%.c |构建
cc-MMD-c-o$@$<
示例:$(对象)
cc-o$@$(对象)
-包括$(MAKEDEPS)
本质上,它将在指定目录中找到的所有源文件构建到位于
build
目录子目录中的目标文件中,其层次结构与其源目录布局平行(如果多个源文件具有相同的名称,则这一点很重要)然后将结果链接到一个可执行的
示例


另外,还可以通过
MAKEDEPS
变量和clang的
-MMD
标志动态生成和包含依赖项。

这实际上取决于您的目的:构建包通常是针对观众而不是执行者的。通常,他们会考虑人们部署到的不同环境。我玩过“tup”,这似乎更像是一种在编辑后尽快生成可执行文件的方法“Premake”似乎适用于多种平台,但我发现指定编译器选项并不比使用Cmake更具启发性


看来你已经找到了一个很好的Makefile导师,所以我就把我的观察结果留在这里。

make的问题是什么?很麻烦,而且我认为我的无知。我找不到一个简单的方法来使用make.Ok来实现这一点。如果你需要更多的解释,请告诉我。我相信有人谁知道更多关于cmake或某事最终会回答。谢谢。这个通配符正是我遇到的问题。我最终(如果需要的话)必须修改它以在文件夹中使用递归makefiles,但这不应该造成太大的问题。递归makefiles有它们自己的痛苦,但这取决于项目的大小。