Изменение CPACK_PACKAGING_INSTALL_PREFIX для исходных пакетов - PullRequest
0 голосов
/ 08 ноября 2019

Как я могу установить другой 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, приведенный ниже, воспроизводит мою проблему.

Используйте его как:

  1. , скопируйте исходные коды, например, /tmp/my_project
  2. создайте новый каталог emtpy, например, /tmp/bin
  3. cd /tmp/build_my_project
  4. cmake /tmp/my_project
  5. make package
  6. make package_source
  7. проверка сгенерированных архивов: 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

Используйте его как:

  1. скопируйте источники, например, /tmp/my_project
  2. создайте новый каталог emtpy, например, /tmp/bin
  3. cd /tmp/build_my_project
  4. cmake /tmp/my_project
  5. make package (обратите внимание, что make package_source не требуется)
  6. проверка созданных архивов: 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");
}
...