mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-06 10:57:35 +03:00
117 lines
5.9 KiB
CMake
117 lines
5.9 KiB
CMake
# - Preset cross-compilation configurations for C/ASM and D compilation
|
|
# and linking, for supported targets
|
|
#
|
|
# This module sets compiler flags for a few C and assembly files in
|
|
# DRuntime and Phobos, and linker flags to link the standard library as
|
|
# a shared library and build the test runners, for various
|
|
# cross-compilation targets that the LDC developers have tried out.
|
|
#
|
|
# It is enabled by setting LDC_TARGET_PRESET to a supported platform,
|
|
# after which the appropriate TARGET_SYSTEM is set and a target triple
|
|
# is appended to D_FLAGS.
|
|
#
|
|
# You can pass in custom RT_CFLAGS and LD_FLAGS of your choosing, but
|
|
# if they're left unconfigured, they will also be set to sensible
|
|
# defaults.
|
|
|
|
if(NOT LDC_TARGET_PRESET STREQUAL "")
|
|
if(LDC_TARGET_PRESET MATCHES "Android")
|
|
set(ANDROID_API "21")
|
|
endif()
|
|
# This initial RT_CFLAGS/LD_FLAGS configuration for Android is a
|
|
# convenience for natively compiling, because CMake cannot detect
|
|
# Android as a separate platform from Linux.
|
|
if(RT_CFLAGS STREQUAL "" AND LDC_TARGET_PRESET MATCHES "Android")
|
|
set(RT_CFLAGS_UNCONFIGURED True)
|
|
set(RT_CFLAGS "-ffunction-sections -fdata-sections -funwind-tables -fstack-protector-strong -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -no-canonical-prefixes -g -DNDEBUG -DANDROID -D__ANDROID_API__=${ANDROID_API} -Wa,--noexecstack -Wformat -Werror=format-security")
|
|
|
|
if(LDC_TARGET_PRESET MATCHES "arm")
|
|
append("-target armv7-none-linux-androideabi${ANDROID_API} -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Oz" RT_CFLAGS)
|
|
elseif(LDC_TARGET_PRESET MATCHES "aarch64")
|
|
append("-target aarch64-none-linux-android -O2" RT_CFLAGS)
|
|
elseif(LDC_TARGET_PRESET MATCHES "x86")
|
|
append("-target i686-none-linux-android -O2 -mstackrealign" RT_CFLAGS)
|
|
elseif(LDC_TARGET_PRESET MATCHES "x64")
|
|
append("-target x86_64-none-linux-android${ANDROID_API} -O2" RT_CFLAGS)
|
|
endif()
|
|
endif()
|
|
|
|
if(LD_FLAGS STREQUAL "" AND LDC_TARGET_PRESET MATCHES "Android")
|
|
set(LD_FLAGS_UNCONFIGURED True)
|
|
set(LD_FLAGS "-Wl,--gc-sections -Wl,-z,nocopyreloc -no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings -fpie -pie")
|
|
|
|
if(LDC_TARGET_PRESET MATCHES "arm")
|
|
append("-target armv7-none-linux-androideabi${ANDROID_API} -Wl,--fix-cortex-a8" LD_FLAGS)
|
|
elseif(LDC_TARGET_PRESET MATCHES "aarch64")
|
|
append("-target aarch64-none-linux-android" LD_FLAGS)
|
|
elseif(LDC_TARGET_PRESET MATCHES "x86")
|
|
append("-target i686-none-linux-android${ANDROID_API}" LD_FLAGS)
|
|
elseif(LDC_TARGET_PRESET MATCHES "x64")
|
|
append("-target x86_64-none-linux-android${ANDROID_API}" LD_FLAGS)
|
|
endif()
|
|
endif()
|
|
|
|
if(LDC_TARGET_PRESET MATCHES "Windows")
|
|
set(TARGET_SYSTEM "Windows;MSVC")
|
|
if(LDC_TARGET_PRESET MATCHES "x64")
|
|
# stub example, fill in with the rest
|
|
list(APPEND D_FLAGS "-mtriple=x86_64-pc-windows-msvc")
|
|
endif()
|
|
elseif(LDC_TARGET_PRESET MATCHES "Android")
|
|
set(TARGET_SYSTEM "Android;Linux;UNIX")
|
|
|
|
if(LDC_TARGET_PRESET MATCHES "arm")
|
|
set(TARGET_ARCH "arm")
|
|
set(LLVM_TARGET_TRIPLE "armv7-none-linux-android")
|
|
set(TOOLCHAIN "arm-linux-androideabi")
|
|
set(TOOLCHAIN_TARGET_TRIPLE "arm-linux-androideabi")
|
|
elseif(LDC_TARGET_PRESET MATCHES "aarch64")
|
|
set(TARGET_ARCH "arm64")
|
|
set(LLVM_TARGET_TRIPLE "aarch64-none-linux-android")
|
|
set(TOOLCHAIN "aarch64-linux-android")
|
|
set(TOOLCHAIN_TARGET_TRIPLE "aarch64-linux-android")
|
|
elseif(LDC_TARGET_PRESET MATCHES "x86")
|
|
set(TARGET_ARCH "x86")
|
|
set(LLVM_TARGET_TRIPLE "i686-none-linux-android")
|
|
set(TOOLCHAIN "x86")
|
|
set(TOOLCHAIN_TARGET_TRIPLE "i686-linux-android")
|
|
elseif(LDC_TARGET_PRESET MATCHES "x64")
|
|
set(TARGET_ARCH "x86_64")
|
|
set(LLVM_TARGET_TRIPLE "x86_64-none-linux-android")
|
|
set(TOOLCHAIN "x86_64")
|
|
set(TOOLCHAIN_TARGET_TRIPLE "x86_64-linux-android")
|
|
else()
|
|
message(FATAL_ERROR "Android platform ${LDC_TARGET_PRESET} is not supported.")
|
|
endif()
|
|
list(APPEND D_FLAGS "-mtriple=${LLVM_TARGET_TRIPLE}")
|
|
|
|
# Check if we're using the NDK by looking for the toolchains
|
|
# directory in CC
|
|
if(CMAKE_C_COMPILER MATCHES "toolchains")
|
|
# Extract the NDK path and platform from CC
|
|
string(REGEX REPLACE ".toolchains.+" "" NDK_PATH ${CMAKE_C_COMPILER})
|
|
string(REGEX REPLACE ".+/prebuilt/([^/]+)/.+" "\\1" NDK_HOST_PLATFORM ${CMAKE_C_COMPILER})
|
|
set(TOOLCHAIN_VERSION "4.9")
|
|
|
|
if(RT_CFLAGS_UNCONFIGURED)
|
|
append("-gcc-toolchain ${NDK_PATH}/toolchains/${TOOLCHAIN}-${TOOLCHAIN_VERSION}/prebuilt/${NDK_HOST_PLATFORM} --sysroot ${NDK_PATH}/sysroot -isystem ${NDK_PATH}/sysroot/usr/include/${TOOLCHAIN_TARGET_TRIPLE}" RT_CFLAGS)
|
|
|
|
if(LDC_TARGET_PRESET MATCHES "arm")
|
|
append("-fno-integrated-as" RT_CFLAGS)
|
|
endif()
|
|
endif()
|
|
|
|
if(LD_FLAGS_UNCONFIGURED)
|
|
set(LD_BFD "-fuse-ld=bfd")
|
|
# work around Windows bug, android-ndk/ndk#75
|
|
if(NDK_HOST_PLATFORM MATCHES "windows")
|
|
set(LD_BFD "${LD_BFD}.exe")
|
|
endif()
|
|
|
|
append("--sysroot=${NDK_PATH}/platforms/android-${ANDROID_API}/arch-${TARGET_ARCH} -gcc-toolchain ${NDK_PATH}/toolchains/${TOOLCHAIN}-${TOOLCHAIN_VERSION}/prebuilt/${NDK_HOST_PLATFORM} ${LD_BFD}" LD_FLAGS)
|
|
endif()
|
|
endif()
|
|
else()
|
|
message(FATAL_ERROR "LDC_TARGET_PRESET ${LDC_TARGET_PRESET} is not supported yet, pull requests to add common flags are welcome.")
|
|
endif()
|
|
endif()
|