]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
CMake/Windows: Add a workaround for windres from GNU binutils.
authorLasse Collin <lasse.collin@tukaani.org>
Tue, 10 Jan 2023 06:50:26 +0000 (08:50 +0200)
committerLasse Collin <lasse.collin@tukaani.org>
Sat, 11 Mar 2023 19:34:26 +0000 (21:34 +0200)
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.

CMakeLists.txt

index 82449090ff007055b6bcd60c294ab70c738476e8..9a66310b519ad0f7d3d730ff4f8300cd0af0d8de 100644 (file)
@@ -72,10 +72,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/"