diff --git a/Modules/CMakeASMCompiler.cmake.in b/Modules/CMakeASMCompiler.cmake.in index 81da7eca96..f4bd7fef7e 100644 --- a/Modules/CMakeASMCompiler.cmake.in +++ b/Modules/CMakeASMCompiler.cmake.in @@ -18,6 +18,8 @@ set(CMAKE_ASM@ASM_DIALECT@_COMPILER_LOADED 1) set(CMAKE_ASM@ASM_DIALECT@_COMPILER_ID "@_CMAKE_ASM_COMPILER_ID@") set(CMAKE_ASM@ASM_DIALECT@_COMPILER_VERSION "@_CMAKE_ASM_COMPILER_VERSION@") set(CMAKE_ASM@ASM_DIALECT@_COMPILER_ENV_VAR "@_CMAKE_ASM_COMPILER_ENV_VAR@") +set(CMAKE_ASM@ASM_DIALECT@_COMPILER_FRONTEND_VARIANT "@_CMAKE_ASM_COMPILER_FRONTEND_VARIANT@") +set(CMAKE_ASM@ASM_DIALECT@_SIMULATE_ID "@_CMAKE_ASM_SIMULATE_ID@") @_SET_CMAKE_ASM_COMPILER_ID_VENDOR_MATCH@ set(CMAKE_ASM@ASM_DIALECT@_COMPILER_ARCHITECTURE_ID "@_CMAKE_ASM_COMPILER_ARCHITECTURE_ID@") @_SET_CMAKE_ASM_COMPILER_SYSROOT@ diff --git a/Modules/CMakeDetermineASMCompiler.cmake b/Modules/CMakeDetermineASMCompiler.cmake index 1ca5e731c4..8922149ab4 100644 --- a/Modules/CMakeDetermineASMCompiler.cmake +++ b/Modules/CMakeDetermineASMCompiler.cmake @@ -297,7 +297,7 @@ endif() # configure variables set in this file for fast reload later on block() foreach(_var IN ITEMS - # Keep in sync with Internal/CMakeTestASMLinker. + # Keep in sync with Internal/CMakeInspectASMLinker. COMPILER COMPILER_ID COMPILER_ARG1 @@ -306,6 +306,8 @@ block() COMPILER_RANLIB COMPILER_VERSION COMPILER_ARCHITECTURE_ID + COMPILER_FRONTEND_VARIANT + SIMULATE_ID ) set(_CMAKE_ASM_${_var} "${CMAKE_ASM${ASM_DIALECT}_${_var}}") endforeach() diff --git a/Modules/Internal/CMakeInspectASMLinker.cmake b/Modules/Internal/CMakeInspectASMLinker.cmake index 1ae7a402a8..704df5abf0 100644 --- a/Modules/Internal/CMakeInspectASMLinker.cmake +++ b/Modules/Internal/CMakeInspectASMLinker.cmake @@ -14,6 +14,8 @@ block() COMPILER_RANLIB COMPILER_VERSION COMPILER_ARCHITECTURE_ID + COMPILER_FRONTEND_VARIANT + SIMULATE_ID # Linker information. COMPILER_LINKER COMPILER_LINKER_ID diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 42f60f3f6c..edfa285175 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -393,6 +393,7 @@ if(CMAKE_GENERATOR MATCHES "Make|Ninja") add_RunCMake_test(Color) endif() add_RunCMake_test(CompilerChange) +add_RunCMake_test(CompilerInfo -DPSEUDO_ASM=$) add_RunCMake_test(CompilerNotFound) if(DEFINED CMake_TEST_OBJC) list(APPEND CMake_TEST_LANG_VARS -DCMake_TEST_OBJC=${CMake_TEST_OBJC}) @@ -1288,6 +1289,7 @@ if(CMake_TEST_FindMatlab OR CMake_TEST_FindMatlab_MCR OR (NOT "${CMake_TEST_Find set_property(TEST RunCMake.FindMatlab APPEND PROPERTY LABELS "Matlab") endif() +add_executable(pseudo_asm pseudo_asm.c) add_executable(pseudo_emulator pseudo_emulator.c) add_executable(pseudo_emulator_custom_command pseudo_emulator_custom_command.c) add_executable(pseudo_emulator_custom_command_arg pseudo_emulator_custom_command_arg.c) diff --git a/Tests/RunCMake/CompilerInfo/ASM-check-common.cmake b/Tests/RunCMake/CompilerInfo/ASM-check-common.cmake new file mode 100644 index 0000000000..7fc7bfa844 --- /dev/null +++ b/Tests/RunCMake/CompilerInfo/ASM-check-common.cmake @@ -0,0 +1,17 @@ +# The information file is what a later configure reloads, so load it the same +# way and check that every field detection computed was recorded. The caller +# sets the expect_* values for the assembler flavor under test. +include("${RunCMake_TEST_BINARY_DIR}/CMakeFiles/${CMAKE_VERSION}/CMakeASMCompiler.cmake") + +foreach(var + CMAKE_ASM_COMPILER_ID + CMAKE_ASM_SIMULATE_ID + CMAKE_ASM_COMPILER_FRONTEND_VARIANT + ) + if(NOT "${${var}}" STREQUAL "${expect_${var}}") + string(APPEND RunCMake_TEST_FAILED + "${var} was not recorded in the assembler information file:\n" + " expected: '${expect_${var}}'\n" + " reloaded: '${${var}}'\n") + endif() +endforeach() diff --git a/Tests/RunCMake/CompilerInfo/ASM-clang-cl-check.cmake b/Tests/RunCMake/CompilerInfo/ASM-clang-cl-check.cmake new file mode 100644 index 0000000000..e8359992b8 --- /dev/null +++ b/Tests/RunCMake/CompilerInfo/ASM-clang-cl-check.cmake @@ -0,0 +1,4 @@ +set(expect_CMAKE_ASM_COMPILER_ID "Clang") +set(expect_CMAKE_ASM_SIMULATE_ID "MSVC") +set(expect_CMAKE_ASM_COMPILER_FRONTEND_VARIANT "MSVC") +include("${RunCMake_SOURCE_DIR}/ASM-check-common.cmake") diff --git a/Tests/RunCMake/CompilerInfo/ASM-clang-cl.cmake b/Tests/RunCMake/CompilerInfo/ASM-clang-cl.cmake new file mode 100644 index 0000000000..8de0492e3a --- /dev/null +++ b/Tests/RunCMake/CompilerInfo/ASM-clang-cl.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_SOURCE_DIR}/ASM-common.cmake") diff --git a/Tests/RunCMake/CompilerInfo/ASM-clang-gnu-check.cmake b/Tests/RunCMake/CompilerInfo/ASM-clang-gnu-check.cmake new file mode 100644 index 0000000000..9713ca5111 --- /dev/null +++ b/Tests/RunCMake/CompilerInfo/ASM-clang-gnu-check.cmake @@ -0,0 +1,5 @@ +# A GNU-like command-line leaves the simulate id empty. +set(expect_CMAKE_ASM_COMPILER_ID "Clang") +set(expect_CMAKE_ASM_SIMULATE_ID "") +set(expect_CMAKE_ASM_COMPILER_FRONTEND_VARIANT "GNU") +include("${RunCMake_SOURCE_DIR}/ASM-check-common.cmake") diff --git a/Tests/RunCMake/CompilerInfo/ASM-clang-gnu.cmake b/Tests/RunCMake/CompilerInfo/ASM-clang-gnu.cmake new file mode 100644 index 0000000000..8de0492e3a --- /dev/null +++ b/Tests/RunCMake/CompilerInfo/ASM-clang-gnu.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_SOURCE_DIR}/ASM-common.cmake") diff --git a/Tests/RunCMake/CompilerInfo/ASM-common.cmake b/Tests/RunCMake/CompilerInfo/ASM-common.cmake new file mode 100644 index 0000000000..a5fd55d85f --- /dev/null +++ b/Tests/RunCMake/CompilerInfo/ASM-common.cmake @@ -0,0 +1,15 @@ +# Assembler information is detected once and written to +# CMakeASMCompiler.cmake, then reloaded from that file on every later +# configure. A field that detection computes but the file does not record +# comes back empty, so a re-configure sees a different assembler than the one +# that was detected. The -check script reloads the file and verifies this. + +enable_language(ASM) + +# Detection must identify the assembler in the first place. +if(NOT CMAKE_ASM_COMPILER_ID) + message(SEND_ERROR "CMAKE_ASM_COMPILER_ID was not detected") +endif() +if(NOT CMAKE_ASM_COMPILER_FRONTEND_VARIANT) + message(SEND_ERROR "CMAKE_ASM_COMPILER_FRONTEND_VARIANT was not detected") +endif() diff --git a/Tests/RunCMake/CompilerInfo/CMakeLists.txt b/Tests/RunCMake/CompilerInfo/CMakeLists.txt new file mode 100644 index 0000000000..0ceb19a24c --- /dev/null +++ b/Tests/RunCMake/CompilerInfo/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 4.4) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/CompilerInfo/RunCMakeTest.cmake b/Tests/RunCMake/CompilerInfo/RunCMakeTest.cmake new file mode 100644 index 0000000000..2c9f061af6 --- /dev/null +++ b/Tests/RunCMake/CompilerInfo/RunCMakeTest.cmake @@ -0,0 +1,14 @@ +include(RunCMake) + +block() + # The stand-in assembler reports an MSVC-like command-line by default and a + # GNU-like one when PSEUDO_ASM_GNU is set, which selects the two branches of + # assembler identification that populate these fields differently. + set(RunCMake_TEST_OPTIONS "-DCMAKE_ASM_COMPILER=${PSEUDO_ASM}") + + run_cmake(ASM-clang-cl) + + set(ENV{PSEUDO_ASM_GNU} 1) + run_cmake(ASM-clang-gnu) + unset(ENV{PSEUDO_ASM_GNU}) +endblock() diff --git a/Tests/RunCMake/pseudo_asm.c b/Tests/RunCMake/pseudo_asm.c new file mode 100644 index 0000000000..10935852c0 --- /dev/null +++ b/Tests/RunCMake/pseudo_asm.c @@ -0,0 +1,30 @@ +#ifndef _CRT_SECURE_NO_WARNINGS +# define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include + +/* + Usage: pseudo_asm [--version] [-?] + + --version: print a banner that identifies this program as Clang. + -?: return 0 for MSVC-like command-line, 1 for GNU-like command-line, + depending on the presence of the PSEUDO_ASM_GNU environment variable. +*/ +int main(int argc, char* argv[]) +{ + int i; + for (i = 1; i < argc; ++i) { + if (strcmp(argv[i], "--version") == 0) { + printf("clang version 99.0.0 (pseudo_asm)\n"); + return 0; + } + if (strcmp(argv[i], "-?") == 0) { + char const* gnu = getenv("PSEUDO_ASM_GNU"); + return (gnu && *gnu) ? 1 : 0; + } + } + return 0; +}