diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2023-01-10 08:50:26 +0200 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2023-03-11 21:34:26 +0200 |
commit | f2192d13b5723e4869bb7f1b18c4b21cd72975af (patch) | |
tree | ad2b458217fbba7427b1173e7c2e7dddfb26b4f4 | |
parent | CMake: Update cmake_minimum_required from 3.13...3.16 to 3.13...3.25. (diff) | |
download | xz-f2192d13b5723e4869bb7f1b18c4b21cd72975af.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.txt | 32 |
1 files changed, 31 insertions, 1 deletions
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/" |