Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Kitware
GitHub Repository: Kitware/CMake
Path: blob/master/Tests/BuildDepends/Project/CMakeLists.txt
3153 views
1
cmake_minimum_required(VERSION 3.10)
2
project(testRebuild)
3
4
if(APPLE AND CMake_TEST_XCODE_VERSION)
5
# only use multi-arch if the sysroot exists on this machine
6
# Ninja needs -M which could not be used with multiple -arch flags
7
if(EXISTS "${CMAKE_OSX_SYSROOT}" AND NOT "${CMAKE_GENERATOR}" MATCHES "Ninja|FASTBuild")
8
if(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 12)
9
set(CMAKE_OSX_ARCHITECTURES arm64 x86_64)
10
elseif(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 10)
11
# Arch 'i386' no longer works in Xcode 10.
12
set(CMAKE_OSX_ARCHITECTURES x86_64)
13
elseif(CMake_TEST_XCODE_VERSION VERSION_GREATER_EQUAL 4)
14
# Arch 'ppc' no longer works in Xcode 4.
15
set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
16
else()
17
set(CMAKE_OSX_ARCHITECTURES ppc i386)
18
endif()
19
endif()
20
endif()
21
22
add_library(foo STATIC ${testRebuild_BINARY_DIR}/foo.cxx)
23
set_target_properties(foo PROPERTIES OUTPUT_NAME "foolib")
24
# Add a generated header that regenerates when the generator is
25
# rebuilt.
26
add_custom_command(
27
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/regen.h
28
COMMAND generator ${CMAKE_CURRENT_BINARY_DIR}/regen.h regen
29
DEPENDS generator # adds file-level dependency to re-run rule
30
)
31
32
# Add a generated header that does NOT regenerate when the generator
33
# is rebuilt.
34
add_custom_command(
35
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/noregen.h
36
COMMAND generator ${CMAKE_CURRENT_BINARY_DIR}/noregen.h noregen
37
)
38
39
# Test that the generator rebuilds when the static library source file
40
# changes. This should cause regen.h to be recreated also.
41
add_executable(generator generator.cxx)
42
target_link_libraries(generator foo)
43
set_target_properties(generator PROPERTIES OUTPUT_NAME "gen")
44
45
# Build an executable to drive the build and rebuild.
46
include_directories(${CMAKE_CURRENT_BINARY_DIR})
47
add_executable(bar bar.cxx
48
${CMAKE_CURRENT_BINARY_DIR}/regen.h
49
${CMAKE_CURRENT_BINARY_DIR}/noregen.h
50
)
51
52
if(CMAKE_XCODE_BUILD_SYSTEM VERSION_GREATER_EQUAL 12)
53
target_compile_definitions(bar PRIVATE XCODE_NEW_BUILD_SYSTEM)
54
endif()
55
56
#-----------------------------------------------------------------------------
57
if("${CMAKE_GENERATOR}" MATCHES "Make")
58
# Test the IMPLICIT_DEPENDS feature.
59
set(ZOT_DEPENDS IMPLICIT_DEPENDS CXX ${CMAKE_CURRENT_SOURCE_DIR}/dep.cxx)
60
set(ZOT_CUSTOM_DEP
61
IMPLICIT_DEPENDS CXX ${CMAKE_CURRENT_SOURCE_DIR}/dep_custom.cxx
62
CXX ${CMAKE_CURRENT_SOURCE_DIR}/dep_custom2.cxx )
63
else()
64
# No IMPLICIT_DEPENDS...just depend directly.
65
set(ZOT_DEPENDS DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/zot.hxx.in)
66
set(ZOT_CUSTOM_DEP DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx.in)
67
endif()
68
add_custom_command(
69
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zot.hxx
70
COMMAND ${CMAKE_COMMAND} -E copy
71
${CMAKE_CURRENT_BINARY_DIR}/zot.hxx.in
72
${CMAKE_CURRENT_BINARY_DIR}/zot.hxx
73
${ZOT_DEPENDS}
74
)
75
76
add_custom_command(
77
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx
78
COMMAND ${CMAKE_COMMAND} -E copy
79
${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx.in
80
${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx
81
${ZOT_CUSTOM_DEP}
82
)
83
add_custom_target(zot_custom ALL DEPENDS
84
${CMAKE_CURRENT_BINARY_DIR}/zot_custom.hxx)
85
86
add_executable(zot zot.cxx ${CMAKE_CURRENT_BINARY_DIR}/zot.hxx
87
zot_macro_dir.cxx zot_macro_tgt.cxx)
88
add_dependencies(zot zot_custom)
89
90
add_library(zot_pch zot_pch.cxx)
91
target_link_libraries(zot zot_pch)
92
if(NOT CMAKE_OSX_ARCHITECTURES MATCHES "[;$]")
93
target_precompile_headers(zot_pch PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/zot_pch.hxx)
94
endif()
95
if (CMAKE_CXX_DEPENDS_USE_COMPILER AND
96
CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.4")
97
# Mixing pre-compile headers and flags to generate dependencies (-M options family)
98
# causes the compiler to crash
99
set_property(TARGET zot_pch PROPERTY DISABLE_PRECOMPILE_HEADERS ON)
100
endif()
101
102
# Test the #include line macro transformation rule support.
103
set_property(
104
TARGET zot
105
PROPERTY IMPLICIT_DEPENDS_INCLUDE_TRANSFORM "ZOT_TGT(%)=<zot_%_tgt.hxx>"
106
)
107
108
set_property(
109
DIRECTORY
110
PROPERTY IMPLICIT_DEPENDS_INCLUDE_TRANSFORM "ZOT_DIR(%)=<zot_%_dir.hxx>"
111
)
112
113
if(TEST_LINK_DEPENDS)
114
add_executable(linkdep linkdep.cxx)
115
set_property(TARGET linkdep PROPERTY LINK_DEPENDS $<1:${TEST_LINK_DEPENDS}>)
116
117
add_library(foo_interface INTERFACE)
118
set_property(TARGET foo_interface PROPERTY INTERFACE_LINK_DEPENDS $<1:${TEST_LINK_DEPENDS}>)
119
add_executable(linkdep2 linkdep.cxx)
120
target_link_libraries(linkdep2 PRIVATE foo_interface)
121
122
add_executable(linkdep3 linkdep.cxx)
123
set_property(TARGET linkdep3 PROPERTY LINK_DEPENDS $<$<LINK_LANGUAGE:CXX>:${TEST_LINK_DEPENDS}>)
124
125
add_library(foo_interface2 INTERFACE)
126
set_property(TARGET foo_interface2 PROPERTY INTERFACE_LINK_DEPENDS $<$<LINK_LANGUAGE:CXX>:${TEST_LINK_DEPENDS}>)
127
add_executable(linkdep4 linkdep.cxx)
128
target_link_libraries(linkdep4 PRIVATE foo_interface2)
129
endif()
130
131
add_library(link_depends_no_shared_lib SHARED link_depends_no_shared_lib.c
132
${CMAKE_CURRENT_BINARY_DIR}/link_depends_no_shared_lib.h)
133
add_executable(link_depends_no_shared_exe link_depends_no_shared_exe.c
134
${CMAKE_CURRENT_BINARY_DIR}/link_depends_no_shared_exe.h)
135
target_link_libraries(link_depends_no_shared_exe link_depends_no_shared_lib)
136
set_property(TARGET link_depends_no_shared_exe PROPERTY LINK_DEPENDS_NO_SHARED 1)
137
add_custom_target(link_depends_no_shared_check ALL
138
COMMAND ${CMAKE_COMMAND}
139
-Dlib=$<TARGET_FILE:link_depends_no_shared_lib>
140
-Dexe=$<TARGET_FILE:link_depends_no_shared_exe>
141
-Dout=${CMAKE_CURRENT_BINARY_DIR}/link_depends_no_shared_check.txt
142
-P ${CMAKE_CURRENT_SOURCE_DIR}/link_depends_no_shared_check.cmake
143
)
144
add_dependencies(link_depends_no_shared_check link_depends_no_shared_exe)
145
146
add_custom_command(
147
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dir/header.h
148
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/dir/header.txt
149
COMMAND ${CMAKE_COMMAND} -E copy_if_different
150
${CMAKE_CURRENT_BINARY_DIR}/dir/header.txt
151
${CMAKE_CURRENT_BINARY_DIR}/dir/header.h
152
)
153
154
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/dir/header.h
155
PROPERTIES GENERATED 1)
156
157
add_custom_target(header_tgt DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/dir/header.h)
158
include_directories(${CMAKE_CURRENT_BINARY_DIR})
159
add_executable(ninjadep ninjadep.cpp)
160
add_dependencies(ninjadep header_tgt)
161
162
include(ExternalProject)
163
ExternalProject_Add(ExternalBuild
164
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/External
165
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/External
166
STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/External/Stamp
167
BUILD_ALWAYS 1
168
CMAKE_ARGS
169
-Dexternal_in=${CMAKE_CURRENT_BINARY_DIR}/external.in
170
-Dexternal_out=${CMAKE_CURRENT_BINARY_DIR}/external.out
171
INSTALL_COMMAND ""
172
)
173
174
add_custom_command(
175
OUTPUT multi1-out1.txt multi1-out2.txt
176
COMMAND ${CMAKE_COMMAND} -E copy multi1-in.txt multi1-out1.txt
177
COMMAND ${CMAKE_COMMAND} -E copy multi1-in.txt multi1-out2.txt
178
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/multi1-in.txt
179
)
180
add_custom_command(
181
OUTPUT multi1-out2-copy.txt
182
COMMAND ${CMAKE_COMMAND} -E copy multi1-out2.txt multi1-out2-copy.txt
183
DEPENDS multi1-out2.txt
184
)
185
add_custom_target(multi1 ALL DEPENDS multi1-out2-copy.txt)
186
187
# Test having the first output never created.
188
add_custom_command(
189
OUTPUT multi2-dummy.txt multi2-real.txt
190
COMMAND ${CMAKE_COMMAND} -E touch multi2-real.txt
191
)
192
set_property(SOURCE multi2-real.txt multi2-dummy.txt PROPERTY SYMBOLIC 1)
193
add_custom_target(multi2 ALL DEPENDS multi2-real.txt)
194
195
if(TEST_MULTI3)
196
# Test having the second output never created. Does not work with msbuild.
197
add_custom_command(
198
OUTPUT multi3-real.txt multi3-dummy.txt
199
COMMAND ${CMAKE_COMMAND} -E touch multi3-real.txt
200
)
201
set_property(SOURCE multi3-real.txt multi3-dummy.txt PROPERTY SYMBOLIC 1)
202
add_custom_target(multi3 ALL DEPENDS multi3-real.txt)
203
endif()
204
205
add_executable(object_depends object_depends.cxx)
206
set_property(SOURCE object_depends.cxx PROPERTY OBJECT_DEPENDS
207
${CMAKE_CURRENT_BINARY_DIR}/object_depends.txt)
208
add_custom_target(object_depends_check ALL
209
COMMAND ${CMAKE_COMMAND}
210
-Dexe=$<TARGET_FILE:object_depends>
211
-Dout=${CMAKE_CURRENT_BINARY_DIR}/object_depends_check.txt
212
-Dtxt=${CMAKE_CURRENT_BINARY_DIR}/object_depends.txt
213
-P ${CMAKE_CURRENT_SOURCE_DIR}/object_depends_check.cmake
214
)
215
add_dependencies(object_depends_check object_depends)
216
217