aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2023-01-09 23:41:25 +0200
committerLasse Collin <lasse.collin@tukaani.org>2023-01-09 23:41:25 +0200
commit6b117d3b1fe91eb26d533ab16a2e552f84148d47 (patch)
tree8cba8e9ccdd91171b225fbdc1ec2b14aaec483f2
parentTests: test_filter_flags: Clean up minor issues. (diff)
downloadxz-6b117d3b1fe91eb26d533ab16a2e552f84148d47.tar.xz
CMake: Fix windres issues again.
At least on some systems, GNU windres needs --use-temp-file in addition to the \x20 hack to avoid spaces in the command line argument. Hovever, that \x20 syntax is broken with llvm-windres version 15.0.0 (results in "XZx20Utils") but luckily it works with a regular space. Thus it is best to limit the workarounds to GNU toolchain on Windows.
-rw-r--r--CMakeLists.txt35
1 files changed, 23 insertions, 12 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f6bad610..f3d5fc76 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -75,22 +75,33 @@ project(xz VERSION "${XZ_VERSION}" LANGUAGES C)
# On Apple OSes, don't build executables as bundles:
set(CMAKE_MACOSX_BUNDLE OFF)
-# String for PACKAGE_NAME macro in the C code and Windows resource files:
+# 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.
#
-# windres from GNU binutils can be a bit tricky with command line arguments
-# that contain spaces or other funny characters because it will pass them
-# to a shell (cmd.exe or /bin/sh). CMake doesn't seem to handle the quoting
-# well enough either. Using \x20 to encode the US-ASCII space seems to work:
-# it should be compatible with both shell types, it works also with llvm-rc,
-# and CMake handles quoting the backslash too.
+# 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.
#
-# For simplicity, use this workaround in all cases on Windows as it should
-# do no harm with other toolchains. Outside Windows use a regular space as
-# then we are compatible with EBCDIC too (if it will ever matter with CMake;
-# EBCDIC compatibility is important with the Autotools-based build though).
-if(WIN32)
+# 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.
+ list(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()