2016-04-12 1 views
0

У меня есть проект CMake, который устанавливает вещи к системе в соответствии с командой install следующим образом:Как указать структуру папок для генератора CPack TGZ?

install (
    TARGETS myTarget 
    RUNTIME DESTINATION bin 
    LIBRARY DESTINATION lib 
) 

make install работает отлично. И тогда я хочу иметь двоичный архив:

set(CPACK_GENERATOR "TGZ") 

make package создает файл tar.gz с той же структурой папок, как install команды, указанной. Тем не менее, я хочу иметь плоскую структуру, то есть поставить все (как исполняемые файлы, так и библиотеки) в «префикс» без каталога «bin» и «lib».

Возможно ли это? Может быть, с некоторым умным использованием системы компонентов, системы типа сборки, или CPACK_PROJECT_CONFIG_FILE?

+0

Вы знаете о 'make package_source'? Возможно, он делает то, что вы хотите. – usr1234567

+0

'Тем не менее, я хочу иметь плоскую структуру, то есть поместить все (как исполняемые файлы, так и библиотеки) в« префикс », без каталога« bin »и« lib ».» - Затем вам нужно установить цели непосредственно на " префикс". Возможно, «DESTINATION.» Должен работать. – Tsyvarev

+0

@ usr1234567 Да, но 'make package_source' предназначен для упаковки исходного архива, который не имеет отношения к моему вопросу. Или вы имели в виду, что можно злоупотреблять, чтобы каким-то образом решить мою проблему? –

ответ

0

В конце я добавил пользовательский скрипт установки, который определяет, будет ли он выполняться CPack, просмотрев CMAKE_INSTALL_PREFIX и при необходимости реструктурируйте дерево установки.

Вот мое решение:

В CMakeLists.txt, после всех install() команд, добавить

install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/flatten.cmake") 

Добавить файл "CMake/flatten.cmake", с содержанием следующим

# Detect if the install is run by CPack. 
if (${CMAKE_INSTALL_PREFIX} MATCHES "/_CPack_Packages/.*/(TGZ|ZIP)/") 
    # Flatten the directory structure such that everything except the header files is placed in root. 
    file(GLOB bin_files LIST_DIRECTORIES FALSE ${CMAKE_INSTALL_PREFIX}/bin/*) 
    file(GLOB lib_files LIST_DIRECTORIES FALSE ${CMAKE_INSTALL_PREFIX}/lib/*) 
    foreach(file ${bin_files} ${lib_files}) 
     get_filename_component(file_name ${file} NAME) 
     execute_process(
      COMMAND ${CMAKE_COMMAND} -E rename 
      ${file} 
      ${CMAKE_INSTALL_PREFIX}/${file_name} 
     ) 
    endforeach() 
    execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_INSTALL_PREFIX}/bin) 
    execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_INSTALL_PREFIX}/lib) 
endif() 
Смежные вопросы