aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2023-01-10 08:50:26 +0200
committerLasse Collin <lasse.collin@tukaani.org>2023-01-10 08:50:26 +0200
commit65c59ad429aa59f9df0326d9fc82931ba4a9d123 (patch)
treec1782b9916d0147ccd92bc3529384243c04f2f38
parentTests: test_filter_flags: Clean up minor issues. (diff)
downloadxz-65c59ad429aa59f9df0326d9fc82931ba4a9d123.tar.xz
CMake/Windows: Add a workaround for windres from GNU binutils.
This is combined from the following commits in the master branch: 443dfebced041adc88f10d824188eeef5b5821a9 6b117d3b1fe91eb26d533ab16a2e552f84148d47 5e34774c31d1b7509b5cb77a3be9973adec59ea0 Thanks to Iouri Kharon for the bug report, the original patch, and testing.
-rw-r--r--CMakeLists.txt32
1 files changed, 31 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 21da948f..e5b4e5b5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -75,10 +75,40 @@ project(xz VERSION "${XZ_VERSION}" LANGUAGES C)
# On Apple OSes, don't build executables as bundles:
set(CMAKE_MACOSX_BUNDLE OFF)
+# windres from GNU binutils can be tricky with command line arguments
+# that contain spaces or other funny characters. Unfortunately we need
+# a space in PACKAGE_NAME. Using \x20 to encode the US-ASCII space seems
+# to work in both cmd.exe and /bin/sh.
+#
+# However, even \x20 isn't enough in all situations, resulting in
+# "syntax error" from windres. Using --use-temp-file prevents windres
+# from using popen() and this seems to fix the problem.
+#
+# llvm-windres claims to be compatible with GNU windres but with that
+# the \x20 results in "XZx20Utils" in the compiled binary. (At the
+# same time it works correctly with clang (the C compiler).) The option
+# --use-temp-file makes no difference.
+#
+# CMake 3.25 doesn't have CMAKE_RC_COMPILER_ID so we rely on
+# CMAKE_C_COMPILER_ID. If Clang is used together with GNU windres
+# then it will fail, but this way the risk of a bad string in
+# the binary should be fairly low.
+if(WIN32 AND CMAKE_C_COMPILER_ID STREQUAL "GNU")
+ # Use workarounds with GNU windres. The \x20 in PACKAGE_NAME works
+ # with gcc too so we don't need to worry how to pass different flags
+ # to windres and gcc.
+ string(APPEND CMAKE_RC_FLAGS " --use-temp-file")
+ set(PACKAGE_NAME "XZ\\x20Utils")
+else()
+ # Elsewhere a space is safe. This also keeps things compatible with
+ # EBCDIC in case CMake-based build is ever done on such a system.
+ set(PACKAGE_NAME "XZ Utils")
+endif()
+
# Definitions common to all targets:
add_compile_definitions(
# Package info:
- PACKAGE_NAME="XZ Utils"
+ PACKAGE_NAME="${PACKAGE_NAME}"
PACKAGE_BUGREPORT="xz@tukaani.org"
PACKAGE_URL="https://tukaani.org/xz/"