#
# CMake support for building XZ Utils
#
-# CMake 3.20 or later is recommended. Older versions down to 3.14 work
-# too with the following limitations:
+# Requirements:
#
-# - Translations aren't supported.
+# - CMake 3.20 or later
#
-# - Generated liblzma.pc won't be relocatable.
+# - To get translated messages, install GNU gettext tools (the command
+# msgfmt is needed). Alternatively disable translations by setting
+# XZ_NLS=OFF.
#
-# To get translated messages, install GNU gettext tools (the command msgfmt
-# is needed). Alternatively disable translations by setting XZ_NLS=OFF.
-#
-# If building from xz.git instead of a release tarball: To generate
-# translated man pages, run po4a/update-po which requires the po4a tool.
-# The build works without this step too.
+# - If building from xz.git instead of a release tarball: To generate
+# translated man pages, run po4a/update-po which requires the po4a
+# tool. The build works without this step too.
#
# About CMAKE_BUILD_TYPE:
#
#
#############################################################################
-# NOTE: Translation support is disabled with CMake older than 3.20.
-cmake_minimum_required(VERSION 3.14...3.29 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.20...3.29 FATAL_ERROR)
include(CMakePushCheckState)
include(CheckIncludeFile)
# With glibc <= 2.17 or Solaris 10 this needs librt.
# Add librt for the next check for HAVE_CLOCK_GETTIME. If it is
# found after including the library, we know that librt is required.
- list(INSERT CMAKE_REQUIRED_LIBRARIES 0 rt)
+ list(PREPEND CMAKE_REQUIRED_LIBRARIES rt)
check_symbol_exists(clock_gettime time.h HAVE_CLOCK_GETTIME_LIBRT)
# If it was found now, add librt to all targets and keep it in
link_libraries(rt)
set(LIBS "-lrt ${LIBS}") # For liblzma.pc
else()
- list(REMOVE_AT CMAKE_REQUIRED_LIBRARIES 0)
+ list(POP_FRONT CMAKE_REQUIRED_LIBRARIES)
endif()
endif()
endif()
-# Translation support requires CMake 3.20 because it added the Intl::Intl
-# target so we don't need to play with the individual variables.
-#
# The definition ENABLE_NLS is added only to those targets that use it, thus
# it's not done here. (xz has translations, xzdec doesn't.)
set(XZ_NLS_DEFAULT OFF)
-if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20")
- find_package(Intl)
- find_package(Gettext)
-
- if(Intl_FOUND AND GETTEXT_FOUND)
- set(XZ_NLS_DEFAULT ON)
- endif()
+find_package(Intl)
+find_package(Gettext)
+if(Intl_FOUND AND GETTEXT_FOUND)
+ set(XZ_NLS_DEFAULT ON)
endif()
option(XZ_NLS "Native Language Support (translated messages and man pages)"
"${XZ_NLS_DEFAULT}")
if(XZ_NLS)
- if(CMAKE_VERSION VERSION_LESS "3.20")
- message(FATAL_ERROR "Native language support (NLS) requires "
- "CMake >= 3.20. "
- "Upgrade to a newer CMake or set XZ_NLS=OFF.")
- endif()
-
if(NOT Intl_FOUND)
message(FATAL_ERROR "Native language support (NLS) was enabled but "
"find_package(Intl) failed. "
# Make the thread libs available in later checks. In practice
# only pthread_condattr_setclock check should need this.
- list(INSERT CMAKE_REQUIRED_LIBRARIES 0 "${CMAKE_THREAD_LIBS_INIT}")
+ list(PREPEND CMAKE_REQUIRED_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}")
# Check if pthread_condattr_setclock() exists to
# use CLOCK_MONOTONIC.
else()
# Try with libmd. Other checks don't need it so we
# don't need to leave it into CMAKE_REQUIRED_LIBRARIES.
- list(INSERT CMAKE_REQUIRED_LIBRARIES 0 md)
+ list(PREPEND CMAKE_REQUIRED_LIBRARIES md)
check_c_source_compiles("${SOURCE}" "${HAVE_X}_LIBMD")
- list(REMOVE_AT CMAKE_REQUIRED_LIBRARIES 0)
+ list(POP_FRONT CMAKE_REQUIRED_LIBRARIES)
if(${HAVE_X}_LIBMD)
# NOTE: Just "${HAVE_X}", not "${HAVE_X}_LIBMD":
target_compile_definitions(liblzma PRIVATE
"${LZMA_CONFIG_CONTENTS}")
-# Create liblzma.pc. If using CMake >= 3.20 and CMAKE_INSTALL_<dir> paths
-# are relative to CMAKE_INSTALL_PREFIX, the .pc file will be relocatable
-# (that is, all paths will be relative to ${prefix}). Otherwise absolute
+# Create liblzma.pc. If CMAKE_INSTALL_<dir> paths are relative to
+# CMAKE_INSTALL_PREFIX, the .pc file will be relocatable (that is,
+# all paths will be relative to ${prefix}). Otherwise absolute
# paths will be used.
set(prefix "${CMAKE_INSTALL_PREFIX}")
set(exec_prefix "\${prefix}")
-
-if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20")
- cmake_path(APPEND libdir "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}")
- cmake_path(APPEND includedir "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
-else()
- set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
- set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
-endif()
+cmake_path(APPEND libdir "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}")
+cmake_path(APPEND includedir "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
# Threads::Threads is linked in only when using POSIX threads.
# Use an empty value if using Windows threads or if threading is disabled.
foreach(S xzdiff xzgrep xzmore xzless)
configure_file("src/scripts/${S}.in" "${S}"
@ONLY
- NEWLINE_STYLE LF)
+ NEWLINE_STYLE LF
+ FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
+ GROUP_READ GROUP_EXECUTE
+ WORLD_READ WORLD_EXECUTE)
if(ENABLE_SCRIPTS)
install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/${S}"
endif()
endforeach()
- # file(CHMOD ...) would need CMake 3.19 so use execute_process instead.
- # Using +x is fine even if umask was 077. If execute bit is set at all
- # then "make install" will set it for group and other access bits too.
- execute_process(COMMAND chmod +x xzdiff xzgrep xzmore xzless
- WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
-
unset(xz)
unset(POSIX_SHELL)
unset(enable_path_for_scripts)