2017-09-13 148 views
0

我有一个项目,应该安装在${CMAKE_INSTALL_PREFIX}(由用户提供)。修改子目录CMAKE_INSTALL_PREFIX

我包括一个子项目add_subdirectory(subproject)。该子项目将内容安装到${CMAKE_INSTALL_PREFIX},但我宁愿将其安装到${CMAKE_INSTALL_PREFIX}/subproject。我怎样才能不触及子项目?

我已经试过这样:但它没有任何效果:

set(_INSTALL_PREFIX_BACKUP ${CMAKE_INSTALL_PREFIX}) 
set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/subproject) 
add_subdirectory(subproject) 
set(CMAKE_INSTALL_PREFIX ${_INSTALL_PREFIX_BACKUP}) 

我也试过这样:

include(ExternalProject) 
ExternalProject_Add(subproject 
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/subproject 
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}/subproject" 
    INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/subproject" 
) 
+0

不知道有关Windows,但在Linux上安装主,子项目进入**同一目录**(使用相同* CMAKE_INSTALL_PREFIX *)是可以的。而且,将子项目安装到子目录中对于用户而言是不寻常的。您可以将* CMAKE_INSTALL_PREFIX *视为不是每个项目目录,而是**每个环境**。一个环境可能包含许多已安装的项目,这些项目会相互干扰。这又是关于Linux的。至于你的尝试,使用'ExternalProject'应该工作。 – Tsyvarev

回答

0

这是我想出的解决方案。在子项目:

if (SUBPROJECT_INSTALL_PREFIX) 
    set(_SUBPROJECT_INSTALL_PREFIX ${SUBPROJECT_INSTALL_PREFIX}/) 
else() 
    set(_SUBPROJECT_INSTALL_PREFIX .) 
endif() 

install(TARGETS ${PROJECT_NAME} 
     RUNTIME DESTINATION ${_SUBPROJECT_INSTALL_PREFIX}/bin 
     ARCHIVE DESTINATION ${_SUBPROJECT_INSTALL_PREFIX}/lib/static 
     LIBRARY DESTINATION ${_SUBPROJECT_INSTALL_PREFIX}/lib) 

在超级项目,然后我用:

set(SUBPROJECT_INSTALL_PREFIX "path/to/subproject" CACHE STRING "Path in project") 
add_subdirectory(subproject) 
1

这是所有关于install()功能。

在你的子项目的CMakeLists.txt你需要下面一行:

install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION subproject) 

根据您的用例,你可以调整LIBRARYRUNTIME
subproject这里是路径。这是相对于${CMAKE_INSTALL_PREFIX}

此处有documentation供参考。

+0

这里的诀窍是我希望我的子项目对超级项目不可知。该子项目正在用于多个超级项目,并将安装在每个超级项目的不同位置。我想我最好的选择是在子项目的缓存中添加一个字符串选项来设置安装前缀。 – Stewart