mirror of
https://github.com/reactos/CMake.git
synced 2025-03-04 01:47:37 +00:00

Since commit d44c0db0b2 (clang: setup correct configuration in gnu mode, 2019-02-20, v3.15.0-rc1~41^2~5) we support the GNU-like Clang that targets the MSVC ABI. However, Clang cannot compile with the MSVC standard library unless it runs in a mode aware of C++14 (since MSVC itself does not even have a lower mode). When `CMAKE_CXX_STANDARD` is set to 98 or 11, use C++14 anyway. Since Clang's default mode is aware of C++14, another option is to not add any flags for 98 or 11. However, if a future Clang version ever defaults to a higher C++ standard, setting the standard to 98 or 11 should at least not use a mode higher than 14. Also revert test updates from commit 4819ff9647 (Tests: fix failures with gnu mode clang on windows, 2019-03-21, v3.15.0-rc1~41^2~3) that were meant to work around the standard selection problem. Fixes: #19496
82 lines
2.5 KiB
CMake
82 lines
2.5 KiB
CMake
cmake_minimum_required(VERSION 2.8.11)
|
|
cmake_policy(SET CMP0054 NEW)
|
|
project(AliasTarget)
|
|
|
|
set(CMAKE_CXX_STANDARD 98)
|
|
|
|
# Clang/C2 in C++98 mode cannot properly handle some of MSVC headers
|
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND
|
|
CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
|
|
set(CMAKE_CXX_STANDARD 11)
|
|
endif()
|
|
|
|
add_library(foo SHARED empty.cpp)
|
|
add_library(PREFIX::Foo ALIAS foo)
|
|
add_library(Another::Alias ALIAS foo)
|
|
|
|
add_library(objects OBJECT object.cpp)
|
|
add_library(Alias::Objects ALIAS objects)
|
|
|
|
target_compile_definitions(foo PUBLIC FOO_DEFINE)
|
|
|
|
add_library(bar SHARED empty.cpp)
|
|
target_compile_definitions(bar PUBLIC BAR_DEFINE)
|
|
|
|
target_link_libraries(foo LINK_PUBLIC $<$<STREQUAL:$<TARGET_PROPERTY:PREFIX::Foo,ALIASED_TARGET>,foo>:bar>)
|
|
|
|
add_executable(AliasTarget commandgenerator.cpp $<TARGET_OBJECTS:Alias::Objects>)
|
|
add_executable(PREFIX::AliasTarget ALIAS AliasTarget)
|
|
add_executable(Generator::Command ALIAS AliasTarget)
|
|
|
|
add_custom_command(OUTPUT commandoutput.h COMMAND Generator::Command)
|
|
|
|
add_library(bat SHARED bat.cpp "${CMAKE_CURRENT_BINARY_DIR}/commandoutput.h")
|
|
target_link_libraries(bat PREFIX::Foo)
|
|
target_include_directories(bat PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
|
|
|
|
add_executable(targetgenerator targetgenerator.cpp)
|
|
add_executable(Generator::Target ALIAS targetgenerator)
|
|
|
|
add_subdirectory(subdir)
|
|
|
|
add_custom_target(usealias Generator::Target $<TARGET_FILE:Sub::tgt>)
|
|
add_dependencies(bat usealias)
|
|
|
|
if (NOT TARGET Another::Alias)
|
|
message(SEND_ERROR "Another::Alias is not considered a target.")
|
|
endif()
|
|
|
|
get_target_property(_alt PREFIX::Foo ALIASED_TARGET)
|
|
if (NOT ${_alt} STREQUAL foo)
|
|
message(SEND_ERROR "ALIASED_TARGET is not foo: ${_alt}")
|
|
endif()
|
|
|
|
get_property(_alt2 TARGET PREFIX::Foo PROPERTY ALIASED_TARGET)
|
|
if (NOT ${_alt2} STREQUAL foo)
|
|
message(SEND_ERROR "ALIASED_TARGET is not foo.")
|
|
endif()
|
|
|
|
add_library(iface INTERFACE)
|
|
add_library(Alias::Iface ALIAS iface)
|
|
|
|
get_property(_aliased_target_set TARGET foo PROPERTY ALIASED_TARGET SET)
|
|
if(_aliased_target_set)
|
|
message(SEND_ERROR "ALIASED_TARGET is set for target foo")
|
|
endif()
|
|
|
|
get_target_property(_notAlias1 foo ALIASED_TARGET)
|
|
if (NOT DEFINED _notAlias1)
|
|
message(SEND_ERROR "_notAlias1 is not defined")
|
|
endif()
|
|
if (_notAlias1)
|
|
message(SEND_ERROR "_notAlias1 is defined, but foo is not an ALIAS")
|
|
endif()
|
|
if (NOT _notAlias1 STREQUAL _notAlias1-NOTFOUND)
|
|
message(SEND_ERROR "_notAlias1 not defined to a -NOTFOUND variant")
|
|
endif()
|
|
|
|
get_property(_notAlias2 TARGET foo PROPERTY ALIASED_TARGET)
|
|
if (_notAlias2)
|
|
message(SEND_ERROR "_notAlias2 evaluates to true, but foo is not an ALIAS")
|
|
endif()
|