Как я могу установить другой CPACK_PACKAGING_INSTALL_PREFIX
для пакетов с исходным кодом?
Я хочу, чтобы моя система сборки cmake могла создавать двоичные и исходные пакеты. Я использую генератор TGZ
для них обоих.
Я хочу, чтобы каталог, содержащий источники внутри исходного архива, имел формат @PROJECT@-@VERSION@
(например, my_project-3.1.4
). Каталог, содержащий двоичные файлы в двоичном архиве, должен иметь формат @PROJECT@-@VERSION@-@OS@@ARCH
он двоичных пакетов (например, my_project-3.1.4-linux32
)
Как я могу это сделать? Приведенный ниже пример проекта создаст my_project-3.1.4-win32
для исходных пакетов. У меня та же проблема при использовании компонентов cpack.
Таким образом, мой вопрос состоит в том, как различать исходный и двоичный пакеты во время cpack.
Использование пакета и цели package_source
Проект cmake, приведенный ниже, воспроизводит мою проблему.
Используйте его как:
- , скопируйте исходные коды, например,
/tmp/my_project
- создайте новый каталог emtpy, например,
/tmp/bin
cd /tmp/build_my_project
cmake /tmp/my_project
make package
make package_source
- проверка сгенерированных архивов:
my_project-3.1.4-src.tar.gz
vs my_project-3.1.4-linux64.tar.gz
CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(my_project VERSION 3.1.4 LANGUAGES C)
include(GNUInstallDirs)
add_executable(program main.c)
install(TARGETS program RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(ARCH_SUFFIX 64)
else()
set(ARCH_SUFFIX 32)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(OS_SUFFIX win)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
set(OS_SUFFIX mac)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(OS_SUFFIX linux)
else()
message(FATAL_ERROR "Unknown os")
endif()
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-${OS_SUFFIX}${ARCH_SUFFIX}")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-src")
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)
set(CPACK_PACKAGING_INSTALL_PREFIX "/${PROJECT_NAME}-${PROJECT_VERSION}-${OS_SUFFIX}${ARCH_SUFFIX}")
set(CPACK_GENERATOR "TGZ")
set(CPACK_SOURCE_GENERATOR "TGZ")
include(CPack)
main.c
#include <stdio.h>
int main() {
printf("Hello world!\n");
return 0;
}
Использование компонентов CPack
Используйте его как:
- скопируйте источники, например,
/tmp/my_project
- создайте новый каталог emtpy, например,
/tmp/bin
cd /tmp/build_my_project
cmake /tmp/my_project
make package
(обратите внимание, что make package_source
не требуется) - проверка созданных архивов:
my_project-3.1.4-src.tar.gz
vs my_project-3.1.4-linux64.tar.gz
CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(my_project VERSION 3.1.4 LANGUAGES C)
include(GNUInstallDirs)
add_library(library public.c)
target_include_directories(library PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
)
set_target_properties(library PROPERTIES
EXPORT_NAME MyProject::Library
PUBLIC_HEADER public.h)
install(TARGETS library EXPORT MyProjectExports
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT binaries
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT binaries
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT binaries
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" COMPONENT binaries
)
add_executable(program main.c)
target_link_libraries(program PUBLIC library)
install(TARGETS program
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT binaries
)
install(EXPORT MyProjectExports DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
install(FILES "CMakeLists.txt" "main.c" "public.c" "public.h" DESTINATION "." COMPONENT sources EXCLUDE_FROM_ALL)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(ARCH_SUFFIX 64)
else()
set(ARCH_SUFFIX 32)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(OS_SUFFIX win)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
set(OS_SUFFIX mac)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(OS_SUFFIX linux)
else()
message(FATAL_ERROR "Unknown os")
endif()
set(CPACK_ARCHIVE_BINARIES_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-${OS_SUFFIX}${ARCH_SUFFIX}")
set(CPACK_ARCHIVE_SOURCES_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-src")
set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
set(CPACK_PACKAGING_INSTALL_PREFIX "/${PROJECT_NAME}-${PROJECT_VERSION}-${OS_SUFFIX}${ARCH_SUFFIX}")
set(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY OFF)
set(CPACK_GENERATOR "TGZ")
set(CPACK_SOURCE_GENERATOR "TGZ")
include(CPack)
main.c
#include <public.h>
int main() {
my_function();
return 0;
}
public.h
#ifndef PUBLIC_H_
#define PUBLIC_H_
void my_function(void);
#endif // PUBLIC_H_
public.c
#include <stdio.h>
void my_function(void) {
printf("Hello world!\n");
}