[Qt] Compile WTF tests of TestWebKitAPI
[WebKit-https.git] / Tools / qmake / mkspecs / features / default_post.prf
1 # -------------------------------------------------------------------
2 # QtWebKit defaults for qmake. These rules are parsed after the
3 # actual project file.
4 #
5 # See 'Tools/qmake/README' for an overview of the build system
6 # -------------------------------------------------------------------
7
8 # Flag that we're now done processing the project file. This allows
9 # a feature to distinguish between being processed due to a load()
10 # or include() and a CONFIG += feature.
11 CONFIG += config_step
12
13 # Enable dynamic instead of static libraries for development
14 # Avoid it with debug_and_release, it can cause the application to load both the debug and release
15 # dependent libraries when using frameworks on Mac.
16 !production_build:!debug_and_release:!buildbot:!win*:!build?(webkit2): CONFIG += force_static_libs_as_shared
17
18 # Don't create .prl files for intermediate libraries because their contents get used when linking against
19 # them, breaking "-Wl,-whole-archive -lMyIntermediateLib --Wl,-no-whole-archive"
20 staticlib: CONFIG -= create_prl
21
22 root_project_file: finalizeConfigure()
23
24 # Sanitize build config for single-configuration builds
25 !debug|!release {
26     # Removing debug_and_release causes issues with lib suffixes when building debug on Windows.
27     # Work around it by only removing build_all, and still create the Makefiles for both configurations.
28     win32*: CONFIG -= build_all
29     else: CONFIG -= debug_and_release
30 } else:debug_and_release {
31     # Only build a single instance of each application
32     contains(TEMPLATE, app):!force_build_all {
33         CONFIG -= build_all
34     }
35 }
36
37 # General default build tweaks
38 DEFINES += \
39     BUILDING_QT__=1
40
41 CONFIG(release, debug|release): DEFINES *= NDEBUG
42
43 DEFINES += $$configDefines()
44
45 DEPENDPATH += $$OUT_PWD
46
47 INCLUDEPATH += \
48     $${ROOT_WEBKIT_DIR}/Source \
49     $${ROOT_BUILD_DIR}/Source/include \
50     $${QT.script.includes}
51
52 CONFIG -= warn_on
53
54 !compiling_thirdparty_code:*-g++*: QMAKE_CXXFLAGS = \
55     -Wall \
56     -Wextra \
57     -Wreturn-type \
58     -fno-strict-aliasing \
59     -Wchar-subscripts \
60     -Wformat-security \
61     -Wreturn-type \
62     -Wno-unused-parameter \
63     -Wno-sign-compare \
64     -Wno-switch \
65     -Wno-switch-enum \
66     -Wundef \
67     -Wmissing-noreturn \
68     -Winit-self \
69     $$QMAKE_CXXFLAGS
70
71 # Template configurations
72 contains(TEMPLATE, derived) {
73     # A (mostly) no-op template
74     TEMPLATE = aux
75
76     # Trick qmake into not generating a default $(DEL_FILE) rule
77     CONFIG += compile_libtool
78
79     CONFIG -= debug_and_release
80
81     fake_debug.target = debug
82     fake_debug.depends = first
83     QMAKE_EXTRA_TARGETS += fake_debug
84     fake_release.target = release
85     fake_release.depends = first
86     QMAKE_EXTRA_TARGETS += fake_release
87
88     # A lot of our code generators require GNU tools, readily available
89     # on Linux and Mac OS X. On Windows we do have a convenience copy in
90     # Qt5's top-level repository, so let's add that to the PATH if we can
91     # find it.
92     win32 {
93         GNUTOOLS_DIR=$$[QT_HOST_DATA]/../gnuwin32/bin
94         exists($$GNUTOOLS_DIR/gperf.exe) {
95             GNUTOOLS = "(set $$escape_expand(\\\")PATH=$$toSystemPath($$GNUTOOLS_DIR);%PATH%$$escape_expand(\\\"))"
96         }
97     }
98
99     for(generator, GENERATORS) {
100         eval($${generator}.CONFIG = target_predeps no_link)
101         eval($${generator}.dependency_type = TYPE_C)
102
103         isEmpty($${generator}.output_function) {
104             prependEach($${generator}.output, $${GENERATED_SOURCES_DESTDIR}/)
105         }
106
107         script = $$eval($${generator}.script)
108         eval($${generator}.depends += $$script)
109
110         commands = $$eval($${generator}.commands)
111         !isEmpty(commands):!isEmpty(GNUTOOLS) {
112             eval($${generator}.commands = $${GNUTOOLS} && $$val_escape($${generator}.commands))
113         }
114
115         !isEmpty($${generator}.input) {
116             # Compiler-style generator
117             QMAKE_EXTRA_COMPILERS += $$generator
118             DEFAULT_TARGETS += compiler_$${generator}_make_all
119         } else {
120             # Regular target generator
121             QMAKE_EXTRA_TARGETS += $$generator
122             DEFAULT_TARGETS += $$generator
123         }
124     }
125 } else {
126     # Make sure the generated sources are compiled as well
127     for(generator, GENERATORS) {
128         prependEach($${generator}.extra_sources, $${GENERATED_SOURCES_DESTDIR}/)
129         SOURCES += $$eval($${generator}.extra_sources)
130
131         isEqual($${generator}.add_output_to_sources, false): next()
132
133         output = $$eval($${generator}.output)
134         input = $$eval($${generator}.input)
135         input_files = $$eval($$input)
136         output_variable = $$eval($${generator}.variable_out)
137         isEmpty(output_variable): output_variable = SOURCES
138
139         isEmpty($${generator}.output_function) {
140             prependEach(output, $${GENERATED_SOURCES_DESTDIR}/)
141
142             for(input_file, input_files) {
143                 base = $$basename(input_file)
144                 base ~= s/\\..+//
145                 output_file = $$replace(output,\\$\\{QMAKE_FILE_BASE\\}, $$base)
146
147                 eval($$output_variable += $$output_file)
148             }
149         } else {
150             function = $$eval($${generator}.output_function)
151             for(input_file, input_files) {
152                 eval(output_file = \$\$$$function\($$input_file\))
153                 eval($$output_variable += $$output_file)
154             }
155         }
156     }
157 }
158
159 contains(QT, webkit)|contains(QT, webkitwidgets) {
160     # In addition to the main shared QtWebKit library we also
161     # need to link to any intermediate shared libraries.
162     force_static_libs_as_shared {
163         WEBKIT += wtf javascriptcore webcore
164         build?(webkit1): WEBKIT += webkit1
165         build?(webkit2): WEBKIT += webkit2
166     }
167
168     # FIXME: Replace this with putting the intermediate libraries in the prl file
169 }
170
171 defineTest(needToLink) {
172     # The main dynamic library always needs to link in the intermediate libraries
173     creating_module: return(true)
174
175     force_static_libs_as_shared {
176         # So do the individual libraries if they are dynamic
177         contains(libraries, $$TARGET): return(true)
178
179         # Or anything that uses QtWebKit in this special config
180         contains(QT, webkit): return(true)
181     }
182
183     # Lastly, we allow apps (jsc) to link directly to the intermediate
184     # libraries intead of using the exported symbols from QtWebKit.
185     contains(TEMPLATE, app):!contains(QT, webkit):!contains(QT, webkitwidgets): return(true)
186
187     # Anything else should just get include paths, etc, not link
188     return(false)
189 }
190
191 # Make sure we have loaded the relevant modules, so the include paths,
192 # etc, are correct, and we can use WEBKIT.foo.dependent_libs below.
193 load(webkit_modules)
194
195 # We might need to link against the WebKit intermediate libraries
196 needToLink() {
197     for(library, WEBKIT) {
198         library_identifier = $$lower($$library)
199         linkAgainstLibrary($$library, $$eval(WEBKIT.$${library_identifier}.root_source_dir))
200         LIBS += $$eval(WEBKIT.$${library_identifier}.dependent_libs)
201     }
202 }
203
204 creating_module {
205     # Sanitize LIBS, as we don't want any of these libraries
206     # to end up in as public API dependenices in the QtWebKit prl file.
207     LIBS_PRIVATE += $$LIBS
208     unset(LIBS)
209     # Copy Qt module dependencies from QT to QT_PRIVATE to ensure the
210     # Qt libraries are linked after the private static libraries that
211     # depend on them
212     QT_PRIVATE += $$QT
213 }
214
215 equals(_PRO_FILE_, $${ROOT_WEBKIT_DIR}/WebKit.pro):!isEmpty(OVERRIDE_SUBDIRS) {
216     # The root WebKit project file is the only one that allows
217     # you to pass a set of subtargets on the comand line.
218     SUBDIRS = $$OVERRIDE_SUBDIRS
219 }
220
221 # Remove subdirs that do not exist
222 for(subdir, SUBDIRS) {
223     path = $$eval($${subdir}.file)
224     isEmpty(path): path = $$eval($${subdir}.subdir)
225     isEmpty(path): path = $${subdir}
226     !exists($${_PRO_FILE_PWD_}$${QMAKE_DIR_SEP}$${path}) {
227         #message(Removing invalid subtarget $${subdir} $${path})
228         #SUBDIRS -= $${subdir}
229     }
230 }
231
232 root_project_file {
233     # Tweak documentation rules so that we only get documentation
234     # for the QtWebKit subdir, which means we don't have to run
235     # qmake_all and generate all the derived sources, just to
236     # build documentation.
237     previous_subdir =
238     doc_targets = docs install_docs uninstall_docs prepare_docs generate_docs
239     for(subdir, SUBDIRS) {
240         equals(subdir, QtWebKit) {
241             for(doc_target, doc_targets) {
242                 # Since we use CONFIG += ordered, we need to provide a fake dummy
243                 # doc-target for the immediate dependency of the QtWebKit target.
244                 dummy_target = sub-$$replace($${previous_subdir}.file, [^a-zA-Z0-9_], -)-$${doc_target}_ordered
245                 $${dummy_target}.target = $${dummy_target}
246                 QMAKE_EXTRA_TARGETS += $${dummy_target}
247             }
248         } else {
249             previous_subdir = $$subdir # Save for later
250
251             # For all the other subdirs, we disable docs the regular way
252             for(doc_target, doc_targets): $${subdir}.CONFIG += no_$${doc_target}_target
253         }
254     }
255 }
256
257 incremental.target = incremental
258 incremental.commands = $(MAKE) -f $(MAKEFILE) qmake_all && $(MAKE) -f $(MAKEFILE)
259 QMAKE_EXTRA_TARGETS += incremental
260
261 contains(TEMPLATE, lib) {
262     # Triggers the right export macros for WebKit internals
263     DEFINES += BUILDING_$${TARGET}
264
265     # Triggers the right export macro for the QtWebKit API (see qwebkitglobal.h)
266     !contains(QT, webkit)|equals(MODULE, webkitwidgets): DEFINES += BUILDING_WEBKIT
267
268     # Prevent name clashes when building both debug and release. Qt5's module
269     # system already takes care of this for the top level QtWebKit library.
270     !qt_install_module:debug_and_release: TARGET = $$qtLibraryTarget($$TARGET)
271
272     isEmpty(DESTDIR): DESTDIR = $$activeBuildConfig()
273
274     DEFINES += QT_ASCII_CAST_WARNINGS
275
276     !plugin {
277         contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols
278         unix:contains(QT_CONFIG, reduce_relocations):CONFIG += bsymbolic_functions
279     }
280 }
281
282 # Remove duplicated sources
283 SOURCES = $$unique(SOURCES)
284 OBJECTIVE_SOURCES = $$unique(OBJECTIVE_SOURCES)
285
286 # Someone might remove a header from the tree without touching
287 # the corresponding project file, for example if the project
288 # file never had the header in HEADERS. In that case we don't
289 # want warnings from make about "No rule to make target".
290 ignore_missing_headers.target = %.h
291 ignore_missing_headers.commands = $${MAKEFILE_NOOP_COMMAND}
292 QMAKE_EXTRA_TARGETS += ignore_missing_headers
293
294 # Override default target
295 build_pass:build_all:default_target.target = all
296 else: default_target.target = first
297 for(target, $$list($$unique(DEFAULT_TARGETS))) {
298     default_target.depends += $$target
299 }
300 !isEmpty(default_target.depends): QMAKE_EXTRA_TARGETS += default_target
301
302 # Qt's debug_and_release config will replace every occurance of
303 # Release or Debug in the destination dir. This fails when the
304 # desination dir is absolute and contains a static path component
305 # that also contains either of those two words, so we make DESTDIR
306 # relative.
307 DESTDIR = $$replace(DESTDIR, ^$$re_escape($${ROOT_BUILD_DIR}), $${BUILD_ROOT_RELATIVE_TO_OUT_PWD})
308
309 load(default_post) # Load Qt's defaults