Skip to content

Commit ee5e11a

Browse files
committed
build: allow configuration of the system header location
Rather than hardcoding the paths to /usr/include, allow the user to set the path to their libc headers. This is particularly important for environments which may not use the traditional layout (e.g. exherbo) or for builds which wish to build against an out-of-tree, non-system installed libc for a Unix target which does not match the host system (i.e. foreign cross-compilation).
1 parent fe86fa8 commit ee5e11a

File tree

2 files changed

+21
-37
lines changed

2 files changed

+21
-37
lines changed

cmake/modules/SwiftConfigureSDK.cmake

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ function(_report_sdk prefix)
6161
endif()
6262

6363
if(NOT prefix IN_LIST SWIFT_APPLE_PLATFORMS)
64+
foreach(arch ${SWIFT_SDK_${prefix}_ARCHITECTURES})
65+
message(STATUS " ${arch} libc header path: ${SWIFT_SDK_${prefix}_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY}")
66+
message(STATUS " ${arch} libc architecture specific header path: ${SWIFT_SDK_${prefix}_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY}")
67+
endforeach()
6468
if(SWIFT_BUILD_STDLIB)
6569
foreach(arch ${SWIFT_SDK_${prefix}_ARCHITECTURES})
6670
message(STATUS " ${arch} ICU i18n INCLUDE: ${SWIFT_${prefix}_${arch}_ICU_I18N_INCLUDE}")
@@ -200,6 +204,9 @@ macro(configure_sdk_unix name architectures)
200204

201205
foreach(arch ${architectures})
202206
if("${prefix}" STREQUAL "ANDROID")
207+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include" CACHE STRING "Path to C library headers")
208+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include" CACHE STRING "Path to C library architecture headers")
209+
203210
if("${arch}" STREQUAL "armv7")
204211
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "arm-linux-androideabi")
205212
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "arm")
@@ -248,6 +255,13 @@ macro(configure_sdk_unix name architectures)
248255
if(NOT SWIFT_SDK_${prefix}_ARCH_${arch}_PATH)
249256
set(SWIFT_SDK_${prefix}_ARCH_${arch}_PATH "/")
250257
endif()
258+
if("${prefix}" STREQUAL "HAIKU")
259+
set(SWIFT_SDK_HAIKU_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "/system/develop/headers/posix" CACHE STRING "Path to C library headers")
260+
set(SWIFT_SDK_HAIKU_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "/system/develop/headers" CACHE STRING "Path to C library architecture headers")
261+
else()
262+
set(SWIFT_SDK_${prefix}_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "/usr/include" CACHE STRING "Path to C library headers")
263+
set(SWIFT_SDK_${prefix}_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${SWIFT_SDK_${prefix}_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY}/${CMAKE_LIBRARY_ARCHITECTURE}" CACHE STRING "Path to C library architecture headers")
264+
endif()
251265

252266
if("${prefix}" STREQUAL "LINUX")
253267
if(arch MATCHES "(armv6|armv7)")

stdlib/public/Platform/CMakeLists.txt

Lines changed: 7 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -67,34 +67,6 @@ foreach(sdk ${SWIFT_SDKS})
6767
set(arch_subdir "${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${arch}")
6868
set(module_dir "${SWIFTLIB_DIR}/${arch_subdir}")
6969

70-
if("${sdk}" STREQUAL "HAIKU")
71-
# Haiku doesn't have /usr/include, instead the headers are located
72-
# at /system/develop/headers.
73-
set(GLIBC_INCLUDE_PATH "/system/develop/headers/posix")
74-
set(GLIBC_ARCH_INCLUDE_PATH "/system/develop/headers/posix")
75-
set(GLIBC_SYSROOT_RELATIVE_ARCH_INCLUDE_PATH "/system/develop/headers/")
76-
elseif("${sdk}" STREQUAL "ANDROID")
77-
set(GLIBC_SYSROOT_RELATIVE_INCLUDE_PATH "${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include")
78-
set(GLIBC_SYSROOT_RELATIVE_ARCH_INCLUDE_PATH "${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include")
79-
else()
80-
# Determine the location of glibc headers based on the target.
81-
set(GLIBC_SYSROOT_RELATIVE_INCLUDE_PATH "/usr/include")
82-
set(GLIBC_SYSROOT_RELATIVE_ARCH_INCLUDE_PATH "${GLIBC_SYSROOT_RELATIVE_INCLUDE_PATH}")
83-
endif()
84-
85-
# Some SDKs place their headers in architecture-specific subfolders.
86-
if((${sdk} STREQUAL "LINUX" OR ${sdk} STREQUAL "FREEBSD") AND CMAKE_LIBRARY_ARCHITECTURE)
87-
set(GLIBC_SYSROOT_RELATIVE_ARCH_INCLUDE_PATH "${GLIBC_SYSROOT_RELATIVE_ARCH_INCLUDE_PATH}/${CMAKE_LIBRARY_ARCHITECTURE}")
88-
endif()
89-
90-
set(GLIBC_INCLUDE_PATH "${GLIBC_SYSROOT_RELATIVE_INCLUDE_PATH}")
91-
set(GLIBC_ARCH_INCLUDE_PATH "${GLIBC_SYSROOT_RELATIVE_ARCH_INCLUDE_PATH}")
92-
93-
if(NOT "${SWIFT_SDK_${sdk}_ARCH_${arch}_PATH}" STREQUAL "/" AND NOT "${sdk}" STREQUAL "ANDROID")
94-
set(GLIBC_INCLUDE_PATH "${SWIFT_SDK_${sdk}_ARCH_${arch}_PATH}${GLIBC_INCLUDE_PATH}")
95-
set(GLIBC_ARCH_INCLUDE_PATH "${SWIFT_SDK_${sdk}_ARCH_${arch}_PATH}${GLIBC_ARCH_INCLUDE_PATH}")
96-
endif()
97-
9870
if(${sdk} STREQUAL ANDROID)
9971
set(glibc_modulemap_source "bionic.modulemap.gyb")
10072
else()
@@ -111,23 +83,21 @@ foreach(sdk ${SWIFT_SDKS})
11183
OUTPUT "${glibc_modulemap_out}"
11284
FLAGS
11385
"-DCMAKE_SDK=${sdk}"
114-
"-DGLIBC_INCLUDE_PATH=${GLIBC_INCLUDE_PATH}"
115-
"-DGLIBC_ARCH_INCLUDE_PATH=${GLIBC_ARCH_INCLUDE_PATH}")
86+
"-DGLIBC_INCLUDE_PATH=${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_ARCH_${arch}_PATH}${SWIFT_SDK_${sdk}_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY}"
87+
"-DGLIBC_ARCH_INCLUDE_PATH=${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_ARCH_${arch}_PATH}${SWIFT_SDK_${sdk}_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY}")
11688

