From 0e1552a8b75574ffab2563b8d0b76edaff6e637c Mon Sep 17 00:00:00 2001 From: Norbert Lange Date: Mon, 3 Jun 2024 01:34:43 +0200 Subject: [PATCH] wrappers: add CMake toolchain files Those toolchain files greatly simplify configuring a project to use the llvm-mingw toolchain. --- install-wrappers.sh | 13 +++ wrappers/llvm-mingw_toolchainfile.cmake.in | 84 +++++++++++++++++++ .../llvm-mingw_toolchainfile_arch.cmake.in | 3 + ...llvm-mingw_toolchainfile_arch_uwp.cmake.in | 15 ++++ 4 files changed, 115 insertions(+) create mode 100644 wrappers/llvm-mingw_toolchainfile.cmake.in create mode 100644 wrappers/llvm-mingw_toolchainfile_arch.cmake.in create mode 100644 wrappers/llvm-mingw_toolchainfile_arch_uwp.cmake.in diff --git a/install-wrappers.sh b/install-wrappers.sh index 31ed31e2..1f635a39 100755 --- a/install-wrappers.sh +++ b/install-wrappers.sh @@ -141,6 +141,19 @@ if [ -n "$EXEEXT" ]; then else CTW_SUFFIX=.sh fi +toolchainfile_path=share/cmake; toolchainfile_rev=../.. +mkdir -p "$PREFIX/$toolchainfile_path" +sed "s,@RELPATH@,$toolchainfile_rev,g" wrappers/llvm-mingw_toolchainfile.cmake.in >"$PREFIX/$toolchainfile_path/llvm-mingw_toolchainfile.cmake" +for target_os in $TARGET_OSES; do + templ= + [ $target_os = mingw32 ] && templ=wrappers/llvm-mingw_toolchainfile_arch.cmake.in + [ $target_os = mingw32uwp ] && templ=wrappers/llvm-mingw_toolchainfile_arch_uwp.cmake.in + [ -n "$templ" ] || continue + + for arch in $ARCHS; do + sed "s,@ARCH@,${arch},g" $templ >"$PREFIX/$toolchainfile_path/${arch}-w64-${target_os}_toolchainfile.cmake" + done +done cd "$PREFIX/bin" for arch in $ARCHS; do for target_os in $TARGET_OSES; do diff --git a/wrappers/llvm-mingw_toolchainfile.cmake.in b/wrappers/llvm-mingw_toolchainfile.cmake.in new file mode 100644 index 00000000..422a1235 --- /dev/null +++ b/wrappers/llvm-mingw_toolchainfile.cmake.in @@ -0,0 +1,84 @@ +if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") + set(_prefix "${CMAKE_CURRENT_LIST_DIR}/@RELPATH@/") + cmake_path(ABSOLUTE_PATH _prefix NORMALIZE) +else() + get_filename_component(_prefix "${CMAKE_CURRENT_LIST_DIR}/@RELPATH@/" ABSOLUTE) +endif() + +if(NOT CMAKE_SYSTEM_NAME) + set(CMAKE_SYSTEM_NAME Windows) +endif() +if(NOT CMAKE_SYSTEM_PROCESSOR) + set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR}) + if(CMAKE_HOST_WIN32) + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") + set(CMAKE_SYSTEM_PROCESSOR aarch64) + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^ARM") + set(CMAKE_SYSTEM_PROCESSOR armv7) + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^[Xx]86$") + set(CMAKE_SYSTEM_PROCESSOR i686) + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "^[Xx]64$") + set(CMAKE_SYSTEM_PROCESSOR x86_64) + endif() + endif() +endif() + +set(CMAKE_SYSROOT "${_prefix}${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32") + +if(NOT "$ENV{PKG_CONFIG_LIBDIR}" STREQUAL "") + set(_respath "${CMAKE_SYSROOT}/lib/pkgconfig:${CMAKE_SYSROOT}/share/pkgconfig:$ENV{PKG_CONFIG_LIBDIR}") +else() + set(_respath "${CMAKE_SYSROOT}/lib/pkgconfig:${CMAKE_SYSROOT}/share/pkgconfig") +endif() + +if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") + cmake_path(CONVERT _respath TO_NATIVE_PATH_LIST _respath) + set(ENV{PKG_CONFIG_LIBDIR} "${_respath}") + cmake_path(NATIVE_PATH CMAKE_SYSROOT _respath) + set(ENV{PKG_CONFIG_SYSROOT_DIR} "${_respath}") +else() + file(TO_NATIVE_PATH "${_respath}" _respath) + set(ENV{PKG_CONFIG_LIBDIR} "${_respath}") + file(TO_NATIVE_PATH "${CMAKE_SYSROOT}" _respath) + set(ENV{PKG_CONFIG_SYSROOT_DIR} "${_respath}") +endif() + +# set these before find_program! +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +set(_linker lld) +set(_exesuff) +if(CMAKE_HOST_WIN32) +set(_exesuff .exe) +endif() +set(CMAKE_ASM_COMPILER "${_prefix}bin/clang${_exesuff}") +set(CMAKE_C_COMPILER "${_prefix}bin/clang${_exesuff}") +set(CMAKE_CXX_COMPILER "${_prefix}bin/clang++${_exesuff}") +set(CMAKE_RC_COMPILER "${_prefix}bin/llvm-rc${_exesuff}") +set(CMAKE_LINKER "${_prefix}bin/ld.${_linker}${_exesuff}") +unset(_exesuff) + +unset(_prefix) +unset(_respath) + +set(CMAKE_C_COMPILER_TARGET ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32) +set(CMAKE_CXX_COMPILER_TARGET ${CMAKE_C_COMPILER_TARGET}) +set(CMAKE_ASM_COMPILER_TARGET ${CMAKE_C_COMPILER_TARGET}) + +set(CMAKE_CXX_FLAGS_INIT "-stdlib=libc++") + +if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.29") + string(TOUPPER ${_linker} CMAKE_LINKER_TYPE) + set(_linker) +else() + set(_linker " -fuse-ld=${_linker}") +endif() + +# CMAKE_CXX_FLAGS is automatically added now, but might be needed to add -stdlib=libc++ for really old CMake Versions +set(CMAKE_EXE_LINKER_FLAGS_INIT "--start-no-unused-arguments -rtlib=compiler-rt -unwindlib=libunwind --end-no-unused-arguments${_linker}") +set(CMAKE_MODULE_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT}") +set(CMAKE_SHARED_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT}") +unset(_linker) diff --git a/wrappers/llvm-mingw_toolchainfile_arch.cmake.in b/wrappers/llvm-mingw_toolchainfile_arch.cmake.in new file mode 100644 index 00000000..36bb795a --- /dev/null +++ b/wrappers/llvm-mingw_toolchainfile_arch.cmake.in @@ -0,0 +1,3 @@ +set(CMAKE_SYSTEM_PROCESSOR @ARCH@) + +include("${CMAKE_CURRENT_LIST_DIR}/llvm-mingw_toolchainfile.cmake") diff --git a/wrappers/llvm-mingw_toolchainfile_arch_uwp.cmake.in b/wrappers/llvm-mingw_toolchainfile_arch_uwp.cmake.in new file mode 100644 index 00000000..920e83f0 --- /dev/null +++ b/wrappers/llvm-mingw_toolchainfile_arch_uwp.cmake.in @@ -0,0 +1,15 @@ +# WindowsStore an UWP app - doesn't seem to have any effect outside of Visual Studio generators +# https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-windows-10-universal-applications +set(CMAKE_SYSTEM_NAME WindowsStore) +set(CMAKE_SYSTEM_VERSION 10) +set(CMAKE_SYSTEM_PROCESSOR @ARCH@) + +include("${CMAKE_CURRENT_LIST_DIR}/llvm-mingw_toolchainfile.cmake") + +set(CMAKE_C_FLAGS_INIT "-D_WIN32_WINNT=0x0A00 -DWINVER=0x0A00 -DWINAPI_FAMILY=WINAPI_FAMILY_APP -DUNICODE -D_UCRT") +set(CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS_INIT} ${CMAKE_C_FLAGS_INIT}") +set(CMAKE_ASM_FLAGS_INIT "${CMAKE_C_FLAGS_INIT}") + +# Cant extend the content written in CMake's Modules/Platform/Windows-GNU.cmake. Replace it +set(CMAKE_C_STANDARD_LIBRARIES "-lwindowsapp -lucrtapp -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32" CACHE STRING "Libraries linked by default with all C applications" FORCE) +set(CMAKE_CXX_STANDARD_LIBRARIES "-lwindowsapp -lucrtapp -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32" CACHE STRING "Libraries linked by default with all C++ applications" FORCE)