2009-01-02 125 views
14

我正在使用cmake来构建我的项目。对于UNIX,我想从我的项目的根目录输入make,并调用cmake来创建合适的Makefiles(如果它们还不存在),然后构建我的项目。我想隐藏cmake“内部”文件(目标文件,cmake内部Makefiles等)(例如放在.build目录中),这样它就不会混乱我的项目目录。从make调用cmake来创建Makefiles?

我的项目有几个子项目(特别是一个库,一个用户可执行文件和一个单元测试可执行文件)。我想为每个子项目执行cmake(如上所述),并且只构建该子项目(具有依赖关系,因此如果需要,将从可执行文件的Makefiles构建库),我希望Makefiles(即我输入make并发生这种情况) )。生成的二进制文件(.so库或可执行文件)应位于子项目的目录中。

我做了一个Makefile,它可以让主程序稍微好点,虽然它感觉有点ha。。我无法使用它创建特定的目标,因为我的Makefile只需在cmake的构建目录中调用make即可。

请注意,因为库是唯一的依赖项(并且可能不需要手动构建,并且因为我很懒),所以我在我的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 [email protected] 

project-test: ${BUILD_DIR}/Makefile 
    @make -C ${BUILD_DIR} project-test 
    @cp ${BUILD_DIR}/project-test/project-test [email protected] 

${BUILD_DIR}/Makefile: 
    @[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR} 
    @[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && cmake ${CMAKE_OPTS} ..) 

如果有帮助,这是我的项目结构(如果这是“错误的”请告诉我 - 我还在学习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/ 

如果您还没有流行起来还,我基本上正在寻找一种方法来构建项目和子项目,好像cmake不在那里:就好像我的项目只包含Makefiles一样。这可以做到吗?解决方案是优雅还是凌乱?我应该试着去做别的事吗?

谢谢!

回答

8

如果cmake的是生成makefile文件,你可以简单地包括在主生成文件生成的makefile文件,如

# makefile 
all:    # Default 
include $GENERATED 
$GENERATED:$CMAKEFILE 
    # Generate the makefile here` 

所包含的文件生成然后进行重新启动与新的包含文件。包含的文件应详细说明目标等。

您应该能够使用vpath指令更改已使用文件的位置,请参阅。 Gnu make manual,

vpath %.o project/.build 

否则,单调乏味的方法是重写规则,记录必要的目录。

编辑: 也许我们不应该使用一个平坦的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 

如果$(MAKE)这应该工作-f $(GUI-MAKE)的命令行上的所有命令的工作,我们已经在发电目标CMake的隐患。您必须将任何其他目标复制到主makefile,并小心并行运行make。

通过传播对象文件应当包括类似

%.o:$(GUI-MAKE) 
    $(MAKE) -f $(GUI-MAKE) [email protected] 

虽然你可能会得到试图使测试对象

+0

哇错误!我甚至没有想到!但有一个问题:包含Makefile($ GENERATED)需要与项目dir不同的pwd/$ CUR_DIR(它认为它在project/.build中)。有任何解决这个问题的方法吗? – strager 2009-01-02 06:58:16