在cmake中使用configure和make

/*******************************************************************
• 此文章解释权归windsome所有,如要转载无须联系本人。
• 转载需要包含此抬头信息,如有疑问,欢迎联系本人。
• QQ: 35327864
• msn: fgwf1@hotmail.com
• mail: agooou@gmail.com
 ********************************************************************/

目前linux上各种工具软件源码包都是使用标准的gnu的configure进行打包。如果将这些开发包都使用cmake方式来改写makefile系统,工作量将很巨大。比较好的方法是直接在cmake中进行configure并且make,然后使用生成的这些库和头文件。过程如下所述。

我是基于原先的一个项目上面加内容,项目路径为/home/Dev/DigitalSignage,项目名称在CMakeList.txt中定义为DS,其源码根路径为DS_SOURCE_DIR=/home/Dev/DigitalSignage,其二进制目录为DS_BINARY_DIR=/home/Dev/DigitalSignage/build。我的cmake文件放在${DS_SOURCE_DIR}/cmake下。我新建了一个文件BuildGNUPackage.cmake用于我们对标准gnu源码库进行操作。

1,设置软件包安装路径及编译工具
SET(GNUPKG_INSTALL_PATH ${DS_BINARY_DIR}/gnupkg/install)
SE(GNUPKG_CC ${CMAKE_C_COMPILER})
SET(GNUPKG_CXX ${CMAKE_CXX_COMPILER})
IF(DS_ENABLE_CCACHE)
    SET(GNUPKG_CC ${CMAKE_C_COMPILER_ARG1})
    SET(GNUPKG_CXX ${CMAKE_CXX_COMPILER_ARG1})
ENDIF(DS_ENABLE_CCACHE)

2,编写CONFIG_GNU_PACKAGE宏,用以对源码包进行配置,_pkg_name为软件包名称,如sigc++_config(后面带_config的原因是跟下面的BUILD_GNU_PACKAGE宏中名字区分开), _pkg_rpath为相对于DS_SOURCE_DIR的相对路径如3rdParties/libsigc++2.0,_pkg_options为configure的参数,如--host=mips
MACRO(CONFIG_GNU_PACKAGE _pkg_name _pkg_rpath _pkg_options)
    SET(GNUPKG_SOURCE_PATH ${DS_SOURCE_DIR}/${_pkg_rpath})
    SET(GNUPKG_BINARY_PATH ${DS_BINARY_DIR}/gnupkg/${_pkg_rpath})
    SET(GNUPKG_CONFIG_TARGETS ${GNUPKG_CONFIG_TARGETS} ${_pkg_name})

    ADD_CUSTOM_TARGET(
        ${_pkg_name}
        COMMENT "config ing ${_pkg_name} in ${_pkg_rpath}"
        COMMAND mkdir -p ${GNUPKG_BINARY_PATH}
        COMMAND mkdir -p ${GNUPKG_INSTALL_PATH}
        )
    ADD_CUSTOM_COMMAND(
        TARGET ${_pkg_name}
        COMMENT "options: ${_pkg_options}"
        COMMAND export CC=${GNUPKG_CC}
        COMMAND export CXX=${GNUPKG_CXX}
        COMMAND export CFLAGS=${GNUPKG_CFLAGS}
        COMMAND export CXXFLAGS=${GNUPKG_CXXFLAGS}
        COMMAND ${GNUPKG_SOURCE_PATH}/configure ${_pkg_options}
        WORKING_DIRECTORY ${GNUPKG_BINARY_PATH}
        VERBATIM
        NO_ESCAPE_QUOTE
        )
ENDMACRO(CONFIG_GNU_PACKAGE)

3,编写BUILD_GNU_PACKAGE宏,用来编译上一步配置好的软件包
MACRO(BUILD_GNU_PACKAGE _pkg_name _pkg_rpath)
    SET(GNUPKG_BINARY_PATH ${DS_BINARY_DIR}/gnupkg/${_pkg_rpath})
    SET(GNUPKG_BUILD_TARGETS ${GNUPKG_BUILD_TARGETS} ${_pkg_name})
    ADD_CUSTOM_TARGET(
        ${_pkg_name}
        COMMENT "building ${_pkg_name} in ${_pkg_rpath}"
        )
    ADD_CUSTOM_COMMAND(
        TARGET ${_pkg_name}
        COMMAND make
        COMMAND make install
        WORKING_DIRECTORY ${GNUPKG_BINARY_PATH}
        )
ENDMACRO(BUILD_GNU_PACKAGE)

4,添加软件包
SET(GNUPKG_CONFIG_TARGETS "")
SET(GNUPKG_BUILD_TARGETS "")
IF(DS_TARGET STREQUAL "X86")
    CONFIG_GNU_PACKAGE(libsigcxx_cfg 3rdParties/libsigc++-2.2.8 "--enable-shared=yes")
ENDIF(DS_TARGET STREQUAL "X86")

IF(DS_TARGET STREQUAL "SMP865X")
    CONFIG_GNU_PACKAGE(libsigcxx_cfg 3rdParties/libsigc++-2.2.8 "--host=mips")
ENDIF(DS_TARGET STREQUAL "SMP865X")

BUILD_GNU_PACKAGE(libsigcxx_build 3rdParties/libsigc++-2.2.8)
SET(DS_SIGC++_INCLUDE_DIR ${GNUPKG_INSTALL_PATH}/include/sigc++-2.0 ${GNUPKG_INSTALL_PATH}/lib/sigc++-2.0/include)
SET(DS_SIGC++_LIBRARY_DIR ${GNUPKG_INSTALL_PATH}/lib)
SET(DS_SIGC++_LIBS sigc-2.0)

5,添加一个总的配置所有package的目标
ADD_CUSTOM_TARGET(ds_gnupkg_config
    COMMENT "config done all gnu packages!"
    )
ADD_DEPENDENCIES(ds_gnupkg_config
    ${GNUPKG_CONFIG_TARGETS}
    )
6,添加一个总的编译所有package的目标
ADD_CUSTOM_TARGET(ds_gnupkg_build
    COMMENT "built done all gnu packages"
    )
ADD_DEPENDENCIES(ds_gnupkg_build
    ${GNUPKG_BUILD_TARGETS}
    )

7,你可以到所需要的地方用DS_SIGC++_INCLUDE_DIR , DS_SIGC++_LIBRARY_DIR , DS_SIGC++_LIBS等宏对sigc++进行调用

8,最后你可以到DS_BINARY_DIR去执行
ccmake ..
make ds_gnupkg_config
make ds_gnupkg_build



备注:
CONFIG_GNU_PACKAGE这个宏在调用的时候会有问题。_pkg_options参数中内容经常会不止一个,在目前cmake-2.8.3版本及之前都不能将这个字符串正确的传入到ADD_CUSTOM_COMMAND的COMMAND命令中。
如:你调用CONFIG_GNU_PACKAGE(libsigcxx_cfg 3rdParties/libsigc++-2.2.8 "--host=x86 --target=mips"),运行make ds_gnupkg_config VERBOSE=1后,会看到调用的shell命令转换成了/home/Dev/DigitalSignage/3rdParties/libsigc++-2.2.8/configure --build=mips/ --host=x86,它将_pkg_options里的空格转义了!
翻看ADD_CUSTOM_COMMAND的用法后添加了一个参数VERBATIM到ADD_CUSTOM_COMMAND的最后,虽然不转义了,但在_pkg_options前后添加了双引号,变成了/home/Dev/DigitalSignage/3rdParties/libsigc++-2.2.8/configure "--build=mips --host=x86"。
再尝试了各种方法(包括使用环境变量,LIST模式)之后,发现无论怎样都不奏效。最后,下载了2.8.3版本的源码,翻看了源码后发现ADD_CUSTOM_COMMAND命令对COMMAND的后续内容做了处理,要么加引号,要么加转义符,只是对一些shell的操作符如 ">" ,"|>"等没有转义。
据此,我修改了cmake2.8.3的源码在ADD_CUSTOM_COMMAND中添加了一个操作符NO_ESCAPE_QUOTE,使得ADD_CUSTOM_COMMAND不做转义和添加双引号。NO_ESCAPE_QUOTE的位置等同VERBATIM。

 

附件:

BuildGNUPackage.cmake (http://u.115.com/file/f2c1b5d883)

cmake-2.8.3.modify.tar.bz2 ( http://u.115.com/file/f2862c7372 )

 

 


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值