From f2192d13b5723e4869bb7f1b18c4b21cd72975af Mon Sep 17 00:00:00 2001 From: Lasse Collin Date: Tue, 10 Jan 2023 08:50:26 +0200 Subject: [PATCH] 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. --- CMakeLists.txt | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 82449090..9a66310b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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/"