|
| 1 | +cmake_minimum_required(VERSION 3.28) |
| 2 | + |
| 3 | +project(criu-static VERSION 4.1) |
| 4 | +include(GNUInstallDirs) |
| 5 | +include(macros/dependencies.cmake) |
| 6 | + |
| 7 | +# Upstream CRIU version and SHA256 checksum |
| 8 | +set(CRIU_VERSION "${PROJECT_VERSION}" CACHE STRING "CRIU version to build") |
| 9 | +set(CRIU_SHASUM "9a3094f3d0aa6cfa8bd5c9b92c05f4a566ad21ee20eb9b2fbc6129a74d1f6dc7") |
| 10 | + |
| 11 | +# Force static building |
| 12 | +set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries" FORCE) |
| 13 | +set(CMAKE_POSITION_INDEPENDENT_CODE ON) |
| 14 | +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") |
| 15 | +set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") |
| 16 | + |
| 17 | +set(ENV{CC} ${CMAKE_C_COMPILER}) |
| 18 | +set(ENV{CXX} ${CMAKE_CXX_COMPILER}) |
| 19 | + |
| 20 | +set(SOURCE_DOWNLOADS_DIR ${CMAKE_BINARY_DIR}/downloads) |
| 21 | + |
| 22 | +# Dependencies |
| 23 | +include(FetchContent) |
| 24 | +include(ExternalProject) |
| 25 | +include(dependencies/Zlib.cmake) |
| 26 | +include(dependencies/Libnl.cmake) |
| 27 | +include(dependencies/Libnet.cmake) |
| 28 | +include(dependencies/Libcap.cmake) |
| 29 | +include(dependencies/Libaio.cmake) |
| 30 | +include(dependencies/Protobuf.cmake) |
| 31 | +include(dependencies/ProtobufC.cmake) |
| 32 | +include(dependencies/Libmnl.cmake) |
| 33 | +include(dependencies/Libnftnl.cmake) |
| 34 | +include(dependencies/Libnftables.cmake) |
| 35 | +include(dependencies/UtilLinux.cmake) |
| 36 | +include(dependencies/Libintl.cmake) |
| 37 | + |
| 38 | +# Get all dependency flags |
| 39 | +get_target_property(PROTOBUF_C_CFLAGS protobuf-c::static CONSUMER_CFLAGS) |
| 40 | +get_target_property(PROTOBUF_C_LDFLAGS protobuf-c::static CONSUMER_LDFLAGS) |
| 41 | +get_target_property(PROTOBUF_C_HEADER_DIR protobuf-c::static CONSUMER_HEADER_DIR) |
| 42 | +get_target_property(PROTOC_C_BIN_PATH protobuf-c::static CONSUMER_PROTOC_C_PATH) |
| 43 | +get_target_property(PROTOBUF_CFLAGS protobuf::static CONSUMER_CFLAGS) |
| 44 | +get_target_property(PROTOBUF_LDFLAGS protobuf::static CONSUMER_LDFLAGS) |
| 45 | +get_target_property(DESCRIPTOR_PROTO_FILE protobuf::static CONSUMER_DESCRIPTOR_PROTO_FILE) |
| 46 | +get_target_property(PROTOC_BIN_PATH protobuf::static CONSUMER_PROTOC_PATH) |
| 47 | +get_target_property(LIBNET_CFLAGS libnet::static CONSUMER_CFLAGS) |
| 48 | +get_target_property(LIBNET_LDFLAGS libnet::static CONSUMER_LDFLAGS) |
| 49 | +get_target_property(LIBNL_CFLAGS libnl::static CONSUMER_CFLAGS) |
| 50 | +get_target_property(LIBNL_LDFLAGS libnl::static CONSUMER_LDFLAGS) |
| 51 | +get_target_property(LIBCAP_CFLAGS libcap::static CONSUMER_CFLAGS) |
| 52 | +get_target_property(LIBCAP_LDFLAGS libcap::static CONSUMER_LDFLAGS) |
| 53 | +get_target_property(LIBAIO_CFLAGS libaio::static CONSUMER_CFLAGS) |
| 54 | +get_target_property(LIBAIO_LDFLAGS libaio::static CONSUMER_LDFLAGS) |
| 55 | +get_target_property(ZLIB_CFLAGS zlib::static CONSUMER_CFLAGS) |
| 56 | +get_target_property(ZLIB_LDFLAGS zlib::static CONSUMER_LDFLAGS) |
| 57 | +get_target_property(LIBMNL_CFLAGS libmnl::static CONSUMER_CFLAGS) |
| 58 | +get_target_property(LIBMNL_LDFLAGS libmnl::static CONSUMER_LDFLAGS) |
| 59 | +get_target_property(LIBNFTNL_CFLAGS libnftnl::static CONSUMER_CFLAGS) |
| 60 | +get_target_property(LIBNFTNL_LDFLAGS libnftnl::static CONSUMER_LDFLAGS) |
| 61 | +get_target_property(LIBNFTABLES_CFLAGS libnftables::static CONSUMER_CFLAGS) |
| 62 | +get_target_property(LIBNFTABLES_LDFLAGS libnftables::static CONSUMER_LDFLAGS) |
| 63 | +get_target_property(LIBUUID_CFLAGS uuid::static CONSUMER_CFLAGS) |
| 64 | +get_target_property(LIBUUID_LDFLAGS uuid::static CONSUMER_LDFLAGS) |
| 65 | +get_target_property(LIBINTL_CFLAGS libintl::static CONSUMER_CFLAGS) |
| 66 | +get_target_property(LIBINTL_LDFLAGS libintl::static CONSUMER_LDFLAGS) |
| 67 | + |
| 68 | +# Prepare CRIU build flags |
| 69 | +set(CRIU_FEATURE_DEFINES "-DCONFIG_HAS_NFTABLES_LIB_API_1") |
| 70 | +set(CRIU_CFLAGS "${PROTOBUF_C_CFLAGS} ${CRIU_FEATURE_DEFINES} ${PROTOBUF_CFLAGS} ${LIBNET_CFLAGS} ${LIBNL_CFLAGS} ${LIBCAP_CFLAGS} ${LIBAIO_CFLAGS} ${ZLIB_CFLAGS} ${LIBNFTABLES_CFLAGS} ${LIBNFTNL_CFLAGS} ${LIBMNL_CFLAGS} ${LIBUUID_CFLAGS} ${LIBINTL_CFLAGS}") |
| 71 | +set(CRIU_LDFLAGS "-static ${PROTOBUF_C_LDFLAGS} ${PROTOBUF_LDFLAGS} ${LIBNET_LDFLAGS} ${LIBNL_LDFLAGS} ${LIBCAP_LDFLAGS} ${LIBAIO_LDFLAGS} ${ZLIB_LDFLAGS} ${LIBNFTABLES_LDFLAGS} ${LIBNFTNL_LDFLAGS} ${LIBMNL_LDFLAGS} ${LIBUUID_LDFLAGS} ${LIBINTL_LDFLAGS}") |
| 72 | + |
| 73 | +message("-- criu CFLAGS ${CRIU_CFLAGS}") |
| 74 | +message("-- criu LDFLAGS ${CRIU_LDFLAGS}") |
| 75 | + |
| 76 | +# CRIU build directories |
| 77 | +set(CRIU_BUILD_DIR ${CMAKE_BINARY_DIR}/criu-build) |
| 78 | +set(CRIU_INSTALL_DIR ${CMAKE_BINARY_DIR}/criu-install) |
| 79 | + |
| 80 | + |
| 81 | +set(CRIU_MAKE_VARS |
| 82 | + "PREFIX=${CRIU_INSTALL_DIR}" |
| 83 | +) |
| 84 | + |
| 85 | +register_dependency( |
| 86 | + criu |
| 87 | + "https://github.com/checkpoint-restore/criu/archive/refs/tags/v${CRIU_VERSION}.tar.gz" |
| 88 | + "${CRIU_SHASUM}" |
| 89 | + "COPYING" |
| 90 | +) |
| 91 | + |
| 92 | +ExternalProject_Add(criu |
| 93 | + URL ${DEP_criu_URL} |
| 94 | + URL_HASH SHA256=${DEP_criu_SHA256} |
| 95 | + UPDATE_DISCONNECTED 1 |
| 96 | + PATCH_COMMAND patch -p1 -i ${CMAKE_SOURCE_DIR}/patch/criu-build.patch |
| 97 | + CONFIGURE_COMMAND "" |
| 98 | + DOWNLOAD_DIR ${SOURCE_DOWNLOADS_DIR} |
| 99 | + DOWNLOAD_NAME ${DEP_criu_FILENAME} |
| 100 | + BUILD_COMMAND |
| 101 | + ${CMAKE_MAKE_PROGRAM} -C <SOURCE_DIR> ${CRIU_MAKE_VARS} mrproper |
| 102 | + COMMAND ${CMAKE_COMMAND} -E rm -f "<SOURCE_DIR>/images/google/protobuf/descriptor.proto" |
| 103 | + COMMAND ${CMAKE_COMMAND} -E copy "${DESCRIPTOR_PROTO_FILE}" "<SOURCE_DIR>/images/google/protobuf/descriptor.proto" |
| 104 | + COMMAND ${CMAKE_COMMAND} -E env |
| 105 | + "CFLAGS=${CRIU_CFLAGS}" |
| 106 | + "LDFLAGS=${CRIU_LDFLAGS}" |
| 107 | + "CC=${CMAKE_C_COMPILER}" |
| 108 | + "PATH=${PROTOC_BIN_PATH}:${PROTOC_C_BIN_PATH}:$ENV{PATH}" |
| 109 | + "SKIP_PIP_INSTALL=1" |
| 110 | + ${CMAKE_MAKE_PROGRAM} -C <SOURCE_DIR> ${CRIU_MAKE_VARS} -j${CMAKE_BUILD_PARALLEL_LEVEL} |
| 111 | + CONFIG_AMDGPU=n |
| 112 | + lib/c/built-in.o |
| 113 | + criu |
| 114 | + INSTALL_COMMAND |
| 115 | + ${CMAKE_COMMAND} -E make_directory ${CRIU_INSTALL_DIR}/lib |
| 116 | + COMMAND ${CMAKE_COMMAND} -E make_directory ${CRIU_INSTALL_DIR}/bin |
| 117 | + COMMAND ${CMAKE_COMMAND} -E copy <SOURCE_DIR>/lib/c/built-in.o ${CRIU_INSTALL_DIR}/lib/libcriu.o |
| 118 | + COMMAND ${CMAKE_COMMAND} -E copy <SOURCE_DIR>/lib/c/criu.h ${CRIU_INSTALL_DIR}/include/criu/criu.h |
| 119 | + COMMAND ${CMAKE_COMMAND} -E copy <SOURCE_DIR>/criu/include/version.h ${CRIU_INSTALL_DIR}/include/criu/version.h |
| 120 | + COMMAND ${CMAKE_COMMAND} -E copy <SOURCE_DIR>/images/rpc.pb-c.h ${CRIU_INSTALL_DIR}/include/criu/rpc.pb-c.h |
| 121 | + COMMAND ${CMAKE_COMMAND} -E copy <SOURCE_DIR>/criu/criu ${CRIU_INSTALL_DIR}/bin/criu |
| 122 | + BINARY_DIR ${CRIU_BUILD_DIR} |
| 123 | + DEPENDS protobuf::static protobuf-c::static libnet::static libnl::static libcap::static libaio::static zlib::static libmnl::static libnftnl::static libnftables::static uuid::static libintl::static |
| 124 | +) |
| 125 | + |
| 126 | +install(FILES ${CRIU_INSTALL_DIR}/lib/libcriu.o DESTINATION lib) |
| 127 | +install(PROGRAMS ${CRIU_INSTALL_DIR}/bin/criu DESTINATION bin) |
| 128 | +install(DIRECTORY ${CRIU_INSTALL_DIR}/include/criu DESTINATION include) |
| 129 | + |
| 130 | +install(DIRECTORY ${PROTOBUF_C_HEADER_DIR}/ DESTINATION include/) |
| 131 | + |
| 132 | +message(STATUS "CRIU configuration completed") |
| 133 | + |
| 134 | +# Install |
| 135 | +install(FILES CMakeLists.txt CMakePresets.json DESTINATION ${CMAKE_INSTALL_DOCDIR}) |
| 136 | + |
| 137 | +install(DIRECTORY patch/ DESTINATION ${CMAKE_INSTALL_DOCDIR}/patch) |
| 138 | +install(DIRECTORY macros/ DESTINATION ${CMAKE_INSTALL_DOCDIR}/macros) |
| 139 | +install(DIRECTORY dependencies/ DESTINATION ${CMAKE_INSTALL_DOCDIR}/dependencies) |
| 140 | +install(FILES CMakePresets.json package_deps_licenses.cmake.in DESTINATION ${CMAKE_INSTALL_DOCDIR}) |
| 141 | + |
| 142 | +include(check_musl.cmake) |
| 143 | +fetch_musl_license_if_needed() |
| 144 | + |
| 145 | +if(REGISTERED_DEPENDENCIES) |
| 146 | + list(REMOVE_DUPLICATES REGISTERED_DEPENDENCIES) |
| 147 | + |
| 148 | + set(CONSOLIDATED_LICENSE_FILE "${CMAKE_BINARY_DIR}/THIRD-PARTY-LICENSES.txt") |
| 149 | + |
| 150 | + configure_file( |
| 151 | + "${CMAKE_SOURCE_DIR}/package_deps_licenses.cmake.in" |
| 152 | + "${CMAKE_BINARY_DIR}/package_deps_licenses.cmake" |
| 153 | + @ONLY |
| 154 | + ) |
| 155 | + |
| 156 | + install(SCRIPT "${CMAKE_BINARY_DIR}/package_deps_licenses.cmake") |
| 157 | + install( |
| 158 | + DIRECTORY "${SOURCE_DOWNLOADS_DIR}/" |
| 159 | + DESTINATION "${CMAKE_INSTALL_DOCDIR}/third_party/sources" |
| 160 | + ) |
| 161 | + install(FILES "${CONSOLIDATED_LICENSE_FILE}" DESTINATION "${CMAKE_INSTALL_DOCDIR}/third_party") |
| 162 | + |
| 163 | + message(STATUS "Dependency download script configured for installation.") |
| 164 | +endif() |
| 165 | + |
| 166 | +# Detect target architecture |
| 167 | +if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)$") |
| 168 | + set(TARGET_ARCH "arm64") |
| 169 | +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|amd64)$") |
| 170 | + set(TARGET_ARCH "amd64") |
| 171 | +else() |
| 172 | + set(TARGET_ARCH "${CMAKE_SYSTEM_PROCESSOR}") |
| 173 | +endif() |
| 174 | + |
| 175 | +# Package |
| 176 | +set(CPACK_PACKAGE_NAME "criu-static") |
| 177 | +set(CPACK_PACKAGE_VERSION "${CRIU_VERSION}") |
| 178 | +set(CPACK_PACKAGE_VENDOR "The CRIU Authors") |
| 179 | +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Static build of CRIU (Checkpoint/Restore In Userspace)") |
| 180 | +set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md") |
| 181 | +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING") |
| 182 | +set(CPACK_SOURCE_GENERATOR "TGZ;STGZ") |
| 183 | +set(CPACK_GENERATOR "TGZ;STGZ") |
| 184 | +set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-linux-${TARGET_ARCH}") |
| 185 | +set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-source") |
| 186 | +include(CPack) |
0 commit comments