11789
list(APPEND glibc_modulemap_target_list ${glibc_modulemap_target})
11890

11991
# If this SDK is a target for a non-native host, create a native modulemap
12092
# without a sysroot prefix. This is the one we'll install instead.
12193
if(NOT "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_ARCH_${arch}_PATH}" STREQUAL "/")
122-
12394
set(glibc_sysroot_relative_modulemap_out "${module_dir}/sysroot-relative-modulemaps/glibc.modulemap")
12495
handle_gyb_source_single(glibc_modulemap_native_target
125-
SOURCE "${glibc_modulemap_source}"
126-
OUTPUT "${glibc_sysroot_relative_modulemap_out}"
127-
FLAGS
128-
"-DCMAKE_SDK=${sdk}"
129-
"-DGLIBC_INCLUDE_PATH=${GLIBC_SYSROOT_RELATIVE_INCLUDE_PATH}"
130-
"-DGLIBC_ARCH_INCLUDE_PATH=${GLIBC_SYSROOT_RELATIVE_ARCH_INCLUDE_PATH}")
96+
SOURCE "${glibc_modulemap_source}"
97+
OUTPUT "${glibc_sysroot_relative_modulemap_out}"
98+
FLAGS "-DCMAKE_SDK=${sdk}"
99+
"-DGLIBC_INCLUDE_PATH=${SWIFT_SDK_${sdk}_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY}"
100+
"-DGLIBC_ARCH_INCLUDE_PATH=${SWIFT_SDK_${sdk}_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY}")
131101

132102
list(APPEND glibc_modulemap_target_list ${glibc_modulemap_native_target})
133103
set(glibc_modulemap_out ${glibc_sysroot_relative_modulemap_out})

0 commit comments

Comments
 (0)