7

我的其中一个中有以下代码CMakeLists.txt

FIND_PACKAGE(sphinxbase)
if (${SPHINXBASE_FOUND})
    INCLUDE_DIRECTORIES(${SPHINXBASE_INCLUDE_DIR}/sphinxbase/)
else ()
    ExternalProject_Add(
        sphinxbase
        GIT_REPOSITORY      "https://github.com/cmusphinx/sphinxbase.git"
        GIT_TAG             "e34b1c632392276101ed16e8a05862e43f038a7c"
        SOURCE_DIR          ${CMAKE_CURRENT_SOURCE_DIR}/lib/sphinxbase
        CONFIGURE_COMMAND   ${CMAKE_CURRENT_SOURCE_DIR}/lib/sphinxbase/autogen.sh
        BUILD_COMMAND       ${MAKE}
        UPDATE_COMMAND      ""
        INSTALL_COMMAND     ""
        BUILD_IN_SOURCE     ON
        LOG_DOWNLOAD        ON
        LOG_UPDATE          ON
        LOG_CONFIGURE       ON
        LOG_BUILD           ON
        LOG_TEST            ON
        LOG_INSTALL         ON
    )
    ExternalProject_Get_Property(sphinxbase SOURCE_DIR)
    ExternalProject_Get_Property(sphinxbase BINARY_DIR)
    SET(SPHINXBASE_SOURCE_DIR ${SOURCE_DIR})
    SET(SPHINXBASE_BINARY_DIR ${BINARY_DIR})
    SET(SPHINXBASE_LIBRARIES ${SPHINXBASE_BINARY_DIR}/src/libsphinxbase/.libs/libsphinxbase.a)
    INCLUDE_DIRECTORIES(${SPHINXBASE_SOURCE_DIR}/include)
endif ()
SET(DEPENDENCIES ${DEPENDENCIES} sphinxbase)
SET(LIBS ${LIBS} ${SPHINXBASE_LIBRARIES})

除了我要安装的目标之外,我将如何安装这个 ExternalProject?现在我正在尝试这样做:

install(TARGETS ${LIBS}
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib
        OPTIONAL
        )

install(TARGETS ${PROJECT_NAME}
        RUNTIME DESTINATION bin
        )

但是我收到以下错误:

CMake Error at CMakeLists.txt:197 (install):
  install TARGETS given target
  "/Users/syb0rg/Dropbox/Development/Khronos/Khronos/lib/sphinxbase/src/libsphinxbase/.libs/libsphinxbase.a"
  which does not exist in this directory.

有什么建议么?

4

1 回答 1

4

命令流install(TARGETS)安装使用or命令创建的目标。对于安装具体文件,您需要使用命令流。add_executableadd_libraryinstall(FILES)

您可以按原样安装子项目,而不是从子项目的构建目录安装选定的文件。为此,您可以使用

make DESTDIR=<...> install

命令INSTALL作为ExeternalProject_Add. 此命令会将整个子项目安装到作为 make 参数给出的目录中DESTDIR(有关此参数的更多信息可以在这里找到)。

然后您可以使用install(DIRECTORY)命令一次安装所有子项目的文件:

# It is better to use binary directory for download or build 3d-party project 
set(sphinxbase_SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/lib/sphinxbase)
# This will be used as DESTDIR on subproject's `make install`.
set(sphinxbase_DESTDIR ${CMAKE_CURRENT_BINARY_DIR}/lib/sphinxbase_install)

ExternalProject_Add(
    sphinxbase
    GIT_REPOSITORY      "https://github.com/cmusphinx/sphinxbase.git"
    GIT_TAG             "e34b1c632392276101ed16e8a05862e43f038a7c"
    SOURCE_DIR          ${sphinxbase_SOURCE_DIR}
    # Specify installation prefix for configure.sh (autogen.sh).
    CONFIGURE_COMMAND   ./autogen.sh --prefix=${CMAKE_INSTALL_PREFIX}
    BUILD_COMMAND       ${MAKE}
    UPDATE_COMMAND      ""
    # Fake installation: copy installed files into DESTDIR.
    INSTALL_COMMAND     make DESTDIR=${sphinxbase_DESTDIR} install
    ...
)
# Actually install subproject.
install(DIRECTORY ${sphinxbase_DESTDIR}/ DESTINATION "/")

请注意,该根目录用作DESTINATION. 这是因为目录下的sphinxbase_DESTDIR文件已经根据CMAKE_INSTALL_PREFIX,作为--prefix选项传递给configure.sh(autogen.sh在给定的情况下)。

如果您知道,子项目仅在安装前缀(由 给出--prefix)下安装其文件,您可以使主项目安装更易于打包

install(DIRECTORY ${sphinxbase_DESTDIR}/${CMAKE_INSTALL_PREFIX}/ DESTINATION ".")

由于现在使用相对路径作为DESTINATION选项,项目将正确支持打包。例如,make DESTDIR=<...> install也适用于主要项目。


请注意,即使ExternalProject_Add用于构建CMake子项目,在此子项目中创建的目标也不会被主项目看到。

于 2016-03-11T09:02:48.537 回答