Skip to content

Commit

Permalink
[cmake] Add support for external clang/clang-cl
Browse files Browse the repository at this point in the history
We need an option to pass external host clang location in case
we can't use just-built clang, e.g. when we are building for
different target architecture.

Also, this adds target options for clang-cl, enabling us to
build for arm64 on Windows@amd64.
  • Loading branch information
lxbndr committed Jan 17, 2022
1 parent e6ec687 commit 4cc528d
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 16 deletions.
14 changes: 10 additions & 4 deletions cmake/modules/AddSwift.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -118,13 +118,19 @@ function(_add_host_variant_c_compile_link_flags name)
set(DEPLOYMENT_VERSION ${SWIFT_ANDROID_API_LEVEL})
endif()

# MSVC, clang-cl, gcc don't understand -target.
if(CMAKE_C_COMPILER_ID MATCHES "Clang" AND NOT SWIFT_COMPILER_IS_MSVC_LIKE)
# MSVC and gcc don't understand -target.
# clang-cl understands --target.
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
get_target_triple(target target_variant "${SWIFT_HOST_VARIANT_SDK}" "${SWIFT_HOST_VARIANT_ARCH}"
MACCATALYST_BUILD_FLAVOR ""
DEPLOYMENT_VERSION "${DEPLOYMENT_VERSION}")
target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-target;${target}>)
target_link_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-target;${target}>)
if("${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "MSVC") # clang-cl options
target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:--target=${target}>)
target_link_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:--target=${target}>)
else()
target_compile_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-target;${target}>)
target_link_options(${name} PRIVATE $<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-target;${target}>)
endif()
endif()

if (CMAKE_Swift_COMPILER)
Expand Down
25 changes: 13 additions & 12 deletions cmake/modules/SwiftWindowsSupport.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -83,29 +83,30 @@ macro(swift_swap_compiler_if_needed target)
if(NOT CMAKE_C_COMPILER_ID MATCHES Clang)
if(CMAKE_SYSTEM_NAME STREQUAL CMAKE_HOST_SYSTEM_NAME AND CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR)
if(SWIFT_BUILT_STANDALONE)
get_target_property(CLANG_LOCATION clang LOCATION)
get_filename_component(CLANG_LOCATION ${CLANG_LOCATION} DIRECTORY)
get_target_property(SWIFT_CLANG_LOCATION clang LOCATION)
get_filename_component(SWIFT_CLANG_LOCATION ${SWIFT_CLANG_LOCATION} DIRECTORY)
else()
set(CLANG_LOCATION ${LLVM_RUNTIME_OUTPUT_INTDIR})
set(SWIFT_CLANG_LOCATION ${LLVM_RUNTIME_OUTPUT_INTDIR})
endif()
endif()

if (DEFINED SWIFT_CLANG_LOCATION)
if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC")
set(CMAKE_C_COMPILER ${CLANG_LOCATION}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
set(CMAKE_CXX_COMPILER ${CLANG_LOCATION}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
set(CMAKE_C_COMPILER_ID Clang)
set(CMAKE_C_COMPILER ${SWIFT_CLANG_LOCATION}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
set(CMAKE_CXX_COMPILER ${SWIFT_CLANG_LOCATION}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
set(CMAKE_C_SIMULATE_ID MSVC)
set(CMAKE_C_COMPILER_FRONTEND_VARIANT MSVC)
set(CMAKE_CXX_COMPILER_ID Clang)
set(CMAKE_CXX_SIMULATE_ID MSVC)
set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT MSVC)
else()
set(CMAKE_C_COMPILER ${CLANG_LOCATION}/clang${CMAKE_EXECUTABLE_SUFFIX})
set(CMAKE_CXX_COMPILER ${CLANG_LOCATION}/clang++${CMAKE_EXECUTABLE_SUFFIX})
set(CMAKE_C_COMPILER_ID Clang)
set(CMAKE_CXX_COMPILER_ID Clang)
set(CMAKE_C_COMPILER ${SWIFT_CLANG_LOCATION}/clang${CMAKE_EXECUTABLE_SUFFIX})
set(CMAKE_CXX_COMPILER ${SWIFT_CLANG_LOCATION}/clang++${CMAKE_EXECUTABLE_SUFFIX})
endif()
set(CMAKE_C_COMPILER_ID Clang)
set(CMAKE_CXX_COMPILER_ID Clang)
message(STATUS "C/C++ compiler for ${target} is set to: ${CMAKE_C_COMPILER}")
else()
message(SEND_ERROR "${target} requires a clang based compiler")
message(SEND_ERROR "${target} requires a clang based compiler. Please set SWIFT_CLANG_LOCATION.")
endif()
endif()
endmacro()
Expand Down

0 comments on commit 4cc528d

Please sign in to comment.