针对复杂构建过程的CMake设置建议(包括externalProject)

时间:2013-03-09 06:11:13

标签: cmake

我的应用程序具有相当复杂的构建过程,作为CMake的一个新手,我想知道是否有人可以提供任何指针。

在预设时,应用程序包含一个可执行文件,它是从src中提供的源代码树构建的,包含文件夹。

它需要一些库来工作,最重要的是Boost和Python。 Python嵌入在应用程序中,Boost需要在编译时了解自定义python安装。我也使用Qt,但我只是为此系统Qt链接。

最后我想要的是一个stage文件夹,包含已编译的可执行文件,以及一个包含所需boost和python库的lib文件夹。

目前,我有一个CMakeLists.txt文件,我正在使用ExternalProject从源代码的bzipped tarball构建Boost和Python。我从前缀的安装目录中复制出已编译的库,这有点乱。

事情正在发挥作用,但我有一种感觉,我正在做一些倒退的事情。我有时在嵌套子目录中看到多个CMakeLists,但不知道它们与我的项目有什么关系。那些曾经从事类似范围项目的人是否能够权衡并给我一些指示?

我应该补充一点,我希望在不久的将来将Windows作为一个平台,并且目前正在Linux上运行。

注意:这是我当前的CMakeLists.txt,我意识到未配置boost并且没有完全移动到stage文件夹。我一直在手动这样做,但在我深入挖掘自己之前我想先问一下:)

谢谢!

CmakeList.txt

cmake_minimum_required(VERSION 2.6)

set(CMAKE_BUILD_TYPE Debug)

set(PROJ_NAME "mwave")
project(${PROJ_NAME})

include_directories("include")
include(ExternalProject)

# Add cmake dir to cmake module path so custom find modules will work
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake  ${CMAKE_MODULE_PATH})

#Build Python via External Project
ExternalProject_Add(
    Python
    PREFIX ${CMAKE_CURRENT_BINARY_DIR}/external/python
    URL ${CMAKE_CURRENT_SOURCE_DIR}/extern/Python-3.3.0.tar.bz2
    URL_MD5 2dbff60afed2b5f66adf6f77dac9e139
    UPDATE_COMMAND ""
    CONFIGURE_COMMAND ./configure -q --prefix=${CMAKE_CURRENT_BINARY_DIR}/external/python --enable-shared
    BUILD_COMMAND make
    BUILD_IN_SOURCE 1
    INSTALL_COMMAND make install
)

# Manually copy the compiled python files and dirs to our stage folder
add_custom_command(TARGET Python PRE_BUILD
                    COMMAND ${CMAKE_COMMAND} -E copy_directory
                    ${CMAKE_CURRENT_BINARY_DIR}/external/python/lib/pkgconfig
                    ${CMAKE_CURRENT_BINARY_DIR}/stage/lib/pkgconfig)

add_custom_command(TARGET Python PRE_BUILD
                    COMMAND ${CMAKE_COMMAND} -E copy_directory
                    ${CMAKE_CURRENT_BINARY_DIR}/external/python/lib/python3.3
                    ${CMAKE_CURRENT_BINARY_DIR}/stage/lib/python3.3)

add_custom_command(TARGET Python PRE_BUILD
                    COMMAND ${CMAKE_COMMAND} -E copy
                    ${CMAKE_CURRENT_BINARY_DIR}/external/python/lib/libpython3.so
                    ${CMAKE_CURRENT_BINARY_DIR}/stage/lib/libpython3.so)

add_custom_command(TARGET Python PRE_BUILD
                    COMMAND ${CMAKE_COMMAND} -E copy
                    ${CMAKE_CURRENT_BINARY_DIR}/external/python/lib/libpython3.3m.so.1.0
                    ${CMAKE_CURRENT_BINARY_DIR}/stage/lib/libpython3.3m.so.1.0)

add_custom_command(TARGET Python PRE_BUILD
                    COMMAND ${CMAKE_COMMAND} -E create_symlink
                    libpython3.3m.so.1.0
                    ${CMAKE_CURRENT_BINARY_DIR}/stage/lib/libpython3.3m.so)



#Python 
set(PYTHON_INCLUDE_DIRS "${CMAKE_CURRENT_BINARY_DIR}/external/python/include/python3.3m")
set(PYTHON_LIBRARIES "${CMAKE_CURRENT_BINARY_DIR}/external/python/lib/libpython3.3m.so" "pthread" "m" "util" "readline")


#Build boost via External Project
ExternalProject_Add(
    Boost
    DEPENDS Python
    PREFIX ${CMAKE_CURRENT_BINARY_DIR}/external/boost
    URL ${CMAKE_CURRENT_SOURCE_DIR}/extern/boost_1_51_0_mwave.tar.bz2
    URL_MD5 fe203a243e451b4dd4754c7b283b1db9
    UPDATE_COMMAND ./bootstrap.sh --with-libraries=python,system,thread,program_options
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ./b2
    BUILD_IN_SOURCE 1
    INSTALL_COMMAND ""
)
#Boost (workaround until external project is working)
set(Boost_INCLUDE_DIRS "/opt/mwave/include")
set(Boost_LIBRARIES "/opt/mwave/lib/libboost_python3.so" "/opt/mwave/lib/libboost_program_options.so")


#OpenImageIO
set(OIIO_PATH "/opt/mwave/oiio/dist/linux64.debug")
find_package(OIIO REQUIRED)

#Qt4
find_package(Qt4 REQUIRED)
set(QT_USE_QTOPENGL TRUE)
include(${QT_USE_FILE})
add_definitions(${QT_DEFINITIONS})

#OpenGL
find_package(OpenGL REQUIRED)

find_package(GLEW REQUIRED)

# Mwave app
set(HEADERS
        "include/Application.h"
        "include/ImageChannel.h"
        "include/CompDag.h"
        "include/Dag.h"
        "include/Gui/DagView.h"
        "include/Gui/DagScene.h"
        "include/Gui/MainWindow.h"
        "include/Gui/GLViewer.h"
        "include/Gui/Nodes/GNodeEdge.h"
        "include/Gui/Nodes/GNodeLabel.h"
        "include/Gui/Nodes/GNodeCacheStatus.h"
        "include/Gui/Nodes/GNode.h"
        "include/Gui/Nodes/GRead.h"
        "include/Gui/Nodes/GViewer.h"
        "include/MwaveException.h"
        "include/Nodes/Node.h"
        "include/Nodes/Read.h"
        "include/Nodes/Viewer.h"
        "include/mwave.h"
        "include/main.h"
        "include/shaders.h"
)

set(QOBJECT_HEADERS
        "include/Gui/QCompDag.h"
        "include/Gui/QPythonEditor.h"
        "include/Gui/ViewerWidget.h"
)

set(SOURCES
        "src/Application.cpp"
        "src/CompDag.cpp"
        "src/main.cpp"
        "src/mwave.cpp"
        "src/Dag.cpp"
        "src/Gui/DagView.cpp"
        "src/Gui/DagScene.cpp"
        "src/Gui/MainWindow.cpp"
        "src/Gui/QPythonEditor.cpp"
        "src/Gui/GLViewer.cpp"
        "src/Gui/ViewerWidget.cpp"
        "src/Gui/Nodes/GNode.cpp"
        "src/Gui/Nodes/GNodeEdge.cpp"
        "src/Gui/QCompDag.cpp"
        "src/Nodes/Node.cpp"
        "src/Nodes/Read.cpp"
        "src/Nodes/Viewer.cpp"
)

QT4_WRAP_CPP(HEADERS_MOC ${QOBJECT_HEADERS})

## Compiler flags
if(CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "-O2")        ## Optimize
    set(CMAKE_CXX_FLAGS "-O3")        ## Optimize More
endif()

include_directories(${PYTHON_INCLUDE_DIRS}
                    ${Boost_INCLUDE_DIRS}
                    ${GLEW_INCLUDE_PATH}
                    ${OPENGL_INCLUDE_DIR}
                    ${OIIO_INCLUDE_DIR}
)

add_executable(mwave WIN32 ${HEADERS} ${HEADERS_MOC} ${SOURCES})
set_target_properties(mwave PROPERTIES OUTPUT_NAME mwave.bin)

target_link_libraries(  mwave
                        ${PYTHON_LIBRARIES}
                        ${Boost_LIBRARIES}
                        ${OIIO_LIBRARIES}
                        ${GLEW_LIBRARY}
                        ${OPENGL_LIBRARIES}
                        ${QT_LIBRARIES})

1 个答案:

答案 0 :(得分:0)

您正在使用的

cmake 2.6不支持ExternalProjects。

cmake 2.8系列支持ExternalProjects。请转到cmake 2.8。

以下链接澄清了

http://www.cmake.org/pipermail/cmake/2011-June/044993.html