diff --git a/.gitlab/.gitignore b/.gitlab/.gitignore index 0e34b1b565f0733a881399916363d8db1b212f0c..83e21d52e6c466ec427489fc4b300cfbe5714a6e 100644 --- a/.gitlab/.gitignore +++ b/.gitlab/.gitignore @@ -17,6 +17,7 @@ /qt* /sccache* /swift +/ticlang /unstable-jom* /watcom /wix* diff --git a/.gitlab/ci/configure_debian12_makefiles_clang.cmake b/.gitlab/ci/configure_debian12_makefiles_clang.cmake index 20863a2fb0876bbfa1867f4b3e648c1b10fe2939..69f1e7c794df02b0bb273df16ac01e9c7ab789d2 100644 --- a/.gitlab/ci/configure_debian12_makefiles_clang.cmake +++ b/.gitlab/ci/configure_debian12_makefiles_clang.cmake @@ -1 +1,5 @@ +if (NOT "$ENV{CMAKE_CI_NIGHTLY}" STREQUAL "") + set(CMake_TEST_TICLANG_TOOLCHAINS "$ENV{CI_PROJECT_DIR}/.gitlab/ticlang" CACHE PATH "") +endif() + include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake") diff --git a/.gitlab/ci/configure_debian12_ninja_clang.cmake b/.gitlab/ci/configure_debian12_ninja_clang.cmake index 20863a2fb0876bbfa1867f4b3e648c1b10fe2939..69f1e7c794df02b0bb273df16ac01e9c7ab789d2 100644 --- a/.gitlab/ci/configure_debian12_ninja_clang.cmake +++ b/.gitlab/ci/configure_debian12_ninja_clang.cmake @@ -1 +1,5 @@ +if (NOT "$ENV{CMAKE_CI_NIGHTLY}" STREQUAL "") + set(CMake_TEST_TICLANG_TOOLCHAINS "$ENV{CI_PROJECT_DIR}/.gitlab/ticlang" CACHE PATH "") +endif() + include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake") diff --git a/.gitlab/ci/env_debian12_makefiles_clang.sh b/.gitlab/ci/env_debian12_makefiles_clang.sh index eda7c1fa818421f8a558698ddb6be1a87775eca3..e46aa29a2a3e698c85d8c8a2ebfb7678fc8ec7be 100644 --- a/.gitlab/ci/env_debian12_makefiles_clang.sh +++ b/.gitlab/ci/env_debian12_makefiles_clang.sh @@ -1,2 +1,6 @@ +if test "$CMAKE_CI_NIGHTLY" = "true"; then + source .gitlab/ci/ticlang-env.sh +fi + export CC=/usr/bin/clang-15 export CXX=/usr/bin/clang++-15 diff --git a/.gitlab/ci/env_debian12_ninja_clang.sh b/.gitlab/ci/env_debian12_ninja_clang.sh index eda7c1fa818421f8a558698ddb6be1a87775eca3..e46aa29a2a3e698c85d8c8a2ebfb7678fc8ec7be 100644 --- a/.gitlab/ci/env_debian12_ninja_clang.sh +++ b/.gitlab/ci/env_debian12_ninja_clang.sh @@ -1,2 +1,6 @@ +if test "$CMAKE_CI_NIGHTLY" = "true"; then + source .gitlab/ci/ticlang-env.sh +fi + export CC=/usr/bin/clang-15 export CXX=/usr/bin/clang++-15 diff --git a/.gitlab/ci/ticlang-env.sh b/.gitlab/ci/ticlang-env.sh new file mode 100644 index 0000000000000000000000000000000000000000..448c0d767183e3d59f39327924e15dfab8dfd76c --- /dev/null +++ b/.gitlab/ci/ticlang-env.sh @@ -0,0 +1,2 @@ +.gitlab/ci/ticlang.sh +.gitlab/ticlang/bin/tiarmclang --version diff --git a/.gitlab/ci/ticlang.sh b/.gitlab/ci/ticlang.sh new file mode 100755 index 0000000000000000000000000000000000000000..66fa863a3020ecfb157b761d4c4803161f19ca31 --- /dev/null +++ b/.gitlab/ci/ticlang.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +set -e + +case "$(uname -s)-$(uname -m)" in + Linux-x86_64) + shatool="sha256sum" + sha256sum="c69ac58e403b82eac1c407cc67b35fab5d95c5d8db75b019095f9412aacff27d" + filename="ti_cgt_armllvm_3.2.1.LTS_linux-x64_installer.bin" + dirname="ti-cgt-armllvm_3.2.1.LTS" + ;; + *) + echo "Unrecognized platform $(uname -s)-$(uname -m)" + exit 1 + ;; +esac +readonly shatool +readonly sha256sum + +cd .gitlab + +echo "$sha256sum $filename" > ticlang.sha256sum +curl -OL "https://cmake.org/files/dependencies/internal/$filename" +$shatool --check ticlang.sha256sum +chmod +x "$filename" +"./$filename" --mode unattended --prefix . +mv "$dirname" ticlang +rm -f "$filename" ticlang.sha256sum diff --git a/Help/manual/cmake-compile-features.7.rst b/Help/manual/cmake-compile-features.7.rst index 1e87ec6cf69af4f8e66d7f510fd4bd2d6a800bd1..fb9322267767decb3836c94260cccb473f622eec 100644 --- a/Help/manual/cmake-compile-features.7.rst +++ b/Help/manual/cmake-compile-features.7.rst @@ -266,6 +266,7 @@ versions specified for each: * ``PGI``: PGI version 12.10+. * ``NVHPC``: NVIDIA HPC compilers version 11.0+. * ``TI``: Texas Instruments compiler. +* ``TIClang``: Texas Instruments Clang-based compilers. * ``XL``: IBM XL version 10.1+. CMake is currently aware of the :prop_tgt:`C standards <C_STANDARD>` and diff --git a/Help/release/3.29.rst b/Help/release/3.29.rst index a655f62b537792e522287c0ac4c55e7a7d14040f..96f161f0102b3c8aa25b4babb688f832de2e9093 100644 --- a/Help/release/3.29.rst +++ b/Help/release/3.29.rst @@ -39,6 +39,9 @@ Compilers * The LLVM/Clang GNU-like frontend on Windows (``clang++``) may now be used to compile ``CUDA`` language sources. +* TI Clang-based compilers are now supported with + :variable:`compiler id <CMAKE_<LANG>_COMPILER_ID>` ``TIClang``. + Commands -------- diff --git a/Help/variable/CMAKE_LANG_COMPILER_ID.rst b/Help/variable/CMAKE_LANG_COMPILER_ID.rst index 6893eea6d5499135f616478686aeb12a5f040acb..b1e2687594e415a0dea5f661b991e52fb156c565 100644 --- a/Help/variable/CMAKE_LANG_COMPILER_ID.rst +++ b/Help/variable/CMAKE_LANG_COMPILER_ID.rst @@ -43,6 +43,7 @@ Value Name ``SunPro`` Oracle Solaris Studio ``Tasking`` `Tasking Compiler Toolsets`_ ``TI`` Texas Instruments +``TIClang`` `Texas Instruments Clang-based Compilers`_ ``TinyCC`` `Tiny C Compiler`_ ``XL``, ``VisualAge``, ``zOS`` IBM XL ``XLClang`` IBM Clang-based XL @@ -68,3 +69,4 @@ languages. .. _Small Device C Compiler: https://sdcc.sourceforge.net .. _Tiny C Compiler: https://bellard.org/tcc .. _Tasking Compiler Toolsets: https://www.tasking.com +.. _Texas Instruments Clang-based Compilers: https://www.ti.com/tool/download/ARM-CGT-CLANG diff --git a/Modules/CMakeCompilerIdDetection.cmake b/Modules/CMakeCompilerIdDetection.cmake index e4fa43fb65a0c15e3ac17069d65f04eac76a63b8..2817d37776fec0abf80f572a712003fa684b8529 100644 --- a/Modules/CMakeCompilerIdDetection.cmake +++ b/Modules/CMakeCompilerIdDetection.cmake @@ -80,6 +80,7 @@ function(compiler_id_detection outvar lang) ARMCC AppleClang ARMClang + TIClang ) list(APPEND ordered_compilers Clang diff --git a/Modules/CMakeDetermineASMCompiler.cmake b/Modules/CMakeDetermineASMCompiler.cmake index 6d7d17ef4d82ae6396ccaa87bca32d33f8eea412..2042e64959fee4d9c1ead76f1b410cd1ff8d7738 100644 --- a/Modules/CMakeDetermineASMCompiler.cmake +++ b/Modules/CMakeDetermineASMCompiler.cmake @@ -102,6 +102,10 @@ if(NOT CMAKE_ASM${ASM_DIALECT}_COMPILER_ID) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_TI "-h") set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_TI "Texas Instruments") + list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS TIClang ) + set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_TIClang "--version") + set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_TIClang "(TI (.*) Clang Compiler)") + list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS IAR) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_IAR ) set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_IAR "IAR Assembler") diff --git a/Modules/CMakeDetermineCCompiler.cmake b/Modules/CMakeDetermineCCompiler.cmake index 8beebc5e57a69b3121d19e0dbe2c7db94351b08d..73b6ceec77f61189f0a1f6f04449ac1eca6c677a 100644 --- a/Modules/CMakeDetermineCCompiler.cmake +++ b/Modules/CMakeDetermineCCompiler.cmake @@ -166,6 +166,11 @@ if (NOT _CMAKE_TOOLCHAIN_PREFIX) set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1}) set(_CMAKE_TOOLCHAIN_SUFFIX ${CMAKE_MATCH_4}) set(_CMAKE_COMPILER_SUFFIX ${CMAKE_MATCH_6}) + elseif(CMAKE_C_COMPILER_ID MATCHES "TIClang") + if (COMPILER_BASENAME MATCHES "^(.+)?clang(\\.exe)?$") + set(_CMAKE_TOOLCHAIN_PREFIX "${CMAKE_MATCH_1}") + set(_CMAKE_TOOLCHAIN_SUFFIX "${CMAKE_MATCH_2}") + endif() elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") if(CMAKE_C_COMPILER_TARGET) set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_C_COMPILER_TARGET}-) diff --git a/Modules/CMakeDetermineCXXCompiler.cmake b/Modules/CMakeDetermineCXXCompiler.cmake index 40934ecac5f96f9f34e73c50f341b223c3c7665f..891ba6e759094c1654315890d4c9eeaa56a2c71e 100644 --- a/Modules/CMakeDetermineCXXCompiler.cmake +++ b/Modules/CMakeDetermineCXXCompiler.cmake @@ -171,6 +171,11 @@ if (NOT _CMAKE_TOOLCHAIN_PREFIX) set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1}) set(_CMAKE_TOOLCHAIN_SUFFIX ${CMAKE_MATCH_3}) set(_CMAKE_COMPILER_SUFFIX ${CMAKE_MATCH_5}) + elseif(CMAKE_CXX_COMPILER_ID MATCHES "TIClang") + if (COMPILER_BASENAME MATCHES "^(.+)?clang(\\.exe)?$") + set(_CMAKE_TOOLCHAIN_PREFIX "${CMAKE_MATCH_1}") + set(_CMAKE_TOOLCHAIN_SUFFIX "${CMAKE_MATCH_2}") + endif() elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(CMAKE_CXX_COMPILER_TARGET) set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_CXX_COMPILER_TARGET}-) diff --git a/Modules/CMakeDetermineCompilerId.cmake b/Modules/CMakeDetermineCompilerId.cmake index 25aaccad1cc915a4d5613690232f43b840b3b25c..1cf1e7934a96489c93cad68c3425a069304edef0 100644 --- a/Modules/CMakeDetermineCompilerId.cmake +++ b/Modules/CMakeDetermineCompilerId.cmake @@ -280,7 +280,8 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src) endif() elseif("x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xGNU" OR "x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xAppleClang" - OR "x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xFujitsuClang") + OR "x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xFujitsuClang" + OR "x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xTIClang") set(CMAKE_${lang}_COMPILER_FRONTEND_VARIANT "GNU") elseif("x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xMSVC") set(CMAKE_${lang}_COMPILER_FRONTEND_VARIANT "MSVC") diff --git a/Modules/CMakePlatformId.h.in b/Modules/CMakePlatformId.h.in index 32b71663ca52d47c3398bc4ab5d802fee82d19db..fd0367e489e8bcca66e6bb0bea96277c4a490295 100644 --- a/Modules/CMakePlatformId.h.in +++ b/Modules/CMakePlatformId.h.in @@ -219,6 +219,14 @@ # define ARCHITECTURE_ID "" # endif +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + #elif defined(__TI_COMPILER_VERSION__) # if defined(__TI_ARM__) # define ARCHITECTURE_ID "ARM" diff --git a/Modules/Compiler/TIClang-ASM.cmake b/Modules/Compiler/TIClang-ASM.cmake new file mode 100644 index 0000000000000000000000000000000000000000..6bb07e3f22992e401ecf796f772ed0b231bab4e3 --- /dev/null +++ b/Modules/Compiler/TIClang-ASM.cmake @@ -0,0 +1,9 @@ +include(Compiler/TIClang) + +set(CMAKE_ASM_OUTPUT_EXTENSION ".o") +set(CMAKE_ASM_OUTPUT_EXTENSION_REPLACE 1) + +set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -c -o <OBJECT> <SOURCE>") +set(CMAKE_ASM_SOURCE_FILE_EXTENSIONS S;s;asm;msa) + +__compiler_ticlang(ASM) diff --git a/Modules/Compiler/TIClang-C-FeatureTests.cmake b/Modules/Compiler/TIClang-C-FeatureTests.cmake new file mode 100644 index 0000000000000000000000000000000000000000..ef79229d0d47f4054e3b2d867238ed740ae00e54 --- /dev/null +++ b/Modules/Compiler/TIClang-C-FeatureTests.cmake @@ -0,0 +1 @@ +include(Compiler/Clang-C-FeatureTests) diff --git a/Modules/Compiler/TIClang-C.cmake b/Modules/Compiler/TIClang-C.cmake new file mode 100644 index 0000000000000000000000000000000000000000..2721fef51fc0fcbf54936000eb1437a2ce7792a3 --- /dev/null +++ b/Modules/Compiler/TIClang-C.cmake @@ -0,0 +1,23 @@ +include(Compiler/Clang-C) +include(Compiler/TIClang) +__compiler_ticlang(C) + +if((NOT DEFINED CMAKE_DEPENDS_USE_COMPILER OR CMAKE_DEPENDS_USE_COMPILER) + AND CMAKE_GENERATOR MATCHES "Makefiles|WMake" + AND CMAKE_DEPFILE_FLAGS_C) + # dependencies are computed by the compiler itself + set(CMAKE_C_DEPFILE_FORMAT gcc) + set(CMAKE_C_DEPENDS_USE_COMPILER TRUE) +endif() + +set(CMAKE_C90_STANDARD_COMPILE_OPTION "-std=c90") +set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-std=gnu90") +set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON) + +set(CMAKE_C99_STANDARD_COMPILE_OPTION "-std=c99") +set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu99") +set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON) + +set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11") +set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11") +set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON) diff --git a/Modules/Compiler/TIClang-CXX-FeatureTests.cmake b/Modules/Compiler/TIClang-CXX-FeatureTests.cmake new file mode 100644 index 0000000000000000000000000000000000000000..e038e807bcf7693e9ad4d11585b4f1e8f0f08d99 --- /dev/null +++ b/Modules/Compiler/TIClang-CXX-FeatureTests.cmake @@ -0,0 +1 @@ +include(Compiler/Clang-CXX-FeatureTests) diff --git a/Modules/Compiler/TIClang-CXX.cmake b/Modules/Compiler/TIClang-CXX.cmake new file mode 100644 index 0000000000000000000000000000000000000000..860bb429da88bf0bcfbf46d1768112e41f17fe70 --- /dev/null +++ b/Modules/Compiler/TIClang-CXX.cmake @@ -0,0 +1,25 @@ +include(Compiler/Clang-CXX) +include(Compiler/TIClang) +__compiler_ticlang(CXX) + +if((NOT DEFINED CMAKE_DEPENDS_USE_COMPILER OR CMAKE_DEPENDS_USE_COMPILER) + AND CMAKE_GENERATOR MATCHES "Makefiles|WMake" + AND CMAKE_DEPFILE_FLAGS_CXX) + # dependencies are computed by the compiler itself + set(CMAKE_CXX_DEPFILE_FORMAT gcc) + set(CMAKE_CXX_DEPENDS_USE_COMPILER TRUE) +endif() + +set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-std=c++98") +set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-std=gnu++98") +set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON) + +set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++11") +set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11") + +set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++14") +set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14") +set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON) + +set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17") +set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17") diff --git a/Modules/Compiler/TIClang-DetermineCompiler.cmake b/Modules/Compiler/TIClang-DetermineCompiler.cmake new file mode 100644 index 0000000000000000000000000000000000000000..2447fdf08e266f612adbc8f9465116e79a30bf7a --- /dev/null +++ b/Modules/Compiler/TIClang-DetermineCompiler.cmake @@ -0,0 +1,10 @@ +# TI Clang-based Toolchains +set(_compiler_id_pp_test "defined(__clang__) && defined(__ti__)") + +set(_compiler_id_version_compute " + # define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_DEC@(__ti_major__) + # define @PREFIX@COMPILER_VERSION_MINOR @MACRO_DEC@(__ti_minor__) + # define @PREFIX@COMPILER_VERSION_PATCH @MACRO_DEC@(__ti_patchlevel__)") + +string(APPEND _compiler_id_version_compute " +# define @PREFIX@COMPILER_VERSION_INTERNAL @MACRO_DEC@(__ti_version__)") diff --git a/Modules/Compiler/TIClang.cmake b/Modules/Compiler/TIClang.cmake new file mode 100644 index 0000000000000000000000000000000000000000..4965e62712d5e6acc85b7442a72111bfa07a4af7 --- /dev/null +++ b/Modules/Compiler/TIClang.cmake @@ -0,0 +1,30 @@ +if(__COMPILER_TICLANG) + return() +endif() +set(__COMPILER_TICLANG TRUE) + +include(Compiler/CMakeCommonCompilerMacros) + +# get linker supported cpu list +macro(__compiler_ticlang lang) + set(CMAKE_${lang}_RESPONSE_FILE_LINK_FLAG "-Xlinker ") + + set(CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE "<CMAKE_${lang}_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>") + + set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE "<CMAKE_${lang}_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>") + + set(CMAKE_${lang}_COMPILE_OBJECT "<CMAKE_${lang}_COMPILER> -c <SOURCE> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT>") + + set(CMAKE_${lang}_LINK_EXECUTABLE "<CMAKE_${lang}_COMPILER> <FLAGS> -Xlinker --output_file=<TARGET> -Xlinker --map_file=<TARGET_NAME>.map -Xlinker --rom_model <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> <LINK_LIBRARIES>") + + set(CMAKE_${lang}_ARCHIVE_CREATE "<CMAKE_AR> cr <TARGET> <OBJECTS>") + set(CMAKE_${lang}_ARCHIVE_APPEND "<CMAKE_AR> r <TARGET> <OBJECTS>") + set(CMAKE_${lang}_ARCHIVE_FINISH "") + + set(CMAKE_${lang}_LINKER_WRAPPER_FLAG "-Xlinker" " ") + set(CMAKE_${lang}_LINKER_WRAPPER_FLAG_SEP) +endmacro() + +set(CMAKE_EXECUTABLE_SUFFIX ".out") +set(CMAKE_LIBRARY_PATH_FLAG "-Wl,--search_path=") +set(CMAKE_LINK_LIBRARY_FLAG "-Wl,--library=") diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 3e22247045ff409c6ab0933081b0674cc521f0ae..d9090d6d416577e2676c72e7c7a8e5813c145a29 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -1177,3 +1177,9 @@ if(CMake_TEST_IAR_TOOLCHAINS) add_RunCMake_test(IAR -DCMake_TEST_IAR_TOOLCHAINS=${CMake_TEST_IAR_TOOLCHAINS}) set_property(TEST RunCMake.IAR APPEND PROPERTY LABELS "IAR") endif() +if(CMake_TEST_TICLANG_TOOLCHAINS) + # This is necessary to preserve the LIST variable contents given by user. + string(REPLACE ";" "$<SEMICOLON>" TOOLCHAINS "${CMake_TEST_TICLANG_TOOLCHAINS}") + add_RunCMake_test(TIClang "-DCMake_TEST_TICLANG_TOOLCHAINS=${TOOLCHAINS}") + set_property(TEST RunCMake.TIClang APPEND PROPERTY LABELS "TIClang") +endif() diff --git a/Tests/RunCMake/TIClang/CMakeLists.txt b/Tests/RunCMake/TIClang/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..94e43ba84bf9ad2e6bca4f228dcb58e57adb9e3d --- /dev/null +++ b/Tests/RunCMake/TIClang/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.29) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/TIClang/RunCMakeTest.cmake b/Tests/RunCMake/TIClang/RunCMakeTest.cmake new file mode 100644 index 0000000000000000000000000000000000000000..898de74001e64c65c675e17bc086a3253711721f --- /dev/null +++ b/Tests/RunCMake/TIClang/RunCMakeTest.cmake @@ -0,0 +1,61 @@ +include(RunCMake) + +# Test expects to be given a LIST of toolchain directories where a TIClang +# compiler binary is expected to be found relative to the "bin" directory: +# "-DCMake_TEST_TICLANG_TOOLCHAINS=<path1>;<path2>;<path3>" +if(RunCMake_GENERATOR MATCHES "Makefile|Ninja") + set(_ticlang_toolchains "${CMake_TEST_TICLANG_TOOLCHAINS}" ) +endif() + +function(run_toolchain case) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-build) + run_cmake_with_options(${case} ${ARGN}) + set(RunCMake_TEST_NO_CLEAN 1) + run_cmake_command(${case}-build ${CMAKE_COMMAND} --build .) +endfunction() + +foreach(_ticlang_toolchain_path IN LISTS _ticlang_toolchains) + file(GLOB _ticlang_toolchain "${_ticlang_toolchain_path}/bin/*clang" ) + if(_ticlang_toolchain STREQUAL "") + message(WARNING + "Could not find a TIClang toolchain at: ${_ticlang_toolchain_path}.") + continue() + endif() + + message(STATUS "Found TIClang toolchain: ${_ticlang_toolchain}") + + if(_ticlang_toolchain MATCHES "tiarmclang") + set(LINK_OPTS "--use_memcpy=fast,--use_memset=fast,-llnk.cmd") + set(CMAKE_FLAGS "-mcpu=cortex-r5 -Oz") + else() + set(CMAKE_FLAGS "") + set(LINK_OPTS "") + endif() + + run_toolchain(ticlang-c + -DCMAKE_SYSTEM_NAME=Generic + -DCMAKE_C_COMPILER=${_ticlang_toolchain} + -DCMAKE_C_FLAGS=${CMAKE_FLAGS} + -DCMAKE_C_LINKER_FLAGS=${LINK_OPTS} + ) + + run_toolchain(ticlang-cxx + -DCMAKE_SYSTEM_NAME=Generic + -DCMAKE_CXX_COMPILER=${_ticlang_toolchain} + -DCMAKE_CXX_FLAGS=${CMAKE_FLAGS} + -DCMAKE_CXX_LINKER_FLAGS=${LINK_OPTS} + ) + + run_toolchain(ticlang-asm + -DCMAKE_SYSTEM_NAME=Generic + -DCMAKE_ASM_COMPILER=${_ticlang_toolchain} + -DCMAKE_ASM_FLAGS=${CMAKE_FLAGS} + ) + + run_toolchain(ticlang-lib + -DCMAKE_SYSTEM_NAME=Generic + -DCMAKE_C_COMPILER=${_ticlang_toolchain} + -DCMAKE_C_FLAGS=${CMAKE_FLAGS} + -DCMAKE_C_LINKER_FLAGS=${LINK_OPTS} + ) +endforeach() diff --git a/Tests/RunCMake/TIClang/libmod.c b/Tests/RunCMake/TIClang/libmod.c new file mode 100644 index 0000000000000000000000000000000000000000..50666c9c23efc234ebb0afd33d8801c972937b94 --- /dev/null +++ b/Tests/RunCMake/TIClang/libmod.c @@ -0,0 +1,4 @@ +int ticlang_libfun() +{ + return 42; +} diff --git a/Tests/RunCMake/TIClang/module.c b/Tests/RunCMake/TIClang/module.c new file mode 100644 index 0000000000000000000000000000000000000000..46d75714b930b2bbba388c299d520f2b862a4ffc --- /dev/null +++ b/Tests/RunCMake/TIClang/module.c @@ -0,0 +1,14 @@ +#include "module.h" +#if defined(__USE_LIBFUN) +extern int ticlang_libfun(); +#endif +int i; +int main() +{ +#if defined(__USE_LIBFUN) + i = ticlang_libfun(); +#else + i = INTERNAL; +#endif + return i; +} diff --git a/Tests/RunCMake/TIClang/module.cxx b/Tests/RunCMake/TIClang/module.cxx new file mode 100644 index 0000000000000000000000000000000000000000..b4d46b123f7e12951062faadc319e3520ad0d9eb --- /dev/null +++ b/Tests/RunCMake/TIClang/module.cxx @@ -0,0 +1,7 @@ +#include "module.h" +int i; +int main() +{ + i = INTERNAL; + return i; +} diff --git a/Tests/RunCMake/TIClang/module.h b/Tests/RunCMake/TIClang/module.h new file mode 100644 index 0000000000000000000000000000000000000000..a8a85a64c460e54b17e95cdd58539f44bfef8bc3 --- /dev/null +++ b/Tests/RunCMake/TIClang/module.h @@ -0,0 +1,12 @@ +#ifndef __MODULE_H__ +#define __MODULE_H__ + +#if defined(__cplusplus) +# define INTERNAL 64 +#elif !defined(__cplusplus) +# define INTERNAL 32 +#else +# error "Unable to determine INTERNAL symbol." +#endif + +#endif /* __MODULE_H__ */ diff --git a/Tests/RunCMake/TIClang/module.s b/Tests/RunCMake/TIClang/module.s new file mode 100644 index 0000000000000000000000000000000000000000..df1635091b0ff120a952911028f1dfad2c1866e1 --- /dev/null +++ b/Tests/RunCMake/TIClang/module.s @@ -0,0 +1,9 @@ + .text + .syntax unified + .section .text.main,"ax",%progbits + .hidden main + .globl main + .p2align 4 +main: + nop + bx lr diff --git a/Tests/RunCMake/TIClang/ticlang-asm.cmake b/Tests/RunCMake/TIClang/ticlang-asm.cmake new file mode 100644 index 0000000000000000000000000000000000000000..f6c27fcedcc864482e7030178e28d4054db7eb69 --- /dev/null +++ b/Tests/RunCMake/TIClang/ticlang-asm.cmake @@ -0,0 +1,5 @@ +enable_language(ASM) + +add_executable(exec-asm) +target_sources(exec-asm PRIVATE module.s) +target_link_options(exec-asm PRIVATE ${LINKER_OPTS}) diff --git a/Tests/RunCMake/TIClang/ticlang-c.cmake b/Tests/RunCMake/TIClang/ticlang-c.cmake new file mode 100644 index 0000000000000000000000000000000000000000..a36f09690bd55f31a7a9cdeda66c7a5fe2b478c5 --- /dev/null +++ b/Tests/RunCMake/TIClang/ticlang-c.cmake @@ -0,0 +1,5 @@ +enable_language(C) + +add_executable(exec-c) +target_sources(exec-c PRIVATE module.c) +target_link_options(exec-c PRIVATE ${LINKER_OPTS}) diff --git a/Tests/RunCMake/TIClang/ticlang-cxx.cmake b/Tests/RunCMake/TIClang/ticlang-cxx.cmake new file mode 100644 index 0000000000000000000000000000000000000000..6b005b55ee05f4258684d8b25575f662f41e875c --- /dev/null +++ b/Tests/RunCMake/TIClang/ticlang-cxx.cmake @@ -0,0 +1,5 @@ +enable_language(CXX) + +add_executable(exec-cxx) +target_sources(exec-cxx PRIVATE module.cxx) +target_link_options(exec-cxx PRIVATE ${LINKER_OPTS}) diff --git a/Tests/RunCMake/TIClang/ticlang-lib.cmake b/Tests/RunCMake/TIClang/ticlang-lib.cmake new file mode 100644 index 0000000000000000000000000000000000000000..e47647cc555c3bc197ba28fabac365732528ec1f --- /dev/null +++ b/Tests/RunCMake/TIClang/ticlang-lib.cmake @@ -0,0 +1,10 @@ +enable_language(C) + +add_library(ticlang-test-lib) +target_sources(ticlang-test-lib PRIVATE libmod.c) + +add_executable(exec-lib-c) +target_sources(exec-lib-c PRIVATE module.c) +target_compile_definitions(exec-lib-c PRIVATE __USE_LIBFUN) +target_link_libraries(exec-lib-c LINK_PUBLIC ticlang-test-lib) +target_link_options(exec-lib-c PRIVATE ${LINKER_OPTS})