【问题标题】:CPack building external autogen project with bad output locationCPack 构建输出位置错误的外部 autogen 项目
【发布时间】:2017-06-23 14:47:26
【问题描述】:

我正在尝试在基于 autogen 的项目上使用 CMake ExternalProject_Add 构建 debian。该项目安装到我设置的任何前缀目录(默认为/usr/local)。问题是,当我在项目上运行 make package 时,生成的 debian 使用该前缀目录而不是 /usr/local。我尝试执行额外的 CMake install() 命令,该命令确实有效,但我仍然在前缀目录位置获得目标输出的额外副本。

这是完整的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project("sphinxbase")

find_package(Git REQUIRED)

set(CPACK_GENERATOR "DEB")
if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
  set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE amd64)
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
  set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE i386)
endif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Chuck Claunch <cclaunch@gmail.com>")
set(CPACK_PACKAGE_VERSION_MAJOR 0)
set(CPACK_PACKAGE_VERSION_MINOR 0)
set(CPACK_PACKAGE_VERSION_PATCH 1)
execute_process(COMMAND ${GIT_EXECUTABLE} rev-list master..
                COMMAND wc -l
                OUTPUT_VARIABLE GIT_REVISION
                OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} VERSION_LESS 2.8.11)
    message(STATUS "CMake older than 2.8.11, generating timestamp using execute_process().")
    execute_process(COMMAND date -u +%Y.%m.%d.%H.%M.%S
                OUTPUT_VARIABLE DATE_STRING
                OUTPUT_STRIP_TRAILING_WHITESPACE
    )
else(if (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} VERSION_LESS 2.8.11))
    message(STATUS "CMake newer than 2.8.11, generating timestamp using string(TIMESTAMP).")
    string(TIMESTAMP DATE_STRING %Y.%m.%d.%H.%M.%S UTC)
endif(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} VERSION_LESS 2.8.11)
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
                OUTPUT_VARIABLE GIT_SHA_COMPLETE
                OUTPUT_STRIP_TRAILING_WHITESPACE
)
string(SUBSTRING ${GIT_SHA_COMPLETE} 0 8 GIT_SHA_SHORT)
set(CPACK_DEBIAN_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}.${GIT_REVISION}-${DATE_STRING}-${GIT_SHA_SHORT}")
set(CPACK_DEBIAN_PACKAGE_PROVIDES ${PROJECT_NAME})
set(CPACK_DEBIAN_PACKAGE_CONFLICTS ${PROJECT_NAME})
set(CPACK_DEBIAN_PACKAGE_REPLACES ${PROJECT_NAME})
set(CPACK_DEBIAN_PACKAGE_DEPENDS "bison, python-dev, swig")
set(CPACK_DEBIAN_PACKAGE_NAME ${PROJECT_NAME})
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "Sphinx speech recognition libraries")

set(SPHINXBASE_PREFIX_DIR ${CMAKE_BINARY_DIR}/sphinxbase)
set(SPHINXBASE_SRC_DIR ${SPHINXBASE_PREFIX_DIR}/src/libsphinxbase)
set(SPHINXBASE_INSTALL_DIR ${SPHINXBASE_PREFIX_DIR}/install)

include(ExternalProject)
ExternalProject_Add(libsphinxbase
    GIT_REPOSITORY https://github.com/cmusphinx/sphinxbase
    GIT_TAG master
    PREFIX ${SPHINXBASE_PREFIX_DIR}
    DESTDIR ${CMAKE_PREFIX_PATH}
    CONFIGURE_COMMAND cd ${SPHINXBASE_SRC_DIR} && ./autogen.sh && ./configure --prefix=${SPHINXBASE_INSTALL_DIR}
    BUILD_IN_SOURCE 1
)

add_custom_target(libsphinxbase-build
    DEPENDS libsphinxbase)

set(CPACK_PACKAGE_FILE_NAME ${CPACK_DEBIAN_PACKAGE_NAME}_${CPACK_DEBIAN_PACKAGE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE})

include(CPack)

如果我添加了install(DIRECTORY ${SPHINXBASE_INSTALL_DIR} DESTINATION ${CMAKE_PREFIX_PATH}),我最终得到了正确的安装,但仍然有额外的副本尝试安装在${SPHINXBASE_INSTALLDIR}。如果我在ExternalProject_Add 中没有PREFIX 以sudo 运行构建,它工作正常,但我不希望构建以sudo 运行。

有什么方法可以强制 CPack 使用 ${SPHINXBASE_INSTALL_DIR} 并仅将其安装到 ${CMAKE_PREFIX_PATH}

【问题讨论】:

    标签: linux cmake cpack


    【解决方案1】:

    我今天也遇到了同样的问题。实际上,如果你运行 make package,cmake 会运行,包括你不想要的 make install 部分。 尝试仅将“cpack”用作命令行。它将直接构建一个包。

    你也可以这样做:DESTDIR=/tmp/truc make package

    make 包首先运行 cmake,它会进行 make 安装。 cpack 首先将安装前缀设置为临时目录,然后运行 ​​make install。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 2012-10-06
      • 2018-03-05
      • 1970-01-01
      • 2013-11-12
      相关资源
      最近更新 更多