From dfe1aab2ea361c8b85384a933989dc4c17a6d29b Mon Sep 17 00:00:00 2001 From: Xaymar Date: Thu, 17 Apr 2025 11:26:57 +0200 Subject: [PATCH] Add initial work towards a one-click build setup We can use some of CMakes built-in systems to ease the required workflow for the whole toolchain. This may eventually allow us to do a single click system where a developer does not need to do anything to get started. If Google can do this (even if slightly scuffed), so can we. --- CMakeLists.txt | 8 +- CMakePresets.json | 55 ++++++++ cmake/generators/ninja.cmake | 155 ++++++++++++++++++++++ cmake/toolchains/llvm-arm.cmake | 220 ++++++++++++++++++++++++++++++++ cmake/toolchains/llvm.cmake | 60 +++++++++ extra/README | 1 + 6 files changed, 495 insertions(+), 4 deletions(-) create mode 100644 CMakePresets.json create mode 100644 cmake/generators/ninja.cmake create mode 100644 cmake/toolchains/llvm-arm.cmake create mode 100644 cmake/toolchains/llvm.cmake create mode 100644 extra/README diff --git a/CMakeLists.txt b/CMakeLists.txt index fb4642f..13083f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -168,11 +168,11 @@ project( ${PROJECT_NAME} VERSION ${PROJECT_VERSION} ) -set(PROJECT_IDENTIFER "com.xaymar.BlitzLLVM") +set(PROJECT_IDENTIFER "com.xaymar.blitzllvm") set(PROJECT_TITLE "BlitzLLVM") -set(PROJECT_AUTHORS "See AUTHORS file") -set(PROJECT_COPYRIGHT "All Rights Reserved. See LICENSE file for more information") -set(PROJECT_TRADEMARKS "") +set(PROJECT_AUTHORS "Xaymar ") # ToDo: Generate from AUTHORS +set(PROJECT_COPYRIGHT "All Rights Reserved. See LICENSE file for more information") # ToDo: Generate from LICENSE +set(PROJECT_TRADEMARKS "") function(init_project TARGET) set_target_properties(${TARGET} PROPERTIES diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..f4673df --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,55 @@ +{ + "version": 6, + "cmakeMinimumRequired": { + "major": 4, + "minor": 0, + "patch": 0 + }, + "configurePresets": [ + { + "name": "default", + "cacheVariables": { + "__CMAKE_VERBOSE_MAKEFILE": "ON", + "CMAKE_INTERPROCEDURAL_OPTIMIZATION": "ON" + }, + "hidden": true + }, + { + "inherits": "default", + "name": "windows-x64-llvm", + "description": "Windows, x86-64 (LLVM)", + "binaryDir": "build/windows-x64-llvm", + "installDir": "distrib/windows-x64-llvm", + "toolchainFile": "cmake/toolchains/llvm.cmake", + "generator": "Ninja Multi-Config", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/cmake/toolchains/llvm.cmake", + "CMAKE_MAKE_PROGRAM": "build/windows-x64-llvm/toolchains/ninja/ninja.exe" + } + }, + { + "inherits": "default", + "name": "windows-x64-msvc", + "description": "Windows, x86-64 (MSVC 2022)", + "binaryDir": "build/windows-x64-msvc", + "installDir": "distrib/windows-x64-msvc", + "generator": "Visual Studio 17 2022", + "cacheVariables": { + } + } + ], + "buildPresets": [ + { + "configurePreset": "windows-x64-llvm", + "name": "windows-x64-llvm", + "description": "", + "displayName": "Windows, x64 (LLVM)" + }, + { + "configurePreset": "windows-x64-msvc", + "name": "windows-x64-msvc", + "description": "", + "displayName": "Windows, x64 (MSVC 2022)" + } + ] +} diff --git a/cmake/generators/ninja.cmake b/cmake/generators/ninja.cmake new file mode 100644 index 0000000..693681a --- /dev/null +++ b/cmake/generators/ninja.cmake @@ -0,0 +1,155 @@ +# Copyright (C) 2024-2025 Michael Fabian 'Xaymar' Dirks +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This is a script file that installs the necessary "Ninja" and "Ninja Multi-Config" generators. +# Run with `cmake -P cmake/generators/ninja.cmake` from the source directory. + +cmake_minimum_required(VERSION 3.30...4.0) +include_guard(GLOBAL) +list(APPEND CMAKE_MESSAGE_INDENT "[Ninja] ") + +# Try and figure out what processor we need to get binaries for. +if(CMAKE_HOST_SYSTEM_NAME MATCHES "[Ww]indows") + string(TOLOWER "$ENV{PROCESSOR_ARCHITECTURE}" _ARCH) + set(_OS "windows") +elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Dd]arwin") + set(_ARCH "multiarch") + set(_OS "macos") +elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "[Oo]pen[Bb][Ss][Dd]") + set(_OS "openbsd") + execute_process( + COMMAND "arch" + OUTPUT_VARIABLE _ARCH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +else() + set(_OS "linux") + execute_process( + COMMAND "uname -p" + OUTPUT_VARIABLE _ARCH + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE _RES + ) + if(_RES EQUAL 0) + execute_process( + COMMAND "uname -m" + OUTPUT_VARIABLE _ARCH + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE _RES + ) + endif() +endif() + +set(NINJA_VERSION "1.12.1") +set(NINJA_DIR "${CMAKE_SOURCE_DIR}/extra/ninja-${NINJA_VERSION}-${_OS}-${_ARCH}") + +# Check if Ninja is present and if it is up to date. +find_program(NINJA_BIN + NAMES + ninja + HINTS + "${NINJA_DIR}/" + NO_CACHE NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH +) +if(IS_EXECUTABLE "${NINJA_BIN}") + execute_process( + COMMAND ${NINJA_BIN} --version + OUTPUT_VARIABLE NINJA_VERSION_INSTALLED + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + string(REGEX REPLACE "[\r\n]+" "" NINJA_VERSION_INSTALLED "${NINJA_VERSION_INSTALLED}") + if((EXISTS NINJA_BIN) AND (NINJA_VERSION_INSTALLED VERSION_LESS NINJA_VERSION)) + message(STATUS "Found outdated v${NINJA_VERSION_INSTALLED}.") + else() + message(STATUS "Found v${NINJA_VERSION_INSTALLED}.") + endif() +endif() + +if((NOT IS_EXECUTABLE "${NINJA_BIN}") OR (NINJA_VERSION_INSTALLED VERSION_LESS NINJA_VERSION)) + # It isn't up to date or doesn't exist, so try to download the latest version. + + # First we'll have to figure out what we need to download, and from where. + if(_OS MATCHES "windows") + # Windows and Windows-like + SET (_FILE_EXT "zip") + if(_ARCH MATCHES "([xX]86)|([aA][mM][dD]64)") + # It's x86, x86-64 or amd64 + SET (_FILE_NAME "ninja-win") + else() + # Assume ARM or ARM64 + SET (_FILE_NAME "ninja-winarm64") + endif() + elseif(_OS MATCHES "macos") + # MacOS and MacOS-like + SET (_FILE_EXT "zip") + SET (_FILE_NAME "ninja-mac") + else() + # Assume this to be generic Unix-like. + SET (_FILE_EXT "tar.xz") + if(_ARCH MATCHES "([xX]86)|([aA][mM][dD]64)") + # It's x86, x86-64 or amd64 + SET (_FILE_NAME "ninja-linux") + else() + # Assume ARM or ARM64 + SET (_FILE_NAME "ninja-linux-aarch64") + endif() + endif() + + # Download the ideal version. + message(STATUS "Downloading Ninja v${NINJA_VERSION}...") + file(DOWNLOAD + "https://github.com/ninja-build/ninja/releases/download/v${NINJA_VERSION}/${_FILE_NAME}.${_FILE_EXT}" + "${NINJA_DIR}.${_FILE_EXT}" + ) + + # Extract it. + message(STATUS "Extracting...") + file(ARCHIVE_EXTRACT + INPUT "${NINJA_DIR}.${_FILE_EXT}" + DESTINATION "${NINJA_DIR}/" + ) + + # Delete the archive itself. + message(STATUS "Cleaning...") + file(REMOVE "${NINJA_DIR}.${_FILE_EXT}") + + # Check if Ninja is present and if it is up to date. + message(STATUS "Testing...") + find_program(NINJA_BIN + NAMES + ninja + HINTS + "${NINJA_DIR}/" + NO_CACHE NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH + ) + if(IS_EXECUTABLE "${NINJA_BIN}") + execute_process( + COMMAND ${NINJA_BIN} --version + OUTPUT_VARIABLE NINJA_VERSION_INSTALLED + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + string(REGEX REPLACE "[\r\n]+" "" NINJA_VERSION_INSTALLED "${NINJA_VERSION_INSTALLED}") + endif() +endif() + +if((NOT IS_EXECUTABLE "${NINJA_BIN}") OR (NINJA_VERSION_INSTALLED VERSION_LESS NINJA_VERSION)) + message(STATUS "NINJA_DIR=${NINJA_DIR}") + message(STATUS "NINJA_BIN=${NINJA_BIN}") + message(STATUS "NINJA_VERSION=${NINJA_VERSION}") + message(STATUS "NINJA_VERSION_INSTALLED=${NINJA_VERSION_INSTALLED}") + message(FATAL_ERROR "Failed to install newer version of Ninja.") +endif() + +set(CMAKE_MAKE_PROGRAM "${NINJA_BIN}" CACHE STRING "" FORCE) \ No newline at end of file diff --git a/cmake/toolchains/llvm-arm.cmake b/cmake/toolchains/llvm-arm.cmake new file mode 100644 index 0000000..23ee8e8 --- /dev/null +++ b/cmake/toolchains/llvm-arm.cmake @@ -0,0 +1,220 @@ +# Copyright (C) 2023-2024 Michael Fabian 'Xaymar' Dirks +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +cmake_minimum_required(VERSION 3.30...4.0) +include_guard(GLOBAL) + +if((CMAKE_GENERATOR STREQUAL "Ninja") OR (CMAKE_GENERATOR STREQUAL "Ninja Multi-Config")) + include("${CMAKE_CURRENT_LIST_DIR}/../generators/ninja.cmake") +endif() + +list(APPEND CMAKE_MESSAGE_INDENT "[LLVM-ARM] ") +set(_VERSION "18.1.3") +set(_FILE "llvm-arm-${CMAKE_HOST_SYSTEM_NAME}-${CMAKE_HOST_SYSTEM_PROCESSOR}") +if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows") # Windows + set(_FILENAME "LLVM-ET-Arm-${_VERSION}-Windows-x86_64") + set(_FILEEXT "zip") +elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin") # Darwin + set(_FILENAME "LLVM-ET-Arm-${_VERSION}-Darwin") + set(_FILEEXT "dmg") +else() # Generic Unix-like + set(_FILEEXT "tar.xz") + if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)") + set(_FILENAME "LLVM-ET-Arm-${_VERSION}-Linux-x86_64") + else() + set(_FILENAME "LLVM-ET-Arm-${_VERSION}-Linux-AArch64") + endif() +endif() + +# Very hacky way to get CMake to behave like a normal makefile generator, instead of a mentally challenged makefile generator. +if(TRUE) # Check if we've already installed one of these, + if(WIN32) + set(TEMP "$ENV{TEMP}") + else() + set(TEMP "$ENV{TMPDIR}") + endif() + set(_PATH "${TEMP}/cmake/llvm-arm/${_VERSION}") + if(EXISTS "${_PATH}") + file(READ "${_PATH}" _DIR) + if (NOT EXISTS "${_DIR}") + file(REMOVE "${_PATH}") + unset(_DIR) + endif() + endif() +endif() + +if((NOT _DIR) OR (EXISTS "${PROJECT_BINARY_DIR}/toolchain/${_FILE}.version")) + # Check if the version is what we expect. + if(EXISTS "${PROJECT_BINARY_DIR}/toolchain/${_FILE}.version") + file(READ "${PROJECT_BINARY_DIR}/toolchain/${_FILE}.version" _VERSION_STORED) + endif() + if((NOT _VERSION_STORED) OR (_VERSION_STORED VERSION_LESS _VERSION)) + message(STATUS "Updating... (${_VERSION_STORED} < ${_VERSION})") + + + # Download the appropriate package from https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm + #- Grab the latest hash from the remote. + set(_HASH_FILE "${PROJECT_BINARY_DIR}/toolchain/${_FILE}.sha256") + file(DOWNLOAD + "https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-${_VERSION}/${_FILENAME}.${_FILEEXT}.sha256" + "${_HASH_FILE}" + ) + file(READ "${_HASH_FILE}" _DOWNLOAD_SHA256) + string(REGEX MATCH "[0-9a-fA-F]+" _DOWNLOAD_SHA256 "${_DOWNLOAD_SHA256}") + file(REMOVE "${_HASH_FILE}") + + #- Download the latest toolchain + set(_PACKAGE_FILE "${PROJECT_BINARY_DIR}/toolchain/${_FILE}.${_FILEEXT}") + file(DOWNLOAD + "https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-${_VERSION}/${_FILENAME}.${_FILEEXT}" + "${_PACKAGE_FILE}" + EXPECTED_HASH SHA256=${_DOWNLOAD_SHA256} + ) + + #- Extract the contents + file(ARCHIVE_EXTRACT + INPUT "${_PACKAGE_FILE}" + DESTINATION "${PROJECT_BINARY_DIR}/toolchain/" + ) + #file(REMOVE "${_PACKAGE_FILE}") + + file(WRITE "${PROJECT_BINARY_DIR}/toolchain/${_FILE}.version" "${_VERSION}") + endif() + + # Update the virtual link + file(WRITE "${_PATH}" "${PROJECT_BINARY_DIR}/toolchain/${_FILENAME}/") + + set(_LLVM_TOOLCHAIN "${PROJECT_BINARY_DIR}/toolchain/${_FILENAME}/") +else() + set(_LLVM_TOOLCHAIN "${_DIR}") +endif() + +list(APPEND CMAKE_PREFIX_PATH + "${_LLVM_TOOLCHAIN}/bin" + "${_LLVM_TOOLCHAIN}" +) +# Find necessary programs. +# - AR +find_program( + CMAKE_AR + NAMES + llvm-ar + PATHS + "${_LLVM_TOOLCHAIN}/bin" + NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH +) +# - Library Randomizer +find_program( + CMAKE_RANLIB + NAMES + llvm-ranlib + PATHS + "${_LLVM_TOOLCHAIN}/bin" + NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH +) +# - Linker +find_program( + CMAKE_LINKER + NAMES + ld.lld + PATHS + "${_LLVM_TOOLCHAIN}/bin" + NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH +) +# - Object Copy +find_program( + CMAKE_OBJCOPY + NAMES + llvm-objcopy + PATHS + "${_LLVM_TOOLCHAIN}/bin" + NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH +) +# - Object Dump +find_program( + CMAKE_OBJDUMP + NAMES + llvm-objdump + PATHS + "${_LLVM_TOOLCHAIN}/bin" + NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH +) +# - Strip Debug Info +find_program( + CMAKE_STRIP + NAMES + llvm-strip + PATHS + "${_LLVM_TOOLCHAIN}/bin" + NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH +) +# - C Compiler +find_program( + CMAKE_C_COMPILER + NAMES + clang + clang++ + clang-cpp + PATHS + "${_LLVM_TOOLCHAIN}/bin" + NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH +) +set(CMAKE_C_COMPILER_AR "${CMAKE_AR}" CACHE STRING "" FORCE) +#set(CMAKE_C_COMPILER_CLANG_SCAN_DEPS "NOT-FOUND" CACHE STRING "" FORCE) +set(CMAKE_C_COMPILER_RANLIB "${CMAKE_RANLIB}" CACHE STRING "" FORCE) +set(CMAKE_C_LINKER "${CMAKE_LINKER}" CACHE STRING "" FORCE) +set(CMAKE_C_LINKER_ID "LDD" CACHE STRING "" FORCE) +set(CMAKE_C_LINKER_FRONTEND_VARIANT "LLD" CACHE STRING "" FORCE) +# - C++ Compiler +find_program( + CMAKE_CXX_COMPILER + NAMES + clang++ + clang-cpp + clang + PATHS + "${_LLVM_TOOLCHAIN}/bin" + NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_INSTALL_PREFIX NO_CMAKE_FIND_ROOT_PATH +) +set(CMAKE_CXX_COMPILER_AR "${CMAKE_AR}" CACHE STRING "" FORCE) +#set(CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS "NOT-FOUND" CACHE STRING "" FORCE) +set(CMAKE_CXX_SCAN_FOR_MODULES OFF CACHE BOOL "" FORCE) +set(CMAKE_CXX_COMPILER_RANLIB "${CMAKE_RANLIB}" CACHE STRING "" FORCE) +set(CMAKE_CXX_LINKER "${CMAKE_C_LINKER}" CACHE STRING "" FORCE) +set(CMAKE_CXX_LINKER_ID "LLD" CACHE STRING "" FORCE) +set(CMAKE_CXX_LINKER_FRONTEND_VARIANT "LLD" CACHE STRING "" FORCE) +# - Assembly Compiler +set(CMAKE_ASM_COMPILER "${CMAKE_C_COMPILER}" CACHE STRING "" FORCE) +set(CMAKE_ASM_COMPILER_AR "${CMAKE_AR}" CACHE STRING "" FORCE) +#set(CMAKE_ASM_COMPILER_CLANG_SCAN_DEPS "NOT-FOUND" CACHE STRING "" FORCE) +set(CMAKE_ASM_COMPILER_RANLIB "${CMAKE_RANLIB}" CACHE STRING "" FORCE) +set(CMAKE_ASM_LINKER "${CMAKE_C_LINKER}" CACHE STRING "" FORCE) +set(CMAKE_ASM_LINKER_ID "LLD" CACHE STRING "" FORCE) +set(CMAKE_ASM_LINKER_FRONTEND_VARIANT "LLD" CACHE STRING "" FORCE) + +#mark_as_advanced(CLANG_C_COMPILER CLANG_CPP_COMPILER CLANG__AR CLANG__LD_LDD) +set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=\"${CMAKE_C_LINKER}\"") +set(CMAKE_STATIC_LINKER_FLAGS_INIT "-fuse-ld=\"${CMAKE_C_LINKER}\"") +set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=\"${CMAKE_C_LINKER}\"") +set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=\"${CMAKE_C_LINKER}\"") + +execute_process( + COMMAND "${CMAKE_C_COMPILER}" "--version" + OUTPUT_VARIABLE _VERSION_INSTALLED + OUTPUT_STRIP_TRAILING_WHITESPACE +) +string(REGEX MATCH "[0-9]+\.[0-9]+\.[0-9]+" _VERSION_INSTALLED "${_VERSION_INSTALLED}") +message(STATUS "v${_VERSION_INSTALLED}") +list(POP_BACK CMAKE_MESSAGE_INDENT) diff --git a/cmake/toolchains/llvm.cmake b/cmake/toolchains/llvm.cmake new file mode 100644 index 0000000..2d6d0b7 --- /dev/null +++ b/cmake/toolchains/llvm.cmake @@ -0,0 +1,60 @@ +# TinyAudioLink - Seamlessly transfer Audio between USB capable devices +# Copyright (C) 2019 Michael Fabian 'Xaymar' Dirks +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +find_program( + CLANG_C_COMPILER + NAMES + clang + clang-cl + clang++ + clang-cpp + NO_CACHE +) +find_program( + CLANG_CPP_COMPILER + NAMES + clang++ + clang-cpp + clang + clang-cl + NO_CACHE +) +find_program( + CLANG_LLVM_AR + NAMES + llvm-ar + NO_CACHE +) +find_program( + CLANG_LLVM_LD_LDD + NAMES + ld.lld + NO_CACHE +) +mark_as_advanced(CLANG_C_COMPILER CLANG_CPP_COMPILER CLANG_LLVM_AR CLANG_LLVM_LD_LDD) + +set(CMAKE_C_COMPILER "${CLANG_C_COMPILER}") +set(CMAKE_CXX_COMPILER "${CLANG_CPP_COMPILER}") +set(CMAKE_AR "${CLANG_LLVM_AR}") + +if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.29) + set(CMAKE_LINKER_TYPE "LLD") +else() + set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=\"${CLANG_LLVM_LD_LDD}\"") + set(CMAKE_STATIC_LINKER_FLAGS_INIT "-fuse-ld=\"${CLANG_LLVM_LD_LDD}\"") + set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=\"${CLANG_LLVM_LD_LDD}\"") + set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=\"${CLANG_LLVM_LD_LDD}\"") +endif() diff --git a/extra/README b/extra/README new file mode 100644 index 0000000..222bdac --- /dev/null +++ b/extra/README @@ -0,0 +1 @@ +This directory contains automatically downloaded toolchains and generators. \ No newline at end of file