2011-08-16 13 views
3

好吧即时通讯使用CMake在Linux下为ARM目标构建C++。我有一个名为DEBUG的.h文件中有一个#DEFINE。如果设置,我想为串行跟踪的各种方法将被添加到构建。我希望能够做到这一点,例如, “make debug”用这个#DEFINE集合构建,并且在没有设置的情况下具有正常的“make”构建。这可能吗?CMAKE - Debug/Crossbuild?

此外,它可以指定一个目标CMake?因为我现在有两个CMakeLists.txt,一个用于x86,另一个用于Armel(与ARM相比,不同的选项比如用x86上的调试信息构建,而ARM需要一个剥离的,尺寸优化的二进制文件)。

+2

标准礼仪项目文件每个帖子只能提出一个问题:http://meta.stackexchange.com/questions/39223/one-post-with-multiple-questions-or-multiple-posts,这样更直接地将答案标记为“接受” –

回答

1

关于定义,你可以做你想做的像这样在你的CMakeLists.txt文件:

if(CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]") 
    message("INFO: DEBUG BUILD") 
    # for debug type builds, turn on verbose makefiles 
    SET(CMAKE_VERBOSE_MAKEFILE ON) 

    # Tell other CMake files that we're doing a debug build 
    SET(DEBUG_BUILD 1) 

    # Tell C/C++ that we're doing a debug build 
    ADD_DEFINITIONS(-DDEBUG) 
endif() 

if(CMAKE_BUILD_TYPE MATCHES "[Rr][Ee][Ll][Ee][Aa][Ss][Ee]") 
    message("INFO: RELEASE BUILD") 
endif() 

CMake的不喜欢支持两个目标,换句话说2个工具链,在同构建树。无论如何,这真的没有必要。对于每个可能的目标,绝对使用一个构建树的树外构建。类似这样的:

cd /path/to/x86_build 
cmake /path/to/src/x86/CMakeLists.txt 
cd /path/to/Armel_build 
cmake /path/to/src/Armel/CMakeLists.txt 
1

CMake支持调试和发布版本。

说你的项目顶层的CMakeLists.txt在〜/项目/ foobar的,您可以创建单独的调试和发布版本通过这样做:

mkdir ~/project/build 

mkdir ~/project/build/foobar-debug 
cd ~/project/build/foobar-debug 
cmake -DCMAKE_BUILD_TYPE:STRING=Debug ~/project/foobar 

mkdir ~/project/build/foobar-rel 
cd ~/project/build/foobar-rel 
cmake -DCMAKE_BUILD_TYPE:STRING=Release ~/project/foobar 

有什么更好的是,CMake的不支持只是您可能习惯的标准调试/发布目标,但它支持最小的发行版,以及通过调试信息发布。请参阅CMAKE_BUILD_TYPE的其他选项: http://cmake.org/Wiki/CMake_Useful_Variables

+0

不完全wha t我在之后,但是知道的很好 –

2

看来您有两个问题。一个关于调试,你可以使用CMAKE_BUILD_TYPE分开您的调试/发布设置,并使用$ cmake --build . --config Release$ cmake --build . --config Debug进行编译。

对于第二个,关于交叉构建,这是可能的。你可以做这样的:面向ARM和x86

  1. 根据this guide写配置文件分别设置编译器,归档等。假设86名的一个为* config_x86.cmake *和* config_arm.cmake *为胳膊。
  2. 定义一个cmake宏,比如* MY_TARGET *。而项目命令之前添加以下代码,

    if (${MY_TARGET} STREQUAL "x86") 
        include(config_x86.cmake REQUIRED) 
    elseif (${MY_TARGET} STREQUAL "arm") 
        include(config_arm.cmake REQUIRED) 
    endif() 
    
  3. 然后产生这样

    $ cmake的-DMY_TARGET = 86 “代码目录”

+0

我使用了这个,并且我在头文件中使用了例如#define的值。 CONFIGURE_FILE($ {CMAKE_SOURCE_DIR} /src/flags.h.cmake $ {CMAKE_SOURCE_DIR} /src/flags.h) –