Files
openvino/cmake/developer_package/packaging/rpm/rpm.cmake

291 lines
10 KiB
CMake

# Copyright (C) 2018-2023 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
#
include(GNUInstallDirs)
#
# ov_rpm_cpack_set_dirs()
#
# Set directories for cpack
#
macro(ov_rpm_cpack_set_dirs)
# override default locations for RPM
set(OV_CPACK_TOOLSDIR ${CMAKE_INSTALL_BINDIR}) # only C++ tools are here
set(OV_CPACK_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})
set(OV_CPACK_LIBRARYDIR ${CMAKE_INSTALL_LIBDIR})
set(OV_CPACK_RUNTIMEDIR ${CMAKE_INSTALL_LIBDIR})
set(OV_WHEEL_RUNTIMEDIR ${OV_CPACK_RUNTIMEDIR})
set(OV_CPACK_ARCHIVEDIR ${CMAKE_INSTALL_LIBDIR})
set(OV_CPACK_PLUGINSDIR ${CMAKE_INSTALL_LIBDIR}/openvino-${OpenVINO_VERSION})
set(OV_CPACK_IE_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/inferenceengine${OpenVINO_VERSION})
set(OV_CPACK_NGRAPH_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/ngraph${OpenVINO_VERSION})
set(OV_CPACK_OPENVINO_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/openvino${OpenVINO_VERSION})
set(OV_CPACK_DOCDIR ${CMAKE_INSTALL_DATADIR}/doc/openvino-${OpenVINO_VERSION})
set(OV_CPACK_LICENSESDIR ${OV_CPACK_DOCDIR}/licenses)
ov_get_pyversion(pyversion)
if(pyversion)
set(OV_CPACK_PYTHONDIR ${CMAKE_INSTALL_LIBDIR}/${pyversion}/site-packages)
endif()
# non-native stuff
set(OV_CPACK_SHAREDIR ${CMAKE_INSTALL_DATADIR}/openvino) # internal
set(OV_CPACK_SAMPLESDIR ${OV_CPACK_SHAREDIR}/samples)
set(OV_CPACK_DEVREQDIR ${OV_CPACK_SHAREDIR})
unset(OV_CPACK_SHAREDIR)
# skipped during rpm packaging
set(OV_CPACK_WHEELSDIR "tools")
# for BW compatibility
set(IE_CPACK_LIBRARY_PATH ${OV_CPACK_LIBRARYDIR})
set(IE_CPACK_RUNTIME_PATH ${OV_CPACK_RUNTIMEDIR})
set(IE_CPACK_ARCHIVE_PATH ${OV_CPACK_ARCHIVEDIR})
endmacro()
ov_rpm_cpack_set_dirs()
#
# Override CPack components name for RPM generator
# This is needed to change the granularity, i.e. merge several components
# into a single one
#
macro(ov_override_component_names)
# merge C++ and C runtimes
set(OV_CPACK_COMP_CORE_C "${OV_CPACK_COMP_CORE}")
set(OV_CPACK_COMP_CORE_C_DEV "${OV_CPACK_COMP_CORE_DEV}")
# merge all C / C++ samples as a single samples component
set(OV_CPACK_COMP_CPP_SAMPLES "samples")
set(OV_CPACK_COMP_C_SAMPLES "${OV_CPACK_COMP_CPP_SAMPLES}")
endmacro()
ov_override_component_names()
#
# Override include / exclude rules for components
# This is required to exclude some files from installation
# (e.g. rpm packages don't require setupvars scripts or deployment_manager)
#
macro(ov_define_component_include_rules)
# core components
unset(OV_CPACK_COMP_CORE_EXCLUDE_ALL)
set(OV_CPACK_COMP_CORE_C_EXCLUDE_ALL ${OV_CPACK_COMP_CORE_EXCLUDE_ALL})
unset(OV_CPACK_COMP_CORE_DEV_EXCLUDE_ALL)
set(OV_CPACK_COMP_CORE_C_DEV_EXCLUDE_ALL ${OV_CPACK_COMP_CORE_DEV_EXCLUDE_ALL})
# licensing
set(OV_CPACK_COMP_LICENSING_EXCLUDE_ALL EXCLUDE_FROM_ALL)
# samples
unset(OV_CPACK_COMP_CPP_SAMPLES_EXCLUDE_ALL)
set(OV_CPACK_COMP_C_SAMPLES_EXCLUDE_ALL ${OV_CPACK_COMP_CPP_SAMPLES_EXCLUDE_ALL})
if(ENABLE_PYTHON_PACKAGING)
unset(OV_CPACK_COMP_PYTHON_SAMPLES_EXCLUDE_ALL)
else()
set(OV_CPACK_COMP_PYTHON_SAMPLES_EXCLUDE_ALL EXCLUDE_FROM_ALL)
endif()
# python
if(ENABLE_PYTHON_PACKAGING)
# pack artifacts of setup.py install
unset(OV_CPACK_COMP_PYTHON_OPENVINO_PACKAGE_EXCLUDE_ALL)
else()
set(OV_CPACK_COMP_PYTHON_OPENVINO_PACKAGE_EXCLUDE_ALL EXCLUDE_FROM_ALL)
endif()
# we don't pack python components itself, we pack artifacts of setup.py install
set(OV_CPACK_COMP_PYTHON_OPENVINO_EXCLUDE_ALL EXCLUDE_FROM_ALL)
set(OV_CPACK_COMP_BENCHMARK_APP_EXCLUDE_ALL ${OV_CPACK_COMP_PYTHON_OPENVINO_EXCLUDE_ALL})
set(OV_CPACK_COMP_OVC_EXCLUDE_ALL ${OV_CPACK_COMP_PYTHON_OPENVINO_EXCLUDE_ALL})
# we don't need wheels in RPM packages
set(OV_CPACK_COMP_PYTHON_WHEELS_EXCLUDE_ALL EXCLUDE_FROM_ALL)
# because numpy is installed by rpm
set(OV_CPACK_COMP_OPENVINO_REQ_FILES_EXCLUDE_ALL EXCLUDE_FROM_ALL)
# tools
set(OV_CPACK_COMP_OPENVINO_DEV_REQ_FILES_EXCLUDE_ALL EXCLUDE_FROM_ALL)
set(OV_CPACK_COMP_DEPLOYMENT_MANAGER_EXCLUDE_ALL EXCLUDE_FROM_ALL)
# scripts
set(OV_CPACK_COMP_INSTALL_DEPENDENCIES_EXCLUDE_ALL EXCLUDE_FROM_ALL)
set(OV_CPACK_COMP_SETUPVARS_EXCLUDE_ALL EXCLUDE_FROM_ALL)
endmacro()
ov_define_component_include_rules()
#
# Common RPM specific settings
#
macro(ov_rpm_specific_settings)
# multiple packages are generated
set(CPACK_RPM_COMPONENT_INSTALL ON)
# automatically find dependencies for binaries
set(CPACK_RPM_PACKAGE_AUTOREQPROV ON)
# homepage
set(CPACK_RPM_PACKAGE_URL "https://docs.openvino.ai/")
# ASL 2.0 # Apache Software License 2.0
set(CPACK_RPM_PACKAGE_LICENSE "ASL 2.0")
# group
set(CPACK_RPM_PACKAGE_GROUP "Development/Libraries")
# changelog file
# TODO: fix "error: bad date in %changelog"
# set(CPACK_RPM_CHANGELOG_FILE "${OpenVINO_SOURCE_DIR}/cmake/developer_package/packaging/rpm/changelog")
# use rpmlint to check packages in post-build step
set(CPACK_POST_BUILD_SCRIPTS "${IEDevScripts_DIR}/packaging/rpm/post_build.cmake")
# enable for debug cpack run
ov_set_if_not_defined(CPACK_RPM_PACKAGE_DEBUG OFF)
# naming convention for rpm package files
set(CPACK_RPM_FILE_NAME "RPM-DEFAULT")
# need to update this version once we rebuild the same package with additional fixes
set(CPACK_RPM_PACKAGE_RELEASE "1")
# enable this if someday we change the version scheme
# set(CPACK_RPM_PACKAGE_EPOCH "2")
# temporary WA for rpm package architecture for cross-compilation
# proper solution: to force cmake auto-detect this
if(CMAKE_CROSSCOMPILING)
if(AARCH64)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE arm64)
elseif(ARM)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE armhf)
elseif(x86)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE i386)
endif()
endif()
# we don't need RPATHs, because libraries are search by standard paths
set(CMAKE_SKIP_INSTALL_RPATH ON)
endmacro()
ov_rpm_specific_settings()
# needed to add triggers for packages with libraries
set(def_triggers "${OpenVINO_BINARY_DIR}/_CPack_Packages/triggers")
set(triggers_content "# /bin/sh -p\n/sbin/ldconfig\n")
file(WRITE "${def_triggers}" "${triggers_content}")
#
# Functions helpful for packaging your modules with RPM cpack
#
#
# ov_rpm_copyright(<comp name> <copyright_name>)
#
function(ov_rpm_copyright comp copyright_name)
string(TOUPPER "${comp}" ucomp)
if(NOT DEFINED CPACK_RPM_${ucomp}_PACKAGE_NAME)
message(FATAL_ERROR "CPACK_RPM_${ucomp}_PACKAGE_NAME is not defined")
else()
set(package_name "${CPACK_RPM_${ucomp}_PACKAGE_NAME}")
endif()
set(package_name "${CPACK_RPM_${ucomp}_PACKAGE_NAME}")
# copyright
install(FILES "${OpenVINO_SOURCE_DIR}/cmake/packaging/copyrights/${copyright_name}"
DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/${package_name}/
COMPONENT ${comp}
RENAME "copyright")
endfunction()
#
# ov_rpm_add_rpmlint_suppression(<comp name> <suppression1, suppression2, ...>)
#
function(ov_rpm_add_rpmlint_suppression comp)
set(lines ${ARGN})
string(TOUPPER "${comp}" ucomp)
if(NOT DEFINED CPACK_RPM_${ucomp}_PACKAGE_NAME)
message(FATAL_ERROR "CPACK_RPM_${ucomp}_PACKAGE_NAME is not defined")
else()
set(package_name "${CPACK_RPM_${ucomp}_PACKAGE_NAME}")
endif()
foreach(line IN LISTS lines)
set(line "addFilter(\"${line}\")")
if(content)
set(content "${content}\n${line}")
else()
set(content "${line}")
endif()
endforeach()
if(DEFINED CPACK_RPM_${ucomp}_PACKAGE_ARCHITECTURE)
set(arch "${CPACK_RPM_${ucomp}_PACKAGE_ARCHITECTURE}")
elseif(DEFINED CPACK_RPM_PACKAGE_ARCHITECTURE)
set(arch "${CPACK_RPM_PACKAGE_ARCHITECTURE}")
elseif(X86_64)
set(arch "x86_64")
elseif(X86)
set(arch "i686")
elseif(AARCH64)
set(arch "aarch64")
elseif(ARM)
set(arch "armhf")
else()
message(FATAL_ERROR "RPM: Unsupported architecture ${CMAKE_SYSTEM_PROCESSOR}")
endif()
set(package_file_name "${package_name}-${CPACK_PACKAGE_VERSION}-1.${arch}.rpm")
set(rpmlint_override_file "${OpenVINO_BINARY_DIR}/_CPack_Packages/rpmlint/${package_file_name}.rpmlintrc")
file(REMOVE ${rpmlint_override_file})
file(WRITE ${rpmlint_override_file} ${content})
endfunction()
#
# ov_rpm_generate_conflicts(<comp name>)
#
function(ov_rpm_generate_conflicts comp)
set(cpack_name_versions ${ARGN})
string(TOUPPER "${comp}" ucomp)
# sanity check
if(NOT DEFINED CPACK_RPM_${ucomp}_PACKAGE_NAME)
message(FATAL_ERROR "CPACK_RPM_${ucomp}_PACKAGE_NAME is not defined")
else()
if(NOT DEFINED cpack_name_ver)
message(FATAL_ERROR "Internal variable 'cpack_name_ver' is not defined")
endif()
string(REPLACE "${cpack_name_ver}" "" package_name_base "${CPACK_RPM_${ucomp}_PACKAGE_NAME}")
endif()
foreach(cpack_name_version IN LISTS cpack_name_versions)
if(package_names)
set(package_names "${package_names}, ${package_name_base}${cpack_name_version}")
else()
set(package_names "${package_name_base}${cpack_name_version}")
endif()
endforeach()
set(CPACK_RPM_${ucomp}_PACKAGE_CONFLICTS "${package_names}" PARENT_SCOPE)
endfunction()
#
# ov_rpm_add_latest_component(<comp>)
#
# Adds latest component for `comp`, but without a version
# Description and other stuff (arch) is taken from the main component
#
macro(ov_rpm_add_latest_component comp)
string(TOUPPER "${comp}" ucomp)
set(comp_name "${comp}_latest")
set(upper_case "${ucomp}_LATEST")
set(CPACK_COMPONENT_${upper_case}_DESCRIPTION "${CPACK_COMPONENT_${ucomp}_DESCRIPTION}")
set(CPACK_RPM_${upper_case}_PACKAGE_REQUIRES "${CPACK_RPM_${ucomp}_PACKAGE_NAME} = ${cpack_full_ver}")
set(CPACK_RPM_${upper_case}_PACKAGE_ARCHITECTURE "noarch")
set(${comp_name}_copyright "generic")
# take package name
if(DEFINED CPACK_RPM_${ucomp}_PACKAGE_NAME)
string(REPLACE "-${cpack_name_ver}" ""
CPACK_RPM_${upper_case}_PACKAGE_NAME
"${CPACK_RPM_${ucomp}_PACKAGE_NAME}")
else()
message(FATAL_ERROR "CPACK_RPM_${ucomp}_PACKAGE_NAME is not defined")
endif()
# add latest to a list of rpm packages
list(APPEND CPACK_COMPONENTS_ALL ${comp_name})
endmacro()