summaryrefslogtreecommitdiff
path: root/Tests/QtAutogen/CMakeLists.txt
blob: dff9d0c664693c646a3956c33e3dda8d4fea254c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
cmake_minimum_required(VERSION 3.9)
cmake_policy(SET CMP0071 NEW)
project(QtAutogen)

if (QT_TEST_VERSION STREQUAL 4)
  find_package(Qt4 REQUIRED)

  # Include this directory before using the UseQt4 file.
  add_subdirectory(defines_test)

  include(UseQt4)

  set(QT_QTCORE_TARGET Qt4::QtCore)

  macro(qtx_wrap_cpp)
    qt4_wrap_cpp(${ARGN})
  endmacro()
  macro(qtx_generate_moc)
    qt4_generate_moc(${ARGN})
  endmacro()

else()
  if (NOT QT_TEST_VERSION STREQUAL 5)
    message(SEND_ERROR "Invalid Qt version specified.")
  endif()
  find_package(Qt5Widgets REQUIRED)

  set(QT_QTCORE_TARGET Qt5::Core)

  include_directories(${Qt5Widgets_INCLUDE_DIRS})
  set(QT_LIBRARIES Qt5::Widgets)

  if(Qt5_POSITION_INDEPENDENT_CODE AND CMAKE_CXX_COMPILE_OPTIONS_PIC)
    add_definitions(${CMAKE_CXX_COMPILE_OPTIONS_PIC})
  endif()

  macro(qtx_wrap_cpp)
    qt5_wrap_cpp(${ARGN})
  endmacro()
  macro(qtx_generate_moc)
    qt5_generate_moc(${ARGN})
  endmacro()

endif()

get_property(QT_COMPILE_FEATURES TARGET ${QT_QTCORE_TARGET} PROPERTY INTERFACE_COMPILE_FEATURES)

# Qt4 moc does not support utf8 paths in _parameter files generated by
# qtx_wrap_cpp
# https://bugreports.qt.io/browse/QTBUG-35480
# Do a simple check if there is are non ASCII character in the build path
string(REGEX MATCH "[^ -~]+" NON_ASCII_BDIR ${CMAKE_CURRENT_BINARY_DIR})
if((NOT NON_ASCII_BDIR) OR (NOT QT_TEST_VERSION STREQUAL 4))
  set(ALLOW_WRAP_CPP TRUE)
endif()
# On windows qtx_wrap_cpp also fails in Qt5 when used on a path that
# contains non ASCII characters
if(NON_ASCII_BDIR AND WIN32)
  set(ALLOW_WRAP_CPP FALSE)
endif()

# -- Test
# MOC only
add_executable(mocOnly mocOnlySource/main.cpp mocOnlySource/StyleA.cpp mocOnlySource/StyleB.cpp)
set_property(TARGET mocOnly PROPERTY AUTOMOC ON)
target_link_libraries(mocOnly ${QT_LIBRARIES})

add_executable(mocOnlyOpts mocOnlySource/main.cpp mocOnlySource/StyleA.cpp mocOnlySource/StyleB.cpp)
set_property(TARGET mocOnlyOpts PROPERTY AUTOMOC ON)
set_property(TARGET mocOnlyOpts PROPERTY AUTOMOC_MOC_OPTIONS "-nw")
target_link_libraries(mocOnlyOpts ${QT_LIBRARIES})

# -- Test
# UIC only
if(ALLOW_WRAP_CPP)
  qtx_wrap_cpp(uicOnlyMoc uicOnlySource/uiconly.h)
  add_executable(uicOnly uicOnlySource/uiconly.cpp ${uicOnlyMoc})
  set_property(TARGET uicOnly PROPERTY AUTOUIC ON)
  target_link_libraries(uicOnly ${QT_LIBRARIES})
endif()

# -- Test
# RCC only
add_executable(rccOnly rccOnly.cpp rccOnlyRes.qrc)
set_property(TARGET rccOnly PROPERTY AUTORCC ON)
target_link_libraries(rccOnly ${QT_QTCORE_TARGET})

# -- Test
# RCC empty
add_executable(rccEmpty rccEmpty.cpp rccEmptyRes.qrc)
set_property(TARGET rccEmpty PROPERTY AUTORCC ON)
target_link_libraries(rccEmpty ${QT_QTCORE_TARGET})

# -- Test
# Add not_generated_file.qrc to the source list to get the file-level
# dependency, but don't generate a c++ file from it.  Disable the AUTORCC
# feature for this target.  This tests that qrc files in the sources don't
# have an effect on generation if AUTORCC is off.
add_library(empty STATIC empty.cpp not_generated_file.qrc)
set_target_properties(empty PROPERTIES AUTORCC OFF)
set_target_properties(empty PROPERTIES AUTOMOC TRUE)
target_link_libraries(empty no_link_language)
add_library(no_link_language STATIC empty.h)
set_target_properties(no_link_language PROPERTIES AUTOMOC TRUE)
# Pass Qt compiler features to targets that don't link against Qt
target_compile_features(no_link_language PRIVATE ${QT_COMPILE_FEATURES})
target_compile_features(empty PRIVATE ${QT_COMPILE_FEATURES})


# -- Test
# Test for SKIP_AUTOMOC and SKIP_AUTOGEN on an AUTOMOC enabled target
if(ALLOW_WRAP_CPP)
  # Generate header mocs manually
  qtx_wrap_cpp(skipMocWrapMoc
    skipSource/qItemA.hpp
    skipSource/qItemB.hpp
    skipSource/qItemC.hpp
    skipSource/qItemD.hpp
    )
  set(skipMocSources
    skipMoc.cpp
    skipSource/qItemA.cpp
    skipSource/qItemB.cpp
    skipSource/qItemC.cpp
    skipSource/qItemD.cpp
    )
  # When cpp files are skipped, the hpp won't be processed either,
  # unless they are mentioned in the sources - which they aren't.
  set_property(SOURCE skipSource/qItemA.cpp PROPERTY SKIP_AUTOMOC ON)
  set_property(SOURCE skipSource/qItemB.cpp PROPERTY SKIP_AUTOGEN ON)
  # When hpp files are skipped, the cpp still get processed.
  set_property(SOURCE skipSource/qItemC.hpp PROPERTY SKIP_AUTOMOC ON)
  set_property(SOURCE skipSource/qItemD.hpp PROPERTY SKIP_AUTOGEN ON)
  # AUTOMOC enabled only
  add_executable(skipMocA ${skipMocSources} ${skipMocWrapMoc})
  set_property(TARGET skipMocA PROPERTY AUTOMOC ON)
  target_link_libraries(skipMocA ${QT_LIBRARIES})
  # AUTOMOC and AUTOUIC enabled
  add_executable(skipMocB ${skipMocSources} ${skipMocWrapMoc})
  set_property(TARGET skipMocB PROPERTY AUTOMOC ON)
  set_property(TARGET skipMocB PROPERTY AUTOUIC ON)
  target_link_libraries(skipMocB ${QT_LIBRARIES})
endif()

# -- Test
# Test for SKIP_AUTOUIC and SKIP_AUTOGEN on an AUTOUIC enabled target
set(skipUicSources
  skipUic.cpp
  skipSource/skipUicGen.cpp
  skipSource/skipUicNoGen1.cpp
  skipSource/skipUicNoGen2.cpp
)
set_property(SOURCE skipSource/skipUicNoGen1.cpp PROPERTY SKIP_AUTOUIC ON)
set_property(SOURCE skipSource/skipUicNoGen2.cpp PROPERTY SKIP_AUTOGEN ON)
# AUTOUIC enabled
add_executable(skipUicA ${skipUicSources})
set_property(TARGET skipUicA PROPERTY AUTOUIC ON)
target_link_libraries(skipUicA ${QT_LIBRARIES})
# AUTOUIC and AUTOMOC enabled
add_executable(skipUicB ${skipUicSources})
set_property(TARGET skipUicB PROPERTY AUTOUIC ON)
set_property(TARGET skipUicB PROPERTY AUTOMOC ON)
target_link_libraries(skipUicB ${QT_LIBRARIES})

# -- Test
# Test for SKIP_AUTORCC and SKIP_AUTOGEN on an AUTORCC enabled target
set(skipRccSources
  skipRcc.cpp
  skipSource/skipRccBad1.qrc
  skipSource/skipRccBad2.qrc
  skipSource/skipRccGood.qrc
)
set_property(SOURCE skipSource/skipRccBad1.qrc PROPERTY SKIP_AUTORCC ON)
set_property(SOURCE skipSource/skipRccBad2.qrc PROPERTY SKIP_AUTOGEN ON)
# AUTORCC enabled
add_executable(skipRccA ${skipRccSources})
set_property(TARGET skipRccA PROPERTY AUTORCC ON)
target_link_libraries(skipRccA ${QT_LIBRARIES})
# AUTORCC, AUTOUIC and AUTOMOC enabled
add_executable(skipRccB ${skipRccSources})
set_property(TARGET skipRccB PROPERTY AUTORCC ON)
set_property(TARGET skipRccB PROPERTY AUTOUIC ON)
set_property(TARGET skipRccB PROPERTY AUTOMOC ON)
target_link_libraries(skipRccB ${QT_LIBRARIES})

# -- Test
# MOC AUTOMOC_MACRO_NAMES
if (NOT QT_TEST_VERSION STREQUAL 4)
  add_subdirectory(mocMacroName)
endif()

# -- Test
# Tests AUTOMOC with generated sources
add_subdirectory(mocDepends)

# -- Test
# Tests various include moc patterns
if(ALLOW_WRAP_CPP)
  add_subdirectory(mocIncludeStrict)
  add_subdirectory(mocIncludeRelaxed)
endif()

# -- Test
# Tests policy 0071
if(ALLOW_WRAP_CPP)
  add_subdirectory(mocCMP0071)
endif()

# -- Test
# Tests various .ui include directories
add_subdirectory(uicInclude)

# -- Test
# OBJECT libraries
add_subdirectory(objectLibrary)

# -- Test
# MacOS Framework
if(APPLE AND (NOT QT_TEST_VERSION STREQUAL 4))
  add_subdirectory(macosFW)
endif()

# -- Test
# Source files with the same basename in different subdirectories
add_subdirectory(sameName)

# -- Test
# Tests static library cycles
add_subdirectory(staticLibraryCycle)

# -- Test
# Complex test case
add_subdirectory(complex)