syb*_*0rg 7 installation build-process build cmake external-project
我的其中一个中有以下代码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})
Run Code Online (Sandbox Code Playgroud)
除了我要安装的 TARGET 之外,我将如何安装这个 ExternalProject?现在我正在尝试这样做:
install(TARGETS ${LIBS}
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
OPTIONAL
)
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION bin
)
Run Code Online (Sandbox Code Playgroud)
但是我收到了以下错误:
Run Code Online (Sandbox Code Playgroud)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.
有什么建议?
命令流install(TARGETS)
安装使用或命令创建的目标。要安装具体文件,您需要使用命令流。add_executable
add_library
install(FILES)
您可以按原样安装子项目,而不是从子项目的构建目录中安装选定的文件。为此你可以使用
make DESTDIR=<...> install
Run Code Online (Sandbox Code Playgroud)
命令作为INSTALL
的选项ExeternalProject_Add
。此命令将把整个子项目DESTDIR
安装到作为make 参数给出的目录中(有关此参数的更多信息可以在此处找到)。
然后你可以使用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 "/"
USE_SOURCE_PERMISSIONS # Remain permissions (rwx) for installed files
)
Run Code Online (Sandbox Code Playgroud)
请注意,根目录用作DESTINATION
. 这是因为sphinxbase_DESTDIR
目录下的文件已经根据 定位CMAKE_INSTALL_PREFIX
,它作为--prefix
选项传递给configure.sh
(autogen.sh
在给定情况下)。
如果您知道子项目仅在安装前缀(由 给出--prefix
)下安装其文件,则可以使主项目安装更加打包友好:
install(
DIRECTORY ${sphinxbase_DESTDIR}/${CMAKE_INSTALL_PREFIX}/
DESTINATION "."
USE_SOURCE_PERMISSIONS
)
Run Code Online (Sandbox Code Playgroud)
由于现在使用相对路径DESTINATION
作为选项,因此项目将正确支持打包。例如,make DESTDIR=<...> install
也将适用于主项目。
请注意,即使ExternalProject_Add
用于构建CMake子项目,主项目也看不到在此子项目中创建的目标。
归档时间: |
|
查看次数: |
6200 次 |
最近记录: |