| cmake_minimum_required(VERSION 3.5) |
| project(PDBDirectoryAndName C) |
| |
| # Make sure the proper compiler is in use. |
| if(NOT MSVC AND NOT CMAKE_C_COMPILER_ID STREQUAL "Intel" AND NOT CMAKE_C_COMPILER_ID STREQUAL "Clang") |
| message(FATAL_ERROR "The PDBDirectoryAndName test works only with MSVC, Clang or Intel") |
| endif() |
| |
| # Intel 11.1 does not support /Fd but Intel 14.0 does. |
| # TODO: Did a version in between these add it? |
| if((CMAKE_C_COMPILER_ID STREQUAL Intel AND |
| CMAKE_C_COMPILER_VERSION VERSION_LESS 14.0) OR |
| CMAKE_C_COMPILER_ID STREQUAL "IntelLLVM") |
| set(NO_COMPILE_PDB 1) |
| endif() |
| |
| set(my_targets "") |
| |
| add_library(mylibA SHARED mylibA.c) |
| set_target_properties(mylibA PROPERTIES |
| PDB_NAME "mylibA_Special" |
| PDB_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/mylibA_PDB/$<CONFIG>" |
| ) |
| list(APPEND my_targets mylibA) |
| |
| add_library(mylibB STATIC mylibB.c) |
| set_target_properties(mylibB PROPERTIES |
| COMPILE_PDB_NAME "mylibB_Special" |
| COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/mylibB_PDB" |
| ) |
| if(NOT NO_COMPILE_PDB) |
| list(APPEND my_targets mylibB) |
| endif() |
| |
| add_library(mylibC SHARED mylibC.c) |
| set_target_properties(mylibC PROPERTIES |
| PDB_NAME "mylibC_Special" |
| ) |
| list(APPEND my_targets mylibC) |
| |
| add_library(mylibD STATIC mylibD.c) |
| set_target_properties(mylibD PROPERTIES |
| COMPILE_PDB_NAME "mylibD_Special" |
| ) |
| if(NOT NO_COMPILE_PDB) |
| list(APPEND my_targets mylibD) |
| endif() |
| |
| add_executable(myexe myexe.c) |
| set_target_properties(myexe PROPERTIES |
| PDB_NAME "myexe_Special" |
| PDB_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/myexe_PDB" |
| ) |
| list(APPEND my_targets myexe) |
| |
| target_link_libraries(myexe mylibA mylibB mylibC mylibD) |
| |
| add_executable(myexe2 myexe2.c) |
| set_target_properties(myexe2 PROPERTIES |
| PDB_NAME "myexe2_Special" |
| ) |
| list(APPEND my_targets myexe2) |
| |
| target_link_libraries(myexe2 mylibA mylibD) |
| |
| |
| # Clang/C2 does not produce pdb files for static libraries |
| if (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND |
| CMAKE_C_SIMULATE_ID STREQUAL "MSVC") |
| list(REMOVE_ITEM my_targets mylibB mylibD) |
| endif() |
| |
| |
| #----------------------------------------------------------------------------- |
| # Check that PDB files actually appear where expected. |
| |
| set(pdbs "") |
| foreach(t ${my_targets}) |
| get_property(pdb_name TARGET ${t} PROPERTY PDB_NAME) |
| get_property(pdb_dir TARGET ${t} PROPERTY PDB_OUTPUT_DIRECTORY) |
| if(NOT pdb_name) |
| get_property(pdb_name TARGET ${t} PROPERTY COMPILE_PDB_NAME) |
| endif() |
| if(NOT pdb_dir) |
| get_property(pdb_dir TARGET ${t} PROPERTY COMPILE_PDB_OUTPUT_DIRECTORY) |
| endif() |
| if(NOT pdb_dir) |
| set(pdb_dir ${CMAKE_CURRENT_BINARY_DIR}) |
| endif() |
| if (pdb_dir MATCHES "\\$<.*>") |
| # Skip per-configuration subdirectory if the value contained |
| # a generator expression. |
| list(APPEND pdbs ${pdb_dir}/${pdb_name}.pdb) |
| else() |
| list(APPEND pdbs ${pdb_dir}/${CMAKE_CFG_INTDIR}/${pdb_name}.pdb) |
| endif() |
| endforeach() |
| add_custom_target(check_pdbs ALL VERBATIM |
| COMMAND ${CMAKE_COMMAND} -Dconfig=$<CONFIGURATION> "-Dpdbs=${pdbs}" |
| -P ${CMAKE_CURRENT_SOURCE_DIR}/check_pdbs.cmake |
| ) |
| add_dependencies(check_pdbs ${my_targets}) |