aboutsummaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake')
-rw-r--r--cmake/EmbeddedLLVM.cmake2
-rw-r--r--cmake/NativeCompiler.cmake110
2 files changed, 111 insertions, 1 deletions
diff --git a/cmake/EmbeddedLLVM.cmake b/cmake/EmbeddedLLVM.cmake
index c7ad5d4..cb08edc 100644
--- a/cmake/EmbeddedLLVM.cmake
+++ b/cmake/EmbeddedLLVM.cmake
@@ -17,7 +17,7 @@ foreach(cpsc_dependency IN LISTS cpsc_support_libs)
cpsc_find_library(CPSC_STATIC_${cpsc_library_name} ${cpsc_library_names})
if(NOT CPSC_STATIC_${cpsc_library_name})
message(FATAL_ERROR
- "EMBEDDED requires a static archive for ${cpsc_dependency}; download or install its development package")
+ "cpsc requires a static archive for ${cpsc_dependency}; download or install its development package")
endif()
string(REPLACE "${cpsc_dependency}" "${CPSC_STATIC_${cpsc_library_name}}"
cpsc_support_libs "${cpsc_support_libs}")
diff --git a/cmake/NativeCompiler.cmake b/cmake/NativeCompiler.cmake
new file mode 100644
index 0000000..8371ee2
--- /dev/null
+++ b/cmake/NativeCompiler.cmake
@@ -0,0 +1,110 @@
+# Native output is independent of the optional -r execution engine.
+find_package(Clang REQUIRED CONFIG HINTS "${LLVM_INSTALL_PREFIX}/lib/cmake/clang")
+cpsc_find_dependency(PATH LLD_DIR NAMES LLDConfig.cmake PATH_SUFFIXES lib/cmake/lld cmake)
+find_package(LLD REQUIRED CONFIG HINTS "${LLVM_INSTALL_PREFIX}/lib/cmake/lld")
+find_package(Python3 3.9 REQUIRED COMPONENTS Interpreter)
+
+if(MINGW)
+ set(cpsc_native_platform windows)
+ set(cpsc_linker_libraries lldMinGW lldCOFF)
+elseif(APPLE)
+ set(cpsc_native_platform macos)
+ set(cpsc_linker_libraries lldMachO)
+else()
+ set(cpsc_native_platform linux)
+ set(cpsc_linker_libraries lldELF)
+endif()
+
+set(cpsc_native_flags)
+get_filename_component(cpsc_lld_prefix "${LLD_DIR}/../../.." ABSOLUTE)
+if(APPLE)
+ set(cpsc_linker_names ld64.lld)
+else()
+ set(cpsc_linker_names ld.lld-23 ld.lld)
+endif()
+find_program(CPSC_NATIVE_LINKER NAMES ${cpsc_linker_names}
+ HINTS "${cpsc_lld_prefix}/bin" ${CPSC_LOCAL_BIN_DIRS})
+if(NOT CPSC_NATIVE_LINKER)
+ message(FATAL_ERROR "Install the LLD 23 executable to prepare native link resources")
+endif()
+list(APPEND cpsc_native_flags "--flag=--ld-path=${CPSC_NATIVE_LINKER}")
+target_link_options(cpsc PRIVATE -fuse-ld=lld "--ld-path=${CPSC_NATIVE_LINKER}")
+if(CMAKE_SYSROOT)
+ list(APPEND cpsc_native_flags "--flag=--sysroot=${CMAKE_SYSROOT}")
+endif()
+if(APPLE)
+ if(NOT CMAKE_OSX_SYSROOT)
+ execute_process(COMMAND xcrun --show-sdk-path
+ OUTPUT_VARIABLE CMAKE_OSX_SYSROOT OUTPUT_STRIP_TRAILING_WHITESPACE
+ RESULT_VARIABLE cpsc_sdk_result)
+ if(NOT cpsc_sdk_result EQUAL 0)
+ message(FATAL_ERROR "Cannot locate the macOS SDK")
+ endif()
+ endif()
+ list(APPEND cpsc_native_flags "--flag=-isysroot" "--flag=${CMAKE_OSX_SYSROOT}")
+ if(CMAKE_OSX_DEPLOYMENT_TARGET)
+ list(APPEND cpsc_native_flags "--flag=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}")
+ endif()
+endif()
+set(cpsc_runtime_generator "${CMAKE_SOURCE_DIR}/tools/driver/prepare-native-runtime.py")
+set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${cpsc_runtime_generator}")
+execute_process(COMMAND "${Python3_EXECUTABLE}" "${cpsc_runtime_generator}"
+ "--compiler=${CMAKE_CXX_COMPILER}"
+ "--output=${CMAKE_BINARY_DIR}/native-runtime/NativeRuntime.inc"
+ "--platform=${cpsc_native_platform}" ${cpsc_native_flags}
+ RESULT_VARIABLE cpsc_runtime_result OUTPUT_VARIABLE cpsc_runtime_output
+ ERROR_VARIABLE cpsc_runtime_error)
+if(NOT cpsc_runtime_result EQUAL 0)
+ message(FATAL_ERROR "Cannot prepare native link resources: ${cpsc_runtime_error}")
+endif()
+message(STATUS "${cpsc_runtime_output}")
+include("${CMAKE_BINARY_DIR}/native-runtime/native-runtime-inputs.cmake")
+
+target_sources(cpsc PRIVATE tools/driver/NativeCompiler.cc)
+target_include_directories(cpsc PRIVATE ${CLANG_INCLUDE_DIRS} ${LLD_INCLUDE_DIRS}
+ "${CMAKE_BINARY_DIR}/native-runtime")
+target_link_libraries(cpsc PRIVATE clangDriver ${cpsc_linker_libraries})
+# Distribution Clang/LLD archives can still name the shared LLVM umbrella
+# library in their imported interfaces. Resolve those edges to static archives.
+add_library(CPSCStaticLLVM INTERFACE)
+foreach(cpsc_llvm_library IN LISTS LLVM_AVAILABLE_LIBS)
+ # Standalone tools are not driver/linker dependencies and may reference
+ # optional packages absent from binary SDK installations.
+ if(cpsc_llvm_library MATCHES "^LLVM(LineEditor|BOLT.*|Exegesis.*|OptDriver)$")
+ continue()
+ endif()
+ if(TARGET ${cpsc_llvm_library})
+ get_target_property(cpsc_llvm_type ${cpsc_llvm_library} TYPE)
+ if(cpsc_llvm_type STREQUAL "STATIC_LIBRARY")
+ target_link_libraries(CPSCStaticLLVM INTERFACE ${cpsc_llvm_library})
+ endif()
+ endif()
+endforeach()
+foreach(cpsc_import IN LISTS CLANG_EXPORTED_TARGETS LLD_EXPORTED_TARGETS LLVM_AVAILABLE_LIBS)
+ if(NOT TARGET ${cpsc_import})
+ continue()
+ endif()
+ get_target_property(cpsc_interface ${cpsc_import} INTERFACE_LINK_LIBRARIES)
+ if(cpsc_interface)
+ list(FIND cpsc_interface LLVM cpsc_shared_llvm_index)
+ if(NOT cpsc_shared_llvm_index EQUAL -1)
+ list(REMOVE_ITEM cpsc_interface LLVM)
+ if(NOT cpsc_import IN_LIST LLVM_AVAILABLE_LIBS)
+ list(APPEND cpsc_interface CPSCStaticLLVM)
+ endif()
+ endif()
+ if(CPSC_STATIC_z)
+ list(TRANSFORM cpsc_interface REPLACE "^ZLIB::ZLIB$" "${CPSC_STATIC_z}")
+ endif()
+ if(CPSC_STATIC_zstd)
+ list(TRANSFORM cpsc_interface REPLACE "^zstd::libzstd.*$" "${CPSC_STATIC_zstd}")
+ endif()
+ set_property(TARGET ${cpsc_import} PROPERTY INTERFACE_LINK_LIBRARIES "${cpsc_interface}")
+ endif()
+endforeach()
+foreach(cpsc_native_library clangDriver ${cpsc_linker_libraries})
+ get_target_property(cpsc_native_type ${cpsc_native_library} TYPE)
+ if(NOT cpsc_native_type STREQUAL "STATIC_LIBRARY")
+ message(FATAL_ERROR "Native output requires static ${cpsc_native_library}")
+ endif()
+endforeach()