Mxx_ru 1.4.6 → 1.4.7
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/mxx_ru/cpp/qt4.rb +31 -0
- data/lib/mxx_ru/cpp/qt4details.rb +571 -0
- data/lib/mxx_ru/cpp/rucodegen.rb +1 -1
- data/lib/mxx_ru/cpp/target.rb +43 -53
- data/lib/mxx_ru/cpp/toolset.rb +24 -0
- data/lib/mxx_ru/cpp/toolsets/vc8_family.rb +2 -6
- data/lib/mxx_ru/version.rb +1 -1
- metadata +4 -22
- data/tests/c/pcre/chartables.c +0 -183
- data/tests/c/pcre/config.h +0 -99
- data/tests/c/pcre/dftables.c +0 -167
- data/tests/c/pcre/get.c +0 -349
- data/tests/c/pcre/internal.h +0 -677
- data/tests/c/pcre/maketables.c +0 -140
- data/tests/c/pcre/pcre.c +0 -8304
- data/tests/c/pcre/pcre.h +0 -193
- data/tests/c/pcre/pcre.rb +0 -14
- data/tests/c/pcre/pcredemo.c +0 -316
- data/tests/c/pcre/pcregrep.c +0 -642
- data/tests/c/pcre/pcreposix.c +0 -305
- data/tests/c/pcre/pcreposix.h +0 -88
- data/tests/c/pcre/pcretest.c +0 -1483
- data/tests/c/pcre/perltest +0 -211
- data/tests/c/pcre/printint.c +0 -360
- data/tests/c/pcre/study.c +0 -472
@@ -0,0 +1,31 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 1996-2004, Yauheni Akhotnikau
|
3
|
+
# Copyright (c) 2004-2006, JSC Intervale
|
4
|
+
# Copyright (c) 2006-2008, The Mxx_ru Project
|
5
|
+
# All rights reserved.
|
6
|
+
#
|
7
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
8
|
+
# are permitted provided that the following conditions are met:
|
9
|
+
#
|
10
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
11
|
+
# this list of conditions and the following disclaimer.
|
12
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
14
|
+
# and/or other materials provided with the distribution.
|
15
|
+
# 3. The name of the author may not be used to endorse or promote products derived
|
16
|
+
# from this software without specific prior written permission.
|
17
|
+
#
|
18
|
+
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
19
|
+
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
20
|
+
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
|
21
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
22
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
23
|
+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
24
|
+
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
25
|
+
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
26
|
+
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
27
|
+
#++
|
28
|
+
|
29
|
+
require 'mxx_ru/cpp/qt4details'
|
30
|
+
include MxxRu::Cpp::Qt4Modules
|
31
|
+
|
@@ -0,0 +1,571 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 1996-2004, Yauheni Akhotnikau
|
3
|
+
# Copyright (c) 2004-2006, JSC Intervale
|
4
|
+
# Copyright (c) 2006-2008, The Mxx_ru Project
|
5
|
+
# All rights reserved.
|
6
|
+
#
|
7
|
+
# Redistribution and use in source and binary forms, with or without modification,
|
8
|
+
# are permitted provided that the following conditions are met:
|
9
|
+
#
|
10
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
11
|
+
# this list of conditions and the following disclaimer.
|
12
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
14
|
+
# and/or other materials provided with the distribution.
|
15
|
+
# 3. The name of the author may not be used to endorse or promote products derived
|
16
|
+
# from this software without specific prior written permission.
|
17
|
+
#
|
18
|
+
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
19
|
+
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
20
|
+
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
|
21
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
22
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
23
|
+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
24
|
+
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
25
|
+
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
26
|
+
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
27
|
+
#++
|
28
|
+
|
29
|
+
require 'pathname'
|
30
|
+
require 'rexml/document'
|
31
|
+
require 'set'
|
32
|
+
|
33
|
+
require 'mxx_ru/cpp'
|
34
|
+
|
35
|
+
module MxxRu
|
36
|
+
module Cpp
|
37
|
+
|
38
|
+
# Auxilary module with classes and constants for Qt4 modules support
|
39
|
+
#
|
40
|
+
module Qt4Modules
|
41
|
+
# Class for objects whose purpose is setting up an appropriate
|
42
|
+
# define and a library for target.
|
43
|
+
#
|
44
|
+
# Usage:
|
45
|
+
# QT_GUI = ModuleBinder.new( 'QT_GUI_LIB', 'QtGui4' )
|
46
|
+
# ...
|
47
|
+
# QT_GUI.setup( target )
|
48
|
+
#
|
49
|
+
class ModuleBinder
|
50
|
+
def initialize( a_define, a_library )
|
51
|
+
@define = a_define
|
52
|
+
@library = a_library
|
53
|
+
end
|
54
|
+
|
55
|
+
def setup( a_target )
|
56
|
+
a_target.define @define
|
57
|
+
a_target.lib @library
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Qt3Support component.
|
62
|
+
QT_QT3SUPPORT = ModuleBinder.new( 'QT_QT3SUPPORT_LIB', 'Qt3Support4' )
|
63
|
+
# QtCore component.
|
64
|
+
QT_CORE = ModuleBinder.new( 'QT_CORE_LIB', 'QtCore4' )
|
65
|
+
# QtDesigner component.
|
66
|
+
QT_DESIGNER = ModuleBinder.new( 'QT_DESIGNER_LIB', 'QtDesigner4' )
|
67
|
+
# QtDesignerComponents component.
|
68
|
+
QT_DESIGNER_COMPONENTS = ModuleBinder.new(
|
69
|
+
'QT_DESIGNERCOMPONENTS_LIB', 'QtDesignerComponents4' )
|
70
|
+
# QtGui component.
|
71
|
+
QT_GUI = ModuleBinder.new( 'QT_GUI_LIB', 'QtGui4' )
|
72
|
+
# QtHelp component.
|
73
|
+
QT_HELP = ModuleBinder.new( 'QT_HELP_LIB', 'QtHelp4' )
|
74
|
+
# Network component.
|
75
|
+
QT_NETWORK = ModuleBinder.new( 'QT_NETWORK_LIB', 'QtNetwork4' )
|
76
|
+
# QtOpenGL component.
|
77
|
+
QT_OPENGL = ModuleBinder.new( 'QT_OPENGL_LIB', 'QtOpenGL4' )
|
78
|
+
# QtScript component.
|
79
|
+
QT_SCRIPT = ModuleBinder.new( 'QT_SCRIPT_LIB', 'QtScript4' )
|
80
|
+
# QtSql component.
|
81
|
+
QT_SQL = ModuleBinder.new( 'QT_SQL_LIB', 'QtSql4' )
|
82
|
+
# QtSvg component.
|
83
|
+
QT_SVG = ModuleBinder.new( 'QT_SVG_LIB', 'QtSvg4' )
|
84
|
+
# QtTest component.
|
85
|
+
QT_TEST = ModuleBinder.new( 'QT_TEST_LIB', 'QtTest4' )
|
86
|
+
# QtXml component.
|
87
|
+
QT_XML = ModuleBinder.new( 'QT_XML_LIB', 'QtXml4' )
|
88
|
+
# QtXmlPatterns component.
|
89
|
+
QT_XML_PATTERNS = ModuleBinder.new(
|
90
|
+
'QT_XMLPATTERNS_LIB',
|
91
|
+
'QtXmlPatterns4' )
|
92
|
+
# QtWebKit component.
|
93
|
+
QT_WEB_KIT = ModuleBinder.new(
|
94
|
+
'QT_WEBKIT_LIB',
|
95
|
+
'QtWebKit4' )
|
96
|
+
# Phonon component.
|
97
|
+
QT_PHONON = ModuleBinder.new(
|
98
|
+
'QT_PHONON_LIB',
|
99
|
+
'phonon4' )
|
100
|
+
end
|
101
|
+
|
102
|
+
# Files generator for Qt4 class.
|
103
|
+
#
|
104
|
+
# Main features:
|
105
|
+
#
|
106
|
+
# - building of moc-files using moc tool.
|
107
|
+
# Generation from source and header files is supported.
|
108
|
+
# - building header files from ui-files using uic-compiler.
|
109
|
+
#
|
110
|
+
# Generated source files automatically added into
|
111
|
+
# cpp_source list of target.
|
112
|
+
#
|
113
|
+
# Local list defines is supported.
|
114
|
+
#
|
115
|
+
# If only pointer to the target passed into contructor,
|
116
|
+
# default list of defines is used. If it's required to change
|
117
|
+
# default list, new list should be passed through a second argument:
|
118
|
+
#
|
119
|
+
# generator( MxxRu::Cpp::Qt4.new( self, [ "QT_DEPRECATED_WARNINGS" ] ) )
|
120
|
+
#
|
121
|
+
class Qt4 < MxxRu::AbstractGenerator
|
122
|
+
# Default list of defines.
|
123
|
+
# QT_DLL
|
124
|
+
DEFAULT_DEFINES = [ 'QT_DLL', 'QT_THREAD_SUPPORT' ]
|
125
|
+
|
126
|
+
# moc tool executable
|
127
|
+
# Default: moc
|
128
|
+
attr_accessor :moc_name
|
129
|
+
|
130
|
+
# uic tool executable
|
131
|
+
# Default: uic.
|
132
|
+
attr_accessor :uic_name
|
133
|
+
|
134
|
+
# rcc tool executable
|
135
|
+
# Default: rcc.
|
136
|
+
attr_accessor :rcc_name
|
137
|
+
|
138
|
+
# File extension for source files generated.
|
139
|
+
# Used in both moc and uic tools.
|
140
|
+
# Default: .cpp
|
141
|
+
attr_accessor :cpp_ext
|
142
|
+
|
143
|
+
# File extension for header files generated.
|
144
|
+
# Used in uic tool.
|
145
|
+
# Default: .h
|
146
|
+
attr_accessor :hpp_ext
|
147
|
+
|
148
|
+
# File extension for moc files generated.
|
149
|
+
# Used in moc tool.
|
150
|
+
# Default: .moc
|
151
|
+
attr_accessor :moc_ext
|
152
|
+
|
153
|
+
# Subfolder name where moc generated files would be located.
|
154
|
+
# If nil, generated files would be in the same folder
|
155
|
+
# where source files were.
|
156
|
+
# Default: nil
|
157
|
+
attr_accessor :moc_result_subdir
|
158
|
+
|
159
|
+
# Subfolder name where results of uic invokation must be placed.
|
160
|
+
# If nil, generated files would be in the same folder where
|
161
|
+
# source ui files were.
|
162
|
+
attr_accessor :uic_result_subdir
|
163
|
+
|
164
|
+
# Subfolder name where results of rcc invokation must be placed.
|
165
|
+
# If nil, generated files would be in the same folder where
|
166
|
+
# source qrc files were.
|
167
|
+
# Used only for qrc2cpp translation.
|
168
|
+
attr_accessor :qrc_result_subdir
|
169
|
+
|
170
|
+
# Files list for generating moc files from header files.
|
171
|
+
#
|
172
|
+
# More exact: a.hpp -> moc_a.cpp. moc_a.cpp file is added
|
173
|
+
# to cpp_source list of a target.
|
174
|
+
attr_reader :qt_h2moc_files
|
175
|
+
|
176
|
+
# Files list for generating moc files from source files.
|
177
|
+
#
|
178
|
+
# More exact: a.cpp -> a.moc.
|
179
|
+
attr_reader :qt_cpp2moc_files
|
180
|
+
|
181
|
+
# Files list for generating header files from ui files.
|
182
|
+
#
|
183
|
+
# More exact: a.ui -> ui_a.hpp
|
184
|
+
attr_reader :qt_ui_files
|
185
|
+
|
186
|
+
# Files list for generating source files from qrc files.
|
187
|
+
#
|
188
|
+
# More exact: a.qrc -> qrc_a.cpp
|
189
|
+
attr_reader :qt_qrc2cpp_files
|
190
|
+
|
191
|
+
# Files list for generating binary resource files from qrc files.
|
192
|
+
#
|
193
|
+
# More exact: a.qrc -> a.rcc
|
194
|
+
attr_reader :qt_qrc2rcc_files
|
195
|
+
|
196
|
+
# Target, generator is created for.
|
197
|
+
attr :target
|
198
|
+
|
199
|
+
# Constructor.
|
200
|
+
def initialize( a_target, a_defines = DEFAULT_DEFINES )
|
201
|
+
@moc_name = "moc"
|
202
|
+
@uic_name = "uic"
|
203
|
+
@rcc_name = "rcc"
|
204
|
+
@cpp_ext = ".cpp"
|
205
|
+
@hpp_ext = ".h"
|
206
|
+
@moc_ext = ".moc"
|
207
|
+
@moc_result_subdir = nil
|
208
|
+
@uic_result_subdir = nil
|
209
|
+
@qrc_result_subdir = nil
|
210
|
+
|
211
|
+
# If uic_result_subdir not nil than we must add
|
212
|
+
# uic_result_subdir into
|
213
|
+
# target include_path. But must do this only one time.
|
214
|
+
@uic_result_subdir_include_paths = Set.new
|
215
|
+
|
216
|
+
@qt_h2moc_files = []
|
217
|
+
@qt_cpp2moc_files = []
|
218
|
+
@qt_ui_files = []
|
219
|
+
@qt_qrc2cpp_files = []
|
220
|
+
@qt_qrc2rcc_files = []
|
221
|
+
|
222
|
+
defines_to_set = a_defines.flatten
|
223
|
+
defines_to_set.each { |d| a_target.define( d ) }
|
224
|
+
|
225
|
+
@target = a_target
|
226
|
+
|
227
|
+
# QtCore must be used.
|
228
|
+
use_module Qt4Modules::QT_CORE
|
229
|
+
end
|
230
|
+
|
231
|
+
# Add a file for hpp to moc generation.
|
232
|
+
def h2moc( a_file )
|
233
|
+
@qt_h2moc_files << @target.create_full_src_file_name( a_file )
|
234
|
+
end
|
235
|
+
|
236
|
+
# Add a file for cpp to moc generation.
|
237
|
+
def cpp2moc( a_file )
|
238
|
+
@qt_cpp2moc_files << @target.create_full_src_file_name( a_file )
|
239
|
+
end
|
240
|
+
|
241
|
+
# Add a file for ui to hpp generation.
|
242
|
+
def ui( a_file )
|
243
|
+
full_file_name = @target.create_full_src_file_name( a_file )
|
244
|
+
@qt_ui_files << full_file_name
|
245
|
+
if @uic_result_subdir
|
246
|
+
uic_result_path = make_uic_result_path_for( full_file_name )
|
247
|
+
|
248
|
+
if !@uic_result_subdir_include_paths.member?( uic_result_path )
|
249
|
+
@target.include_path( uic_result_path )
|
250
|
+
@uic_result_subdir_include_paths.add( uic_result_path )
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
# Add a file for qrc to cpp generation.
|
256
|
+
def qrc2cpp( a_file )
|
257
|
+
full_file_name = @target.create_full_src_file_name( a_file )
|
258
|
+
@qt_qrc2cpp_files << full_file_name
|
259
|
+
end
|
260
|
+
|
261
|
+
# Add a file for qrc to rcc generation.
|
262
|
+
def qrc2rcc( a_file )
|
263
|
+
full_file_name = @target.create_full_src_file_name( a_file )
|
264
|
+
@qt_qrc2rcc_files << full_file_name
|
265
|
+
end
|
266
|
+
|
267
|
+
# Add a Qt4 module to target.
|
268
|
+
#
|
269
|
+
# a_module -- an instance of Qt4Modules::ModuleBinder.
|
270
|
+
def use_module( a_module )
|
271
|
+
a_module.setup( @target )
|
272
|
+
end
|
273
|
+
|
274
|
+
# Add some Qt4 modules to target.
|
275
|
+
#
|
276
|
+
# a_modules -- an enumeration of Qt4Modules::ModuleBinder instances.
|
277
|
+
#
|
278
|
+
def use_modules( *a_modules )
|
279
|
+
a_modules.each { |m| use_module( m ) }
|
280
|
+
end
|
281
|
+
|
282
|
+
# Perform files generation.
|
283
|
+
def build( a_target )
|
284
|
+
build_from_ui( a_target )
|
285
|
+
build_from_qrc2cpp( a_target )
|
286
|
+
build_from_qrc2rcc( a_target )
|
287
|
+
build_from_h( a_target )
|
288
|
+
build_from_cpp( a_target )
|
289
|
+
end
|
290
|
+
|
291
|
+
# Perform generated files cleanup.
|
292
|
+
def clean( a_target )
|
293
|
+
clean_from_ui( a_target )
|
294
|
+
clean_from_qrc2cpp( a_target )
|
295
|
+
clean_from_qrc2rcc( a_target )
|
296
|
+
clean_from_h( a_target )
|
297
|
+
clean_from_cpp( a_target )
|
298
|
+
end
|
299
|
+
|
300
|
+
# Add qtmain component for target.
|
301
|
+
def lib_qtmain
|
302
|
+
@target.lib 'qtmain'
|
303
|
+
self
|
304
|
+
end
|
305
|
+
|
306
|
+
protected
|
307
|
+
|
308
|
+
# Perform generation from ui-files.
|
309
|
+
def build_from_ui( a_target )
|
310
|
+
@qt_ui_files.each { |ui|
|
311
|
+
ui_header = header_from_ui( ui, a_target )
|
312
|
+
MxxRu::Util::ensure_path_exists( File.dirname( ui_header ) )
|
313
|
+
|
314
|
+
# Checking what files are changed and running generation
|
315
|
+
# from them if necessary.
|
316
|
+
if TargetState::EXISTS != TargetState.detect(
|
317
|
+
ui_header, [ ui ] ).state
|
318
|
+
MxxRu::AbstractTarget::run(
|
319
|
+
[ "#{@uic_name} -o #{ui_header} #{ui}" ],
|
320
|
+
[ ui_header ],
|
321
|
+
"building header file #{ui_header}" )
|
322
|
+
end
|
323
|
+
}
|
324
|
+
end
|
325
|
+
|
326
|
+
# Perform cleanup of files, generated from ui files.
|
327
|
+
def clean_from_ui( a_target )
|
328
|
+
@qt_ui_files.each { |ui|
|
329
|
+
ui_header = header_from_ui( ui, a_target )
|
330
|
+
|
331
|
+
MxxRu::Util::delete_file( ui_header )
|
332
|
+
}
|
333
|
+
end
|
334
|
+
|
335
|
+
# Getting file name, generated by uic tool.
|
336
|
+
#
|
337
|
+
def header_from_ui( a_ui_file, a_target )
|
338
|
+
path, file_name = File.split( a_ui_file )
|
339
|
+
updated_file_name = 'ui_' +
|
340
|
+
MxxRu::Util::remove_file_ext( file_name ) +
|
341
|
+
@hpp_ext
|
342
|
+
|
343
|
+
if @uic_result_subdir then
|
344
|
+
result = File.join( path, @uic_result_subdir, updated_file_name )
|
345
|
+
else
|
346
|
+
result = File.join( path, updated_file_name )
|
347
|
+
end
|
348
|
+
|
349
|
+
result
|
350
|
+
end
|
351
|
+
|
352
|
+
# Perform generation from qrc-files.
|
353
|
+
def build_from_qrc2cpp( a_target )
|
354
|
+
@qt_qrc2cpp_files.each { |qrc_file|
|
355
|
+
name = File.basename( MxxRu::Util::remove_file_ext( qrc_file ) )
|
356
|
+
qrc_cpp = source_from_qrc( qrc_file, a_target )
|
357
|
+
MxxRu::Util::ensure_path_exists( File.dirname( qrc_cpp ) )
|
358
|
+
|
359
|
+
# Checking what files are changed and running generation
|
360
|
+
# from them if necessary.
|
361
|
+
if TargetState::EXISTS != TargetState.detect(
|
362
|
+
qrc_cpp,
|
363
|
+
[ qrc_file ] + Qt4.detect_qrc_file_dependencies( qrc_file ) ).state
|
364
|
+
MxxRu::AbstractTarget::run(
|
365
|
+
[ "#{@rcc_name} -name #{name} -o #{qrc_cpp} #{qrc_file}" ],
|
366
|
+
[ qrc_cpp ],
|
367
|
+
"building source file #{qrc_cpp}" )
|
368
|
+
end
|
369
|
+
|
370
|
+
add_cpp_source( a_target, qrc_cpp )
|
371
|
+
}
|
372
|
+
end
|
373
|
+
|
374
|
+
# Perform cleanup of files, generated from qrc files.
|
375
|
+
#
|
376
|
+
def clean_from_qrc2cpp( a_target )
|
377
|
+
@qt_qrc2cpp_files.each { |qrc_file|
|
378
|
+
qrc_cpp = source_from_qrc( qrc_file, a_target )
|
379
|
+
|
380
|
+
# It is necessary to delete obj-file.
|
381
|
+
add_cpp_source( a_target, qrc_cpp )
|
382
|
+
|
383
|
+
MxxRu::Util::delete_file( qrc_cpp )
|
384
|
+
}
|
385
|
+
end
|
386
|
+
|
387
|
+
# Getting file name, generated by rcc tool.
|
388
|
+
#
|
389
|
+
def source_from_qrc( a_qrc_file, a_target )
|
390
|
+
path, file_name = File.split( a_qrc_file )
|
391
|
+
updated_file_name = 'qrc_' +
|
392
|
+
MxxRu::Util::remove_file_ext( file_name ) +
|
393
|
+
@cpp_ext
|
394
|
+
|
395
|
+
if @qrc_result_subdir then
|
396
|
+
result = File.join( path, @qrc_result_subdir, updated_file_name )
|
397
|
+
else
|
398
|
+
result = File.join( path, updated_file_name )
|
399
|
+
end
|
400
|
+
|
401
|
+
result
|
402
|
+
end
|
403
|
+
|
404
|
+
# Perform generation from qrc-files.
|
405
|
+
def build_from_qrc2rcc( a_target )
|
406
|
+
@qt_qrc2rcc_files.each { |qrc_file|
|
407
|
+
name = File.basename( MxxRu::Util::remove_file_ext( qrc_file ) )
|
408
|
+
target_path =
|
409
|
+
File.dirname( a_target.create_full_result_target_file_name )
|
410
|
+
MxxRu::Util::ensure_path_exists( target_path )
|
411
|
+
|
412
|
+
rcc_file = File.join( target_path, name + '.rcc' )
|
413
|
+
|
414
|
+
# Checking what files are changed and running generation
|
415
|
+
# from them if necessary.
|
416
|
+
if TargetState::EXISTS != TargetState.detect(
|
417
|
+
rcc_file,
|
418
|
+
[ qrc_file ] + Qt4.detect_qrc_file_dependencies( qrc_file ) ).state
|
419
|
+
MxxRu::AbstractTarget::run(
|
420
|
+
[ "#{@rcc_name} -binary -name #{name} -o #{rcc_file} #{qrc_file}" ],
|
421
|
+
[ rcc_file ],
|
422
|
+
"building Qt4 resource file #{rcc_file}" )
|
423
|
+
end
|
424
|
+
}
|
425
|
+
end
|
426
|
+
|
427
|
+
# Perform cleanup of files, generated from qrc files.
|
428
|
+
#
|
429
|
+
def clean_from_qrc2rcc( a_target )
|
430
|
+
@qt_qrc2rcc_files.each { |qrc_file|
|
431
|
+
name = File.basename( MxxRu::Util::remove_file_ext( qrc_file ) )
|
432
|
+
target_path =
|
433
|
+
File.dirname( a_target.create_full_result_target_file_name )
|
434
|
+
rcc_file = File.join( target_path, name + '.rcc' )
|
435
|
+
|
436
|
+
MxxRu::Util::delete_file( rcc_file )
|
437
|
+
}
|
438
|
+
end
|
439
|
+
|
440
|
+
# Perform generation from hpp file using moc tool.
|
441
|
+
def build_from_h( a_target )
|
442
|
+
@qt_h2moc_files.each { |header_full|
|
443
|
+
moc_full = moc_from_h( header_full, a_target )
|
444
|
+
|
445
|
+
if TargetState::EXISTS != TargetState.detect(
|
446
|
+
moc_full, [ header_full ] ).state
|
447
|
+
MxxRu::AbstractTarget::run(
|
448
|
+
[ "#{moc_name} -o #{moc_full} " +
|
449
|
+
"#{header_full}" ],
|
450
|
+
[ moc_full ],
|
451
|
+
"building moc file #{moc_full}" )
|
452
|
+
end
|
453
|
+
|
454
|
+
add_cpp_source( a_target, moc_full )
|
455
|
+
}
|
456
|
+
end
|
457
|
+
|
458
|
+
# Perform cleanup of files produced by generation from hpp file.
|
459
|
+
def clean_from_h( a_target )
|
460
|
+
@qt_h2moc_files.each { |h|
|
461
|
+
moc = moc_from_h( h, a_target )
|
462
|
+
|
463
|
+
MxxRu::Util::delete_file( moc )
|
464
|
+
|
465
|
+
add_cpp_source( a_target, moc )
|
466
|
+
}
|
467
|
+
end
|
468
|
+
|
469
|
+
# Formatting file name, which is generated from hpp file by moc tool
|
470
|
+
def moc_from_h( a_h_file, a_target )
|
471
|
+
path = File.dirname( a_h_file )
|
472
|
+
|
473
|
+
# If path == ".", then Qt will generate wrong include directive
|
474
|
+
path = "" if path == "./"
|
475
|
+
path = make_moc_result_path_for( path )
|
476
|
+
|
477
|
+
MxxRu::Util::ensure_path_exists( path )
|
478
|
+
|
479
|
+
r = File.join( path, "moc_" + File.basename(
|
480
|
+
MxxRu::Util::remove_file_ext( a_h_file ) ) + @cpp_ext )
|
481
|
+
end
|
482
|
+
|
483
|
+
# Perform generation from cpp file using moc tool.
|
484
|
+
def build_from_cpp( a_target )
|
485
|
+
@qt_cpp2moc_files.each { |cpp_full|
|
486
|
+
moc_full = moc_from_cpp( cpp_full, a_target )
|
487
|
+
|
488
|
+
if TargetState::EXISTS != TargetState.detect(
|
489
|
+
moc_full, [ cpp_full ] ).state
|
490
|
+
MxxRu::AbstractTarget::run(
|
491
|
+
[ "#{moc_name} -o #{moc_full} " +
|
492
|
+
"#{cpp_full}" ],
|
493
|
+
[ moc_full ],
|
494
|
+
"building moc file #{moc_full}" )
|
495
|
+
end
|
496
|
+
}
|
497
|
+
end
|
498
|
+
|
499
|
+
# Perform cleanup of files produced by generation from cpp file.
|
500
|
+
def clean_from_cpp( a_target )
|
501
|
+
@qt_cpp2moc_files.each { |cpp|
|
502
|
+
moc = moc_from_cpp( cpp, a_target )
|
503
|
+
|
504
|
+
MxxRu::Util::delete_file( moc )
|
505
|
+
}
|
506
|
+
end
|
507
|
+
|
508
|
+
# Formatting file name, which is generated from cpp file by moc tool
|
509
|
+
def moc_from_cpp( a_cpp_file, a_target )
|
510
|
+
path = make_moc_result_path_for( File.dirname( a_cpp_file ) )
|
511
|
+
|
512
|
+
MxxRu::Util::ensure_path_exists( path )
|
513
|
+
|
514
|
+
r = File.join( path, File.basename(
|
515
|
+
MxxRu::Util::remove_file_ext( a_cpp_file ) ) + @moc_ext )
|
516
|
+
|
517
|
+
return r
|
518
|
+
end
|
519
|
+
|
520
|
+
# Setting C++ file name, ignoring current sources_root value.
|
521
|
+
def add_cpp_source( a_target, a_file )
|
522
|
+
old_root = a_target.sources_root( "" )
|
523
|
+
a_target.cpp_source( a_file )
|
524
|
+
a_target.sources_root( old_root )
|
525
|
+
end
|
526
|
+
|
527
|
+
# Calculating path for moc results.
|
528
|
+
def make_moc_result_path_for( path )
|
529
|
+
if @moc_result_subdir
|
530
|
+
if path.length > 0
|
531
|
+
File.join( path, @moc_result_subdir )
|
532
|
+
else
|
533
|
+
@moc_result_subdir
|
534
|
+
end
|
535
|
+
else
|
536
|
+
path
|
537
|
+
end
|
538
|
+
end
|
539
|
+
|
540
|
+
# Calculating path for uic results.
|
541
|
+
def make_uic_result_path_for( file )
|
542
|
+
File.join( File.dirname( file ), @uic_result_subdir )
|
543
|
+
end
|
544
|
+
|
545
|
+
# Detect list of dependencies for .qrc file.
|
546
|
+
def Qt4.detect_qrc_file_dependencies( a_qrc_file )
|
547
|
+
qrc_file_path = File.dirname( a_qrc_file )
|
548
|
+
result = []
|
549
|
+
File.open( a_qrc_file, 'r' ) do |file|
|
550
|
+
doc = REXML::Document.new( file )
|
551
|
+
result = doc.elements[ '/RCC/qresource/file' ].inject( [] ) do
|
552
|
+
|list, item|
|
553
|
+
s = item.value
|
554
|
+
p = Pathname.new( s )
|
555
|
+
if !p.absolute?
|
556
|
+
list << File.join( qrc_file_path, s )
|
557
|
+
else
|
558
|
+
list << s
|
559
|
+
end
|
560
|
+
list
|
561
|
+
end
|
562
|
+
end
|
563
|
+
|
564
|
+
result
|
565
|
+
end
|
566
|
+
|
567
|
+
end # class Qt4
|
568
|
+
|
569
|
+
end
|
570
|
+
end
|
571
|
+
|