Skip to content

Commit

Permalink
wrappers: add CMake toolchain files
Browse files Browse the repository at this point in the history
Those toolchain files greatly simplify configuring a project
to use the llvm-mingw toolchain.
  • Loading branch information
nolange committed Aug 3, 2024
1 parent 462aee2 commit 0e1552a
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 0 deletions.
13 changes: 13 additions & 0 deletions install-wrappers.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
84 changes: 84 additions & 0 deletions wrappers/llvm-mingw_toolchainfile.cmake.in
Original file line number Diff line number Diff line change
@@ -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)
3 changes: 3 additions & 0 deletions wrappers/llvm-mingw_toolchainfile_arch.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
set(CMAKE_SYSTEM_PROCESSOR @ARCH@)

include("${CMAKE_CURRENT_LIST_DIR}/llvm-mingw_toolchainfile.cmake")
15 changes: 15 additions & 0 deletions wrappers/llvm-mingw_toolchainfile_arch_uwp.cmake.in
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit 0e1552a

Please sign in to comment.