str*_*ger 16 build-automation build-process makefile cmake
我正在cmake用来构建我的项目.对于UNIX,我想make从我的项目的根目录中键入,并cmake调用以创建正确的Makefile(如果它们还不存在),然后构建我的项目.我希望隐藏cmake"内部"文件(目标文件,cmake内部Makefile等)(例如放在.build目录中),这样它就不会混乱我的项目目录.
我的项目有几个子项目(特别是库,用户可执行文件和单元测试可执行文件).我希望Makefiles(即我输入make并且这种情况发生)为每个子项目执行cmake(如上所述)并仅构建该子项目(具有依赖性,因此如果需要,将从可执行文件的Makefile构建库).生成的二进制文件(.so库或可执行文件)应位于子项目的目录中.
我做了一个Makefile,主要项目有点好,虽然感觉有点hackish.我无法使用它构建特定目标,因为我的Makefile只是调用make了cmake构建目录.
请注意,因为库是唯一的依赖项(可能不需要手动构建,因为我很懒)我在Makefile中省略了它.
BUILD_DIR := .build
.PHONY: all clean project-gui ${BUILD_DIR}/Makefile
all: project-gui project-test
clean:
@([ -d ${BUILD_DIR} ] && make -C ${BUILD_DIR} clean && rm -r ${BUILD_DIR}) || echo Nothing to clean
project-gui: ${BUILD_DIR}/Makefile
@make -C ${BUILD_DIR} project-gui
@cp ${BUILD_DIR}/project-gui/project-gui $@
project-test: ${BUILD_DIR}/Makefile
@make -C ${BUILD_DIR} project-test
@cp ${BUILD_DIR}/project-test/project-test $@
${BUILD_DIR}/Makefile:
@[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}
@[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && cmake ${CMAKE_OPTS} ..)
Run Code Online (Sandbox Code Playgroud)
如果它有帮助,这是我的项目结构(如果这是"错误的"请告诉我 - 我还在学习cmake):
project/
project/CMakeLists.txt
project/common.cmake
project/Makefile -- see Makefile above for this; should be replaced with something better, building libproject, project-gui, and project-test
project/libproject/
project/libproject/CMakeLists.txt
project/libproject/libproject.so -- after build
project/libproject/Makefile -- doesn't exist yet; should build libproject only
project/libproject/source/
project/libproject/include/
project/project-gui/
project/project-gui/CMakeLists.txt
project/project-gui/Makefile -- doesn't exist yet; should build libproject then project-gui
project/project-gui/source/
project/project-gui/include/
project/project-test/
project/project-test/CMakeLists.txt
project/project-test/Makefile -- doesn't exist yet; should build libproject then project-test
project/project-test/source/
project/project-test/include/
Run Code Online (Sandbox Code Playgroud)
如果你还没有流行,我基本上都在寻找一种方法来构建项目和子项目,好像cmake不在那里:好像我的项目只包含Makefile.可以这样做吗?解决方案优雅还是凌乱?我应该尝试做别的事吗?
谢谢!
如果cmake正在生成makefile,你可以简单地在master makefile中包含生成的makefile,例如
# makefile
all: # Default
include $GENERATED
$GENERATED:$CMAKEFILE
# Generate the makefile here`
Run Code Online (Sandbox Code Playgroud)
生成包含的文件,然后使用新包含的文件重新启动make.包含的文件应详细说明目标等.
您应该能够使用vpath指令更改已使用文件的位置,请参阅例如Gnu make manual,
vpath %.o project/.build
Run Code Online (Sandbox Code Playgroud)
否则,繁琐的方法是重写规则,记下必要的目录.
艾德:也许我们不应该使用平面的makefile.
尝试类似的东西:
# makefile
all: gui test
clean:
$(MAKE) -f $(GUI-MAKE) clean
$(MAKE) -f $(TEST-MAKE) clean
gui:$(GUI-MAKE)
$(MAKE) -f $(GUI-MAKE) all
$(GUI-MAKE):$(GUI-CMAKE)
# Generate
# Same for test
Run Code Online (Sandbox Code Playgroud)
如果$(MAKE)-f $(GUI-MAKE)all命令在命令行上运行,这应该有效,并且我们在生成目标中隐藏了cmake.您还必须将任何其他目标复制到主makefile,并注意并行运行make.
通过传播目标文件应该包含类似的内容
%.o:$(GUI-MAKE)
$(MAKE) -f $(GUI-MAKE) $@
Run Code Online (Sandbox Code Playgroud)
虽然你可能会在尝试制作测试对象时遇到错误