3

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

在预设情况下,该应用程序由一个可执行文件组成,该可执行文件由 src 中提供的源代码树构建并包含文件夹。

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

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

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

事情正在发挥作用,但我有一种感觉,我在做事情非常倒退。我有时会在嵌套的子目录中看到多个 CMakeList,但不知道它们与我的项目有何关系。任何从事过类似范围项目的人都能够权衡并给我一些建议吗?

我应该补充一点,我希望在不久的将来将 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})
4

1 回答 1

0

您正在使用的 cmake 2.6 不支持 ExternalProjects。

cmake 2.8 系列支持 ExternalProjects。请移至 cmake 2.8。

下面的链接澄清了

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

于 2015-03-26T08:29:04.367 回答