mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-21 23:00:50 +08:00
MSVC: Add test for debug information format
Verify that the format's flags are used to compile, both in the main project and in `try_compile` test projects.
This commit is contained in:
@@ -2080,6 +2080,15 @@ if(BUILD_TESTING)
|
||||
if(NOT CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_C_COMPILER_ID STREQUAL "IntelLLVM")
|
||||
ADD_TEST_MACRO(PrecompiledHeader foo)
|
||||
endif()
|
||||
|
||||
set(MSVCDebugInformationFormat_BUILD_OPTIONS -DCMake_TEST_CUDA=${CMake_TEST_CUDA})
|
||||
if(CMAKE_Fortran_COMPILER)
|
||||
list(APPEND MSVCDebugInformationFormat_BUILD_OPTIONS -DCMake_TEST_Fortran=1)
|
||||
endif()
|
||||
ADD_TEST_MACRO(MSVCDebugInformationFormat)
|
||||
set_property(TEST MSVCDebugInformationFormat APPEND
|
||||
PROPERTY LABELS "CUDA")
|
||||
|
||||
set(MSVCRuntimeLibrary_BUILD_OPTIONS -DCMake_TEST_CUDA=${CMake_TEST_CUDA})
|
||||
ADD_TEST_MACRO(MSVCRuntimeLibrary)
|
||||
set_property(TEST MSVCRuntimeLibrary APPEND
|
||||
|
81
Tests/MSVCDebugInformationFormat/CMakeLists.txt
Normal file
81
Tests/MSVCDebugInformationFormat/CMakeLists.txt
Normal file
@@ -0,0 +1,81 @@
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
cmake_policy(SET CMP0141 NEW)
|
||||
|
||||
# The debug information format flags do not change preprocessor definitions,
|
||||
# so override our table of flags to artificially add a definition we can check.
|
||||
set(CMAKE_USER_MAKE_RULES_OVERRIDE_C ${CMAKE_CURRENT_SOURCE_DIR}/override-C.cmake)
|
||||
set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX ${CMAKE_CURRENT_SOURCE_DIR}/override-CXX.cmake)
|
||||
set(CMAKE_USER_MAKE_RULES_OVERRIDE_CUDA ${CMAKE_CURRENT_SOURCE_DIR}/override-CUDA.cmake)
|
||||
set(CMAKE_USER_MAKE_RULES_OVERRIDE_Fortran ${CMAKE_CURRENT_SOURCE_DIR}/override-Fortran.cmake)
|
||||
|
||||
project(MSVCDebugInformationFormat)
|
||||
if(CMake_TEST_CUDA)
|
||||
enable_language(CUDA)
|
||||
endif()
|
||||
if(CMake_TEST_Fortran)
|
||||
enable_language(Fortran)
|
||||
endif()
|
||||
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
if("${CMAKE_C_COMPILER_ID};${CMAKE_C_SIMULATE_ID};${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "Clang;MSVC;GNU")
|
||||
set(verify_default VERIFY_Z7)
|
||||
set(NO_COMPILER_PDB 1)
|
||||
elseif("${CMAKE_C_COMPILER_ID};${CMAKE_C_SIMULATE_ID};${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "Clang;MSVC;MSVC")
|
||||
set(verify_default VERIFY_Zi)
|
||||
set(NO_EDIT_AND_CONTINUE 1)
|
||||
else()
|
||||
set(verify_default VERIFY_Zi)
|
||||
endif()
|
||||
|
||||
set(verify_def_Embedded -DVERIFY_Z7)
|
||||
set(verify_def_ProgramDatabase -DVERIFY_Zi)
|
||||
set(verify_def_EditAndContinue -DVERIFY_ZI)
|
||||
|
||||
function(verify_combination format lang src)
|
||||
# Test that try_compile builds with this debug format.
|
||||
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "${format}")
|
||||
set(CMAKE_TRY_COMPILE_CONFIGURATION "Debug")
|
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
|
||||
try_compile(${format}_COMPILES
|
||||
${CMAKE_CURRENT_BINARY_DIR}/try_compile/${format}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/${src}
|
||||
COMPILE_DEFINITIONS ${verify_def_${format}}
|
||||
CMAKE_FLAGS -DINCLUDE_DIRECTORIES=${CMAKE_CURRENT_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE ${format}_OUTPUT
|
||||
)
|
||||
if(${format}_COMPILES)
|
||||
message(STATUS "try_compile ${lang} with ${format} worked")
|
||||
else()
|
||||
string(REPLACE "\n" "\n " ${format}_OUTPUT " ${${format}_OUTPUT}")
|
||||
message(SEND_ERROR "try_compile ${lang} with ${format} failed:\n${${format}_OUTPUT}")
|
||||
endif()
|
||||
|
||||
# Test that targets build with this debug format.
|
||||
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$<BOOL:$<TARGET_PROPERTY:BOOL_TRUE>>:${format}>$<$<BOOL:$<TARGET_PROPERTY:BOOL_FALSE>>:BadContent>")
|
||||
add_library(${format}-${lang} ${src})
|
||||
set_property(TARGET ${format}-${lang} PROPERTY BOOL_TRUE TRUE)
|
||||
target_compile_definitions(${format}-${lang} PRIVATE ${verify_def_${format}})
|
||||
endfunction()
|
||||
|
||||
function(verify lang src)
|
||||
add_library(default-${lang} ${src})
|
||||
target_compile_definitions(default-${lang} PRIVATE "$<$<CONFIG:Debug,RelWithDebInfo>:${verify_default}>")
|
||||
|
||||
verify_combination(Embedded ${lang} ${src})
|
||||
if(NOT NO_COMPILER_PDB)
|
||||
verify_combination(ProgramDatabase ${lang} ${src})
|
||||
if(NOT NO_EDIT_AND_CONTINUE AND NOT lang MATCHES "^(Fortran)$")
|
||||
verify_combination(EditAndContinue ${lang} ${src})
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
verify(C verify.c)
|
||||
verify(CXX verify.cxx)
|
||||
if(CMake_TEST_CUDA)
|
||||
verify(CUDA verify.cu)
|
||||
endif()
|
||||
if(CMake_TEST_Fortran)
|
||||
verify(Fortran verify.F90)
|
||||
endif()
|
7
Tests/MSVCDebugInformationFormat/override-C.cmake
Normal file
7
Tests/MSVCDebugInformationFormat/override-C.cmake
Normal file
@@ -0,0 +1,7 @@
|
||||
set(var "CMAKE_C_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_Embedded")
|
||||
string(REPLACE "-Z7" "-Z7;-DTEST_Z7" "${var}" "${${var}}")
|
||||
string(REPLACE "-gcodeview" "-gcodeview;-DTEST_Z7" "${var}" "${${var}}")
|
||||
set(var "CMAKE_C_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_ProgramDatabase")
|
||||
string(REPLACE "-Zi" "-Zi;-DTEST_Zi" "${var}" "${${var}}")
|
||||
set(var "CMAKE_C_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_EditAndContinue")
|
||||
string(REPLACE "-ZI" "-ZI;-DTEST_ZI" "${var}" "${${var}}")
|
6
Tests/MSVCDebugInformationFormat/override-CUDA.cmake
Normal file
6
Tests/MSVCDebugInformationFormat/override-CUDA.cmake
Normal file
@@ -0,0 +1,6 @@
|
||||
set(var "CMAKE_CUDA_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_Embedded")
|
||||
string(REPLACE "-Z7" "-Z7;-DTEST_Z7" "${var}" "${${var}}")
|
||||
set(var "CMAKE_CUDA_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_ProgramDatabase")
|
||||
string(REPLACE "-Zi" "-Zi;-DTEST_Zi" "${var}" "${${var}}")
|
||||
set(var "CMAKE_CUDA_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_EditAndContinue")
|
||||
string(REPLACE "-ZI" "-ZI;-DTEST_ZI" "${var}" "${${var}}")
|
7
Tests/MSVCDebugInformationFormat/override-CXX.cmake
Normal file
7
Tests/MSVCDebugInformationFormat/override-CXX.cmake
Normal file
@@ -0,0 +1,7 @@
|
||||
set(var "CMAKE_CXX_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_Embedded")
|
||||
string(REPLACE "-Z7" "-Z7;-DTEST_Z7" "${var}" "${${var}}")
|
||||
string(REPLACE "-gcodeview" "-gcodeview;-DTEST_Z7" "${var}" "${${var}}")
|
||||
set(var "CMAKE_CXX_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_ProgramDatabase")
|
||||
string(REPLACE "-Zi" "-Zi;-DTEST_Zi" "${var}" "${${var}}")
|
||||
set(var "CMAKE_CXX_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_EditAndContinue")
|
||||
string(REPLACE "-ZI" "-ZI;-DTEST_ZI" "${var}" "${${var}}")
|
4
Tests/MSVCDebugInformationFormat/override-Fortran.cmake
Normal file
4
Tests/MSVCDebugInformationFormat/override-Fortran.cmake
Normal file
@@ -0,0 +1,4 @@
|
||||
set(var "CMAKE_Fortran_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_Embedded")
|
||||
string(REPLACE "-Z7" "-Z7;-DTEST_Z7" "${var}" "${${var}}")
|
||||
set(var "CMAKE_Fortran_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_ProgramDatabase")
|
||||
string(REPLACE "-Zi" "-Zi;-DTEST_Zi" "${var}" "${${var}}")
|
1
Tests/MSVCDebugInformationFormat/verify.F90
Normal file
1
Tests/MSVCDebugInformationFormat/verify.F90
Normal file
@@ -0,0 +1 @@
|
||||
#include "verify.h"
|
1
Tests/MSVCDebugInformationFormat/verify.c
Normal file
1
Tests/MSVCDebugInformationFormat/verify.c
Normal file
@@ -0,0 +1 @@
|
||||
#include "verify.h"
|
1
Tests/MSVCDebugInformationFormat/verify.cu
Normal file
1
Tests/MSVCDebugInformationFormat/verify.cu
Normal file
@@ -0,0 +1 @@
|
||||
#include "verify.h"
|
1
Tests/MSVCDebugInformationFormat/verify.cxx
Normal file
1
Tests/MSVCDebugInformationFormat/verify.cxx
Normal file
@@ -0,0 +1 @@
|
||||
#include "verify.h"
|
29
Tests/MSVCDebugInformationFormat/verify.h
Normal file
29
Tests/MSVCDebugInformationFormat/verify.h
Normal file
@@ -0,0 +1,29 @@
|
||||
#ifdef VERIFY_Z7
|
||||
# ifndef TEST_Z7
|
||||
# error "TEST_Z7 incorrectly not defined by debug format selection"
|
||||
# endif
|
||||
#else
|
||||
# ifdef TEST_Z7
|
||||
# error "TEST_Z7 incorrectly defined by non-debug format selection"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef VERIFY_Zi
|
||||
# ifndef TEST_Zi
|
||||
# error "TEST_Zi incorrectly not defined by debug format selection"
|
||||
# endif
|
||||
#else
|
||||
# ifdef TEST_Zi
|
||||
# error "TEST_Zi incorrectly defined by non-debug format selection"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef VERIFY_ZI
|
||||
# ifndef TEST_ZI
|
||||
# error "TEST_ZI incorrectly not defined by debug format selection"
|
||||
# endif
|
||||
#else
|
||||
# ifdef TEST_ZI
|
||||
# error "TEST_ZI incorrectly defined by non-debug format selection"
|
||||
# endif
|
||||
#endif
|
Reference in New Issue
Block a user