Path: blob/master/Tests/BuildDepends/Project/CMakeLists.txt
3153 views
cmake_minimum_required(VERSION 3.10)1project(testRebuild)23if(APPLE AND CMake_TEST_XCODE_VERSION)4# only use multi-arch if the sysroot exists on this machine5# Ninja needs -M which could not be used with multiple -arch flags6if(EXISTS "${CMAKE_OSX_SYSROOT}" AND NOT "${CMAKE_GENERATOR}" MATCHES "Ninja|FASTBuild")7if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 12)8set(CMAKE_OSX_ARCHITECTURES arm64 x86_64)9elseif(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 10)10# Arch 'i386' no longer works in Xcode 10.11set(CMAKE_OSX_ARCHITECTURES x86_64)12elseif(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 4)13# Arch 'ppc' no longer works in Xcode 4.14set(CMAKE_OSX_ARCHITECTURES i386 x86_64)15else()16set(CMAKE_OSX_ARCHITECTURES ppc i386)17endif()18endif()19endif()2021add_library(foo STATIC ${testRebuild_BINARY_DIR}/foo.cxx)22set_target_properties(foo PROPERTIES OUTPUT_NAME "foolib")23# Add a generated header that regenerates when the generator is24# rebuilt.25add_custom_command(26OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/regen.h27COMMAND generator ${CMAKE_CURRENT_BINARY_DIR}/regen.h regen28DEPENDS generator # adds file-level dependency to re-run rule29)3031# Add a generated header that does NOT regenerate when the generator32# is rebuilt.33add_custom_command(34OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/noregen.h35COMMAND generator ${CMAKE_CURRENT_BINARY_DIR}/noregen.h noregen36)3738# Test that the generator rebuilds when the static library source file39# changes. This should cause regen.h to be recreated also.40add_executable(generator generator.cxx)41target_link_libraries(generator foo)42set_target_properties(generator PROPERTIES OUTPUT_NAME "gen")4344# Build an executable to drive the build and rebuild.45include_directories(${CMAKE_CURRENT_BINARY_DIR})46add_executable(bar bar.cxx47${CMAKE_CURRENT_BINARY_DIR}/regen.h48${CMAKE_CURRENT_BINARY_DIR}/noregen.h49)5051if(CMAKE_XCODE_BUILD_SYSTEM VERSION_GREATER_EQUAL 12)52target_compile_definitions(bar PRIVATE XCODE_NEW_BUILD_SYSTEM)53endif()5455#-----------------------------------------------------------------------------56if("${CMAKE_GENERATOR}" MATCHES "Make")57# Test the IMPLICIT_DEPENDS feature.58set(ZOT_DEPENDS IMPLICIT_DEPENDS CXX ${CMAKE_CURRENT_SOURCE_DIR}/dep.cxx)59set(ZOT_CUSTOM_DEP60IMPLICIT_DEPENDS CXX ${CMAKE_CURRENT_SOURCE_DIR}/dep_custom.cxx61CXX ${CMAKE_CURRENT_SOURCE_DIR}/dep_custom2.cxx )62else()63# No IMPLICIT_DEPENDS...just depend directly.64set(ZOT_DEPENDS DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/zot.hxx.in)65set(ZOT_CUSTOM_DEP DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx.in)66endif()67add_custom_command(68OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zot.hxx69COMMAND ${CMAKE_COMMAND} -E copy70${CMAKE_CURRENT_BINARY_DIR}/zot.hxx.in71${CMAKE_CURRENT_BINARY_DIR}/zot.hxx72${ZOT_DEPENDS}73)7475add_custom_command(76OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx77COMMAND ${CMAKE_COMMAND} -E copy78${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx.in79${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx80${ZOT_CUSTOM_DEP}81)82add_custom_target(zot_custom ALL DEPENDS83${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx)8485add_executable(zot zot.cxx ${CMAKE_CURRENT_BINARY_DIR}/zot.hxx86zot_macro_dir.cxx zot_macro_tgt.cxx)87add_dependencies(zot zot_custom)8889add_library(zot_pch zot_pch.cxx)90target_link_libraries(zot zot_pch)91if(NOT CMAKE_OSX_ARCHITECTURES MATCHES "[;$]")92target_precompile_headers(zot_pch PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/zot_pch.hxx)93endif()94if (CMAKE_CXX_DEPENDS_USE_COMPILER AND95CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.4")96# Mixing pre-compile headers and flags to generate dependencies (-M options family)97# causes the compiler to crash98set_property(TARGET zot_pch PROPERTY DISABLE_PRECOMPILE_HEADERS ON)99endif()100101# Test the #include line macro transformation rule support.102set_property(103TARGET zot104PROPERTY IMPLICIT_DEPENDS_INCLUDE_TRANSFORM "ZOT_TGT(%)=<zot_%_tgt.hxx>"105)106107set_property(108DIRECTORY109PROPERTY IMPLICIT_DEPENDS_INCLUDE_TRANSFORM "ZOT_DIR(%)=<zot_%_dir.hxx>"110)111112if(TEST_LINK_DEPENDS)113add_executable(linkdep linkdep.cxx)114set_property(TARGET linkdep PROPERTY LINK_DEPENDS $<1:${TEST_LINK_DEPENDS}>)115116add_library(foo_interface INTERFACE)117set_property(TARGET foo_interface PROPERTY INTERFACE_LINK_DEPENDS $<1:${TEST_LINK_DEPENDS}>)118add_executable(linkdep2 linkdep.cxx)119target_link_libraries(linkdep2 PRIVATE foo_interface)120121add_executable(linkdep3 linkdep.cxx)122set_property(TARGET linkdep3 PROPERTY LINK_DEPENDS $<$<LINK_LANGUAGE:CXX>:${TEST_LINK_DEPENDS}>)123124add_library(foo_interface2 INTERFACE)125set_property(TARGET foo_interface2 PROPERTY INTERFACE_LINK_DEPENDS $<$<LINK_LANGUAGE:CXX>:${TEST_LINK_DEPENDS}>)126add_executable(linkdep4 linkdep.cxx)127target_link_libraries(linkdep4 PRIVATE foo_interface2)128endif()129130add_library(link_depends_no_shared_lib SHARED link_depends_no_shared_lib.c131${CMAKE_CURRENT_BINARY_DIR}/link_depends_no_shared_lib.h)132add_executable(link_depends_no_shared_exe link_depends_no_shared_exe.c133${CMAKE_CURRENT_BINARY_DIR}/link_depends_no_shared_exe.h)134target_link_libraries(link_depends_no_shared_exe link_depends_no_shared_lib)135set_property(TARGET link_depends_no_shared_exe PROPERTY LINK_DEPENDS_NO_SHARED 1)136add_custom_target(link_depends_no_shared_check ALL137COMMAND ${CMAKE_COMMAND}138-Dlib=$<TARGET_FILE:link_depends_no_shared_lib>139-Dexe=$<TARGET_FILE:link_depends_no_shared_exe>140-Dout=${CMAKE_CURRENT_BINARY_DIR}/link_depends_no_shared_check.txt141-P ${CMAKE_CURRENT_SOURCE_DIR}/link_depends_no_shared_check.cmake142)143add_dependencies(link_depends_no_shared_check link_depends_no_shared_exe)144145add_custom_command(146OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dir/header.h147DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/dir/header.txt148COMMAND ${CMAKE_COMMAND} -E copy_if_different149${CMAKE_CURRENT_BINARY_DIR}/dir/header.txt150${CMAKE_CURRENT_BINARY_DIR}/dir/header.h151)152153set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/dir/header.h154PROPERTIES GENERATED 1)155156add_custom_target(header_tgt DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/dir/header.h)157include_directories(${CMAKE_CURRENT_BINARY_DIR})158add_executable(ninjadep ninjadep.cpp)159add_dependencies(ninjadep header_tgt)160161include(ExternalProject)162ExternalProject_Add(ExternalBuild163SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/External164BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/External165STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/External/Stamp166BUILD_ALWAYS 1167CMAKE_ARGS168-Dexternal_in=${CMAKE_CURRENT_BINARY_DIR}/external.in169-Dexternal_out=${CMAKE_CURRENT_BINARY_DIR}/external.out170INSTALL_COMMAND ""171)172173add_custom_command(174OUTPUT multi1-out1.txt multi1-out2.txt175COMMAND ${CMAKE_COMMAND} -E copy multi1-in.txt multi1-out1.txt176COMMAND ${CMAKE_COMMAND} -E copy multi1-in.txt multi1-out2.txt177DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/multi1-in.txt178)179add_custom_command(180OUTPUT multi1-out2-copy.txt181COMMAND ${CMAKE_COMMAND} -E copy multi1-out2.txt multi1-out2-copy.txt182DEPENDS multi1-out2.txt183)184add_custom_target(multi1 ALL DEPENDS multi1-out2-copy.txt)185186# Test having the first output never created.187add_custom_command(188OUTPUT multi2-dummy.txt multi2-real.txt189COMMAND ${CMAKE_COMMAND} -E touch multi2-real.txt190)191set_property(SOURCE multi2-real.txt multi2-dummy.txt PROPERTY SYMBOLIC 1)192add_custom_target(multi2 ALL DEPENDS multi2-real.txt)193194if(TEST_MULTI3)195# Test having the second output never created. Does not work with msbuild.196add_custom_command(197OUTPUT multi3-real.txt multi3-dummy.txt198COMMAND ${CMAKE_COMMAND} -E touch multi3-real.txt199)200set_property(SOURCE multi3-real.txt multi3-dummy.txt PROPERTY SYMBOLIC 1)201add_custom_target(multi3 ALL DEPENDS multi3-real.txt)202endif()203204add_executable(object_depends object_depends.cxx)205set_property(SOURCE object_depends.cxx PROPERTY OBJECT_DEPENDS206${CMAKE_CURRENT_BINARY_DIR}/object_depends.txt)207add_custom_target(object_depends_check ALL208COMMAND ${CMAKE_COMMAND}209-Dexe=$<TARGET_FILE:object_depends>210-Dout=${CMAKE_CURRENT_BINARY_DIR}/object_depends_check.txt211-Dtxt=${CMAKE_CURRENT_BINARY_DIR}/object_depends.txt212-P ${CMAKE_CURRENT_SOURCE_DIR}/object_depends_check.cmake213)214add_dependencies(object_depends_check object_depends)215216217