/*******************************************************************
• 此文章解释权归windsome全部,如要转载无须联系本人。
• 转载须要包含此抬头信息,若有疑问,欢迎联系本人。
• QQ: 35327864
• msn: fgwf1@hotmail.com
• mail: agooou@gmail.com
********************************************************************/linux
目前linux上各类工具软件源码包都是使用标准的gnu的configure进行打包。若是将这些开发包都使用cmake方式来改写makefile系统,工做量将很巨大。比较好的方法是直接在cmake中进行configure而且make,而后使用生成的这些库和头文件。过程以下所述。c++
我是基于原先的一个项目上面加内容,项目路径为/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源码库进行操做。git
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)shell
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)ui
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).net
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")blog
IF(DS_TARGET STREQUAL "SMP865X")
CONFIG_GNU_PACKAGE(libsigcxx_cfg 3rdParties/libsigc++-2.2.8 "--host=mips")
ENDIF(DS_TARGET STREQUAL "SMP865X")ip
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 )