0030706: Visualization - fetch font folder list from fontconfig library on Linux
[occt.git] / adm / genproj.tcl
CommitLineData
910970ab 1# =======================================================================
d1a67b9d 2# Created on: 2014-07-24
3# Created by: SKI
4# Copyright (c) 2014 OPEN CASCADE SAS
5#
6# This file is part of Open CASCADE Technology software library.
7#
8# This library is free software; you can redistribute it and/or modify it under
9# the terms of the GNU Lesser General Public License version 2.1 as published
10# by the Free Software Foundation, with special exception defined in the file
11# OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12# distribution for complete text of the license and disclaimer of any warranty.
13#
14# Alternatively, this file may be used under the terms of Open CASCADE
15# commercial license or contractual agreement.
16
17# =======================================================================
18# This script defines Tcl command genproj generating project files for
944d808c 19# different IDEs and platforms. Run it with -help to get synopsis.
910970ab 20# =======================================================================
21
d1a67b9d 22source [file join [file dirname [info script]] genconfdeps.tcl]
23
944d808c 24# the script is assumed to be run from CASROOT (or dependent Products root)
25set path [file normalize .]
e31a8e52 26set THE_CASROOT ""
910970ab 27set fBranch ""
e31a8e52 28if { [info exists ::env(CASROOT)] } {
471a2ca0 29 set THE_CASROOT [file normalize "$::env(CASROOT)"]
e31a8e52 30}
c7d774c5 31
910970ab 32proc _get_options { platform type branch } {
910970ab 33 set res ""
e31a8e52 34 if {[file exists "$::THE_CASROOT/adm/CMPLRS"]} {
35 set fd [open "$::THE_CASROOT/adm/CMPLRS" rb]
910970ab 36 set opts [split [read $fd] "\n"]
37 close $fd
38 foreach line $opts {
39 if {[regexp "^${platform} ${type} ${branch} (.+)$" $line dummy res]} {
40 while {[regexp {\(([^\(\)]+) ([^\(\)]+) ([^\(\)]+)\)(.+)} $res dummy p t b oldres]} {
41 set res "[_get_options $p $t $b] $oldres"
42 }
43 }
44 }
45 }
46 return $res
47}
48
49proc _get_type { name } {
e31a8e52 50 set UDLIST {}
51 if {[file exists "$::path/adm/UDLIST"]} {
52 set fd [open "$::path/adm/UDLIST" rb]
53 set UDLIST [concat $UDLIST [split [read $fd] "\n"]]
910970ab 54 close $fd
e31a8e52 55 }
56 if { "$::path/adm/UDLIST" != "$::THE_CASROOT/adm/UDLIST" && [file exists "$::THE_CASROOT/adm/UDLIST"] } {
57 set fd [open "$::THE_CASROOT/adm/UDLIST" rb]
58 set UDLIST [concat $UDLIST [split [read $fd] "\n"]]
59 close $fd
60 }
61
62 foreach uitem $UDLIST {
63 set line [split $uitem]
64 if {[lindex $line 1] == "$name"} {
65 return [lindex $line 0]
910970ab 66 }
67 }
68 return ""
69}
70
71proc _get_used_files { pk {inc true} {src true} } {
72 global path
73 set type [_get_type $pk]
74 set lret {}
75 set pk_path "$path/src/$pk"
76 set FILES_path "$path/src/$pk/FILES"
77 set FILES {}
78 if {[file exists $FILES_path]} {
79 set fd [open $FILES_path rb]
80 set FILES [split [read $fd] "\n"]
81 close $fd
82 }
83 set FILES [lsearch -inline -all -not -exact $FILES ""]
84
85 set index -1
86 foreach line $FILES {
87 incr index
88 if {$inc && ([regexp {([^:\s]*\.[hgl]xx)$} $line dummy name] || [regexp {([^:\s]*\.h)$} $line dummy name]) && [file exists $pk_path/$name]} {
89 lappend lret "pubinclude $name $pk_path/$name"
90 continue
91 }
92 if {[regexp {:} $line]} {
93 regexp {[^:]*:+([^\s]*)} $line dummy line
94 }
95 regexp {([^\s]*)} $line dummy line
96 if {$src && [file exists $pk_path/$line]} {
97 lappend lret "source $line $pk_path/$line"
98 }
99 }
100 return $lret
101}
102
e31a8e52 103# return location of the path within src directory
104proc osutils:findSrcSubPath {theSubPath} {
105 if {[file exists "$::path/src/$theSubPath"]} {
106 return "$::path/src/$theSubPath"
107 }
108 return "$::THE_CASROOT/src/$theSubPath"
109}
110
ee5befae 111# Auxiliary tool comparing content of two files line-by-line.
112proc osutils:isEqualContent { theContent1 theContent2 } {
113 set aLen1 [llength $theContent1]
114 set aLen2 [llength $theContent2]
115 if { $aLen1 != $aLen2 } {
116 return false
117 }
118
119 for {set aLineIter 0} {$aLineIter < $aLen1} {incr aLineIter} {
120 set aLine1 [lindex $theContent1 $aLineIter]
121 set aLine2 [lindex $theContent2 $aLineIter]
122 if { $aLine1 != $aLine2 } {
123 return false
124 }
125 }
126 return true
127}
128
129# Auxiliary function for writing new file content only if it has been actually changed
130# (e.g. to preserve file timestamp on no change).
131# Useful for automatically (re)generated files.
132proc osutils:writeTextFile { theFile theContent {theEol lf} } {
133 if {[file exists "${theFile}"]} {
134 set aFileOld [open "${theFile}" rb]
135 fconfigure $aFileOld -translation crlf
136 set aLineListOld [split [read $aFileOld] "\n"]
137 close $aFileOld
138
139 # append empty line for proper comparison (which will be implicitly added by last puts below)
140 set aContent $theContent
141 lappend aContent ""
142 if { [osutils:isEqualContent $aLineListOld $aContent] == true } {
143 return false
144 }
145
146 file delete -force "${theFile}"
147 }
148
149 set anOutFile [open "$theFile" "w"]
150 fconfigure $anOutFile -translation $theEol
151 foreach aLine ${theContent} {
152 puts $anOutFile "${aLine}"
153 }
154 close $anOutFile
155 return true
156}
157
158# Function re-generating header files for specified text resource
159proc genResources { theResource } {
160 global path
161
162 set aResFileList {}
163 set aResourceAbsPath [file normalize "${path}/src/${theResource}"]
164 set aResourceDirectory ""
165 set isResDirectory false
166
167 if {[file isdirectory "${aResourceAbsPath}"]} {
168 if {[file exists "${aResourceAbsPath}/FILES"]} {
169 set aFilesFile [open "${aResourceAbsPath}/FILES" rb]
170 set aResFileList [split [read $aFilesFile] "\n"]
171 close $aFilesFile
172 }
173 set aResFileList [lsearch -inline -all -not -exact $aResFileList ""]
174 set aResourceDirectory "${theResource}"
175 set isResDirectory true
176 } else {
177 set aResourceName [file tail "${theResource}"]
178 lappend aResFileList "res:::${aResourceName}"
179 set aResourceDirectory [file dirname "${theResource}"]
180 }
181
182 foreach aResFileIter ${aResFileList} {
183 if {![regexp {^[^:]+:::(.+)} "${aResFileIter}" dump aResFileIter]} {
184 continue
185 }
186
187 set aResFileName [file tail "${aResFileIter}"]
188 regsub -all {\.} "${aResFileName}" {_} aResFileName
189 set aHeaderFileName "${aResourceDirectory}_${aResFileName}.pxx"
190 if { $isResDirectory == true && [lsearch $aResFileList $aHeaderFileName] == -1 } {
191 continue
192 }
193
194 # generate
195 set aContent {}
196 lappend aContent "// This file has been automatically generated from resource file src/${aResourceDirectory}/${aResFileIter}"
197 lappend aContent ""
198
199 # generate necessary structures
200 set aLineList {}
201 if {[file exists "${path}/src/${aResourceDirectory}/${aResFileIter}"]} {
202 set anInputFile [open "${path}/src/${aResourceDirectory}/${aResFileIter}" rb]
203 fconfigure $anInputFile -translation crlf
204 set aLineList [split [read $anInputFile] "\n"]
205 close $anInputFile
206 }
207
208 # drop empty trailing line
209 set anEndOfFile ""
210 if { [lindex $aLineList end] == "" } {
211 set aLineList [lreplace $aLineList end end]
212 set anEndOfFile "\\n"
213 }
214
215 lappend aContent "static const char ${aResourceDirectory}_${aResFileName}\[\] ="
216 set aNbLines [llength $aLineList]
217 set aLastLine [expr $aNbLines - 1]
218 for {set aLineIter 0} {$aLineIter < $aNbLines} {incr aLineIter} {
219 set aLine [lindex $aLineList $aLineIter]
220 regsub -all {\"} "${aLine}" {\\"} aLine
221 if { $aLineIter == $aLastLine } {
222 lappend aContent " \"${aLine}${anEndOfFile}\";"
223 } else {
224 lappend aContent " \"${aLine}\\n\""
225 }
226 }
227
228 # Save generated content to header file
229 set aHeaderFilePath "${path}/src/${aResourceDirectory}/${aHeaderFileName}"
230 if { [osutils:writeTextFile $aHeaderFilePath $aContent] == true } {
231 puts "Generating header file from resource file: ${path}/src/${aResourceDirectory}/${aResFileIter}"
232 } else {
233 #puts "Header file from resource ${path}/src/${aResourceDirectory}/${aResFileIter} is up-to-date"
234 }
235 }
236}
237
238# Function re-generating header files for all text resources
239proc genAllResources {} {
240 global path
241 set aCasRoot [file normalize $path]
242 if {![file exists "$aCasRoot/adm/RESOURCES"]} {
243 puts "OCCT directory is not defined correctly: $aCasRoot"
244 return
245 }
246
247 set aFileResources [open "$aCasRoot/adm/RESOURCES" rb]
248 set anAdmResources [split [read $aFileResources] "\r\n"]
249 close $aFileResources
250 set anAdmResources [lsearch -inline -all -not -exact $anAdmResources ""]
251
252 foreach line $anAdmResources {
253 genResources "${line}"
254 }
255}
256
910970ab 257# Wrapper-function to generate VS project files
d6cda17a 258proc genproj {theFormat args} {
aafe169f 259 set aSupportedFormats { "vc7" "vc8" "vc9" "vc10" "vc11" "vc12" "vc14" "vc141" "cbp" "xcd" "pro"}
d6cda17a 260 set aSupportedPlatforms { "wnt" "uwp" "lin" "mac" "ios" "qnx" }
910970ab 261 set isHelpRequire false
910970ab 262
d6cda17a 263 # check format argument
264 if { $theFormat == "-h" || $theFormat == "-help" || $theFormat == "--help" } {
944d808c 265 set isHelpRequire true
d6cda17a 266 } elseif { [lsearch -exact $aSupportedFormats $theFormat] < 0 } {
267 puts "Error: genproj: unrecognized project format \"$theFormat\""
910970ab 268 set isHelpRequire true
269 }
270
944d808c 271 # choice of compiler for Code::Blocks, currently hard-coded
272 set aCmpl "gcc"
c7d774c5 273
944d808c 274 # Determine default platform: wnt for vc*, mac for xcd, current for cbp
d6cda17a 275 if { [regexp "^vc" $theFormat] } {
944d808c 276 set aPlatform "wnt"
d6cda17a 277 } elseif { $theFormat == "xcd" || $::tcl_platform(os) == "Darwin" } {
944d808c 278 set aPlatform "mac"
279 } elseif { $::tcl_platform(platform) == "windows" } {
280 set aPlatform "wnt"
281 } elseif { $::tcl_platform(platform) == "unix" } {
282 set aPlatform "lin"
910970ab 283 }
284
944d808c 285 # Check optional arguments
286 set aLibType "dynamic"
287 foreach arg $args {
288 if { $arg == "-h" || $arg == "-help" || $arg == "--help" } {
289 set isHelpRequire true
290 } elseif { [lsearch -exact $aSupportedPlatforms $arg] >= 0 } {
291 set aPlatform $arg
292 } elseif { $arg == "-static" } {
293 set aLibType "static"
294 puts "Static build has been selected"
295 } elseif { $arg == "-dynamic" } {
296 set aLibType "dynamic"
297 puts "Dynamic build has been selected"
298 } else {
299 puts "Error: genproj: unrecognized option \"$arg\""
300 set isHelpRequire true
910970ab 301 }
302 }
303
304 if { $isHelpRequire == true } {
d6cda17a 305 puts "usage: genproj Format \[Platform\] \[-static\] \[-h|-help|--help\]
910970ab 306
d6cda17a 307 Format must be one of:
7fbac3c2 308 vc8 - Visual Studio 2005
309 vc9 - Visual Studio 2008
310 vc10 - Visual Studio 2010
311 vc11 - Visual Studio 2012
312 vc12 - Visual Studio 2013
313 vc14 - Visual Studio 2015
d6cda17a 314 vc141 - Visual Studio 2017
7fbac3c2 315 cbp - CodeBlocks
316 xcd - XCode
aafe169f 317 pro - Qt Creator
944d808c 318
d6cda17a 319 Platform (optional):
320 wnt - Windows Desktop
321 uwp - Universal Windows Platform
944d808c 322 lin - Linux
323 mac - OS X
324 ios - iOS
325 qnx - QNX
326
327 Option -static can be used with XCode to build static libraries
328 "
329 return
910970ab 330 }
331
944d808c 332 if { ! [info exists aPlatform] } {
333 puts "Error: genproj: Cannon identify default platform, please specify!"
334 return
910970ab 335 }
cb6a2fbc 336
d6cda17a 337 puts "Preparing to generate $theFormat projects for $aPlatform platform..."
910970ab 338
d6cda17a 339 # base path to where to generate projects, hardcoded from current dir
944d808c 340 set anAdmPath [file normalize "${::path}/adm"]
910970ab 341
d6cda17a 342 OS:MKPRC "$anAdmPath" "$theFormat" "$aLibType" "$aPlatform" "$aCmpl"
910970ab 343
d6cda17a 344 genprojbat "$theFormat" "$aPlatform"
ee5befae 345 genAllResources
944d808c 346}
910970ab 347
471a2ca0 348# copy file providing warning if the target file exists and has
349# different date or size; if it is newer than source, save it as .bak
350proc copy_with_warning {from to} {
351 if { [file exists "$to"] &&
352 ([file size "$to"] != [file size "$from"] ||
353 [file mtime "$to"] != [file mtime "$from"]) } {
354 puts "Warning: file $to is updated (copied from $from)!"
355 if { [file mtime $to] > [file mtime $from] } {
356 puts "Info: old content of file $to is saved in ${to}.bak"
357 file copy -force -- "$to" "${to}.bak"
358 }
359 }
360
361 file copy -force -- "$from" "$to"
362}
363
d6cda17a 364proc genprojbat {theFormat thePlatform} {
910970ab 365 set aTargetPlatformExt sh
d6cda17a 366 if { $thePlatform == "wnt" || $thePlatform == "uwp" } {
910970ab 367 set aTargetPlatformExt bat
368 }
369
d6cda17a 370 if {"$theFormat" != "cmake"} {
944d808c 371 # copy env.bat/sh only if not yet present
372 if { ! [file exists "$::path/env.${aTargetPlatformExt}"] } {
373 set anEnvTmplFile [open "$::THE_CASROOT/adm/templates/env.${aTargetPlatformExt}" "r"]
374 set anEnvTmpl [read $anEnvTmplFile]
375 close $anEnvTmplFile
376
377 set aCasRoot ""
378 if { [file normalize "$::path"] != [file normalize "$::THE_CASROOT"] } {
379 set aCasRoot [relativePath "$::path" "$::THE_CASROOT"]
380 }
910970ab 381
944d808c 382 regsub -all -- {__CASROOT__} $anEnvTmpl "$aCasRoot" anEnvTmpl
910970ab 383
944d808c 384 set anEnvFile [open "$::path/env.${aTargetPlatformExt}" "w"]
385 puts $anEnvFile $anEnvTmpl
386 close $anEnvFile
387 }
910970ab 388
471a2ca0 389 copy_with_warning "$::THE_CASROOT/adm/templates/draw.${aTargetPlatformExt}" "$::path/draw.${aTargetPlatformExt}"
910970ab 390 }
391
d6cda17a 392 if { [regexp {^vc} $theFormat] } {
471a2ca0 393 copy_with_warning "$::THE_CASROOT/adm/templates/msvc.bat" "$::path/msvc.bat"
910970ab 394 } else {
d6cda17a 395 switch -exact -- "$theFormat" {
7c65581d 396 "cbp" {
397 file copy -force -- "$::THE_CASROOT/adm/templates/codeblocks.sh" "$::path/codeblocks.sh"
398 file copy -force -- "$::THE_CASROOT/adm/templates/codeblocks.bat" "$::path/codeblocks.bat"
aafe169f 399
944d808c 400 # Code::Blocks 16.01 does not create directory for import libs, help him
aafe169f 401 set aPlatformAndCompiler "${thePlatform}/gcc"
402 if { "$thePlatform" == "mac" || "$thePlatform" == "ios" } {
403 set aPlatformAndCompiler "${thePlatform}/clang"
404 }
405 file mkdir "$::path/${aPlatformAndCompiler}/lib"
406 file mkdir "$::path/${aPlatformAndCompiler}/libd"
7c65581d 407 }
e31a8e52 408 "xcd" { file copy -force -- "$::THE_CASROOT/adm/templates/xcode.sh" "$::path/xcode.sh" }
910970ab 409 }
410 }
411}
412
413###### MSVC #############################################################33
414proc removeAllOccurrencesOf { theObject theList } {
415 set aSortIndices [lsort -decreasing [lsearch -all -nocase $theList $theObject]]
416 foreach anIndex $aSortIndices {
417 set theList [lreplace $theList $anIndex $anIndex]
418 }
419 return $theList
420}
421
c7d774c5 422set aTKNullKey "TKNull"
423set THE_GUIDS_LIST($aTKNullKey) "{00000000-0000-0000-0000-000000000000}"
910970ab 424
d6cda17a 425# Entry function to generate project files
7c65581d 426# @param theOutDir Root directory for project files
d6cda17a 427# @param theFormat Project format name (vc.. for Visual Studio projects, cbp for Code::Blocks, xcd for XCode)
7c65581d 428# @param theLibType Library type - dynamic or static
429# @param thePlatform Optional target platform for cross-compiling, e.g. ios for iOS
430# @param theCmpl Compiler option (msvc or gcc)
d6cda17a 431proc OS:MKPRC { theOutDir theFormat theLibType thePlatform theCmpl } {
944d808c 432 global path
910970ab 433 set anOutRoot $theOutDir
434 if { $anOutRoot == "" } {
435 error "Error : \"theOutDir\" is not initialized"
436 }
437
438 # Create output directory
944d808c 439 set aWokStation "$thePlatform"
d6cda17a 440 if { [regexp {^vc} $theFormat] } {
910970ab 441 set aWokStation "msvc"
442 }
d6cda17a 443 set aSuffix ""
444 set isUWP 0
445 if { $thePlatform == "uwp" } {
446 set aSuffix "-uwp"
447 set isUWP 1
448 }
449 set anOutDir "${anOutRoot}/${aWokStation}/${theFormat}${aSuffix}"
910970ab 450
451 # read map of already generated GUIDs
d6cda17a 452 set aGuidsFilePath [file join $anOutDir "wok_${theFormat}_guids.txt"]
910970ab 453 if [file exists "$aGuidsFilePath"] {
454 set aFileIn [open "$aGuidsFilePath" r]
455 set aFileDataRaw [read $aFileIn]
456 close $aFileIn
457 set aFileData [split $aFileDataRaw "\n"]
458 foreach aLine $aFileData {
459 set aLineSplt [split $aLine "="]
460 if { [llength $aLineSplt] == 2 } {
461 set ::THE_GUIDS_LIST([lindex $aLineSplt 0]) [lindex $aLineSplt 1]
462 }
463 }
464 }
465
466 # make list of modules and platforms
467 set aModules [OS:init]
c7d774c5 468 if { "$thePlatform" == "ios" } {
469 set goaway [list Draw]
470 set aModules [osutils:juststation $goaway $aModules]
471 }
910970ab 472
7fbac3c2 473 # Draw module is turned off due to it is not supported on UWP
d6cda17a 474 if { $isUWP } {
7fbac3c2 475 set aDrawIndex [lsearch -exact ${aModules} "Draw"]
476 if { ${aDrawIndex} != -1 } {
477 set aModules [lreplace ${aModules} ${aDrawIndex} ${aDrawIndex}]
478 }
479 }
480
910970ab 481 # create the out dir if it does not exist
482 if (![file isdirectory $path/inc]) {
483 puts "$path/inc folder does not exists and will be created"
484 wokUtils:FILES:mkdir $path/inc
485 }
486
487 # collect all required header files
488 puts "Collecting required header files into $path/inc ..."
944d808c 489 osutils:collectinc $aModules $path/inc
910970ab 490
aafe169f 491 if { "$theFormat" == "pro" } {
492 return
493 }
494
495 # generate one solution for all projects if complete OS or VAS is processed
496 set anAllSolution "OCCT"
497
498 wokUtils:FILES:mkdir $anOutDir
499 if { ![file exists $anOutDir] } {
500 puts stderr "Error: Could not create output directory \"$anOutDir\""
501 return
502 }
503
d6cda17a 504 # Generating project files for the selected format
505 switch -exact -- "$theFormat" {
910970ab 506 "vc7" -
507 "vc8" -
508 "vc9" -
7fbac3c2 509 "vc10" -
510 "vc11" -
511 "vc12" -
512 "vc14" -
d6cda17a 513 "vc141" { OS:MKVC $anOutDir $aModules $anAllSolution $theFormat $isUWP}
7fbac3c2 514 "cbp" { OS:MKCBP $anOutDir $aModules $anAllSolution $thePlatform $theCmpl }
515 "xcd" {
c7d774c5 516 set ::THE_GUIDS_LIST($::aTKNullKey) "000000000000000000000000"
517 OS:MKXCD $anOutDir $aModules $anAllSolution $theLibType $thePlatform
518 }
910970ab 519 }
910970ab 520
521 # Store generated GUIDs map
522 set anOutFile [open "$aGuidsFilePath" "w"]
523 fconfigure $anOutFile -translation lf
524 foreach aKey [array names ::THE_GUIDS_LIST] {
525 set aValue $::THE_GUIDS_LIST($aKey)
526 puts $anOutFile "${aKey}=${aValue}"
527 }
528 close $anOutFile
529}
530
531# Function to generate Visual Studio solution and project files
d6cda17a 532proc OS:MKVC { theOutDir theModules theAllSolution theVcVer isUWP } {
910970ab 533
534 puts stderr "Generating VS project files for $theVcVer"
535
536 # generate projects for toolkits and separate solution for each module
537 foreach aModule $theModules {
538 OS:vcsolution $theVcVer $aModule $aModule $theOutDir ::THE_GUIDS_LIST
d6cda17a 539 OS:vcproj $theVcVer $isUWP $aModule $theOutDir ::THE_GUIDS_LIST
910970ab 540 }
541
542 # generate single solution "OCCT" containing projects from all modules
543 if { "$theAllSolution" != "" } {
544 OS:vcsolution $theVcVer $theAllSolution $theModules $theOutDir ::THE_GUIDS_LIST
545 }
546
547 puts "The Visual Studio solution and project files are stored in the $theOutDir directory"
548}
549
550proc OS:init {{os {}}} {
e31a8e52 551 set askplat $os
552 set aModules {}
553 if { "$os" == "" } {
554 set os $::tcl_platform(os)
555 }
556
557 if [file exists "$::path/src/VAS/Products.tcl"] {
558 source "$::path/src/VAS/Products.tcl"
559 foreach aModuleIter [VAS:Products] {
560 set aFileTcl "$::path/src/VAS/${aModuleIter}.tcl"
561 if [file exists $aFileTcl] {
562 source $aFileTcl
563 lappend aModules $aModuleIter
564 } else {
565 puts stderr "Definition file for module $aModuleIter is not found in unit VAS"
566 }
910970ab 567 }
e31a8e52 568 return $aModules
569 }
910970ab 570
e31a8e52 571 # Load list of OCCT modules and their definitions
572 source "$::path/src/OS/Modules.tcl"
573 foreach aModuleIter [OS:Modules] {
574 set aFileTcl "$::path/src/OS/${aModuleIter}.tcl"
575 if [file exists $aFileTcl] {
576 source $aFileTcl
577 lappend aModules $aModuleIter
578 } else {
579 puts stderr "Definition file for module $aModuleIter is not found in unit OS"
580 }
581 }
910970ab 582
e31a8e52 583 return $aModules
910970ab 584}
585
586# topological sort. returns a list { {a h} {b g} {c f} {c h} {d i} } => { d a b c i g f h }
587proc wokUtils:EASY:tsort { listofpairs } {
588 foreach x $listofpairs {
589 set e1 [lindex $x 0]
590 set e2 [lindex $x 1]
591 if ![info exists pcnt($e1)] {
592 set pcnt($e1) 0
593 }
594 if ![ info exists pcnt($e2)] {
595 set pcnt($e2) 1
596 } else {
597 incr pcnt($e2)
598 }
599 if ![info exists scnt($e1)] {
600 set scnt($e1) 1
601 } else {
602 incr scnt($e1)
603 }
604 set l {}
605 if [info exists slist($e1)] {
606 set l $slist($e1)
607 }
608 lappend l $e2
609 set slist($e1) $l
610 }
611 set nodecnt 0
612 set back 0
613 foreach node [array names pcnt] {
614 incr nodecnt
615 if { $pcnt($node) == 0 } {
616 incr back
617 set q($back) $node
618 }
619 if ![info exists scnt($node)] {
620 set scnt($node) 0
621 }
622 }
623 set res {}
624 for {set front 1} { $front <= $back } { incr front } {
625 lappend res [set node $q($front)]
626 for {set i 1} {$i <= $scnt($node) } { incr i } {
627 set ll $slist($node)
628 set j [expr {$i - 1}]
629 set u [expr { $pcnt([lindex $ll $j]) - 1 }]
630 if { [set pcnt([lindex $ll $j]) $u] == 0 } {
631 incr back
632 set q($back) [lindex $ll $j]
633 }
634 }
635 }
636 if { $back != $nodecnt } {
637 puts stderr "input contains a cycle"
638 return {}
639 } else {
640 return $res
641 }
642}
643
644proc wokUtils:LIST:Purge { l } {
645 set r {}
646 foreach e $l {
647 if ![info exist tab($e)] {
648 lappend r $e
649 set tab($e) {}
650 }
651 }
652 return $r
653}
654
655# Read file pointed to by path
656# 1. sort = 1 tri
657# 2. trim = 1 plusieurs blancs => 1 seul blanc
658# 3. purge= not yet implemented.
659# 4. emptl= dont process blank lines
660proc wokUtils:FILES:FileToList { path {sort 0} {trim 0} {purge 0} {emptl 1} } {
661 if ![ catch { set id [ open $path r ] } ] {
662 set l {}
663 while {[gets $id line] >= 0 } {
664 if { $trim } {
665 regsub -all {[ ]+} $line " " line
666 }
667 if { $emptl } {
668 if { [string length ${line}] != 0 } {
669 lappend l $line
670 }
671 } else {
672 lappend l $line
673 }
674 }
675 close $id
676 if { $sort } {
677 return [lsort $l]
678 } else {
679 return $l
680 }
681 } else {
682 return {}
683 }
684}
685
686# retorn the list of executables in module.
687proc OS:executable { module } {
688 set lret {}
689 foreach XXX [${module}:ressources] {
690 if { "[lindex $XXX 1]" == "x" } {
691 lappend lret [lindex $XXX 2]
692 }
693 }
694 return $lret
695}
696
697# Topological sort of toolkits in tklm
698proc osutils:tk:sort { tklm } {
699 set tkby2 {}
700 foreach tkloc $tklm {
701 set lprg [wokUtils:LIST:Purge [osutils:tk:close $tkloc]]
702 foreach tkx $lprg {
703 if { [lsearch $tklm $tkx] != -1 } {
704 lappend tkby2 [list $tkx $tkloc]
705 } else {
706 lappend tkby2 [list $tkloc {}]
707 }
708 }
709 }
710 set lret {}
711 foreach e [wokUtils:EASY:tsort $tkby2] {
712 if { $e != {} } {
713 lappend lret $e
714 }
715 }
716 return $lret
717}
718
719# close dependencies of ltk. (full wok pathes of toolkits)
720# The CURRENT WOK LOCATION MUST contains ALL TOOLKITS required.
721# (locate not performed.)
722proc osutils:tk:close { ltk } {
723 set result {}
724 set recurse {}
725 foreach dir $ltk {
726 set ids [LibToLink $dir]
e31a8e52 727# puts "osutils:tk:close($ltk) ids='$ids'"
910970ab 728 set eated [osutils:tk:eatpk $ids]
729 set result [concat $result $eated]
730 set ids [LibToLink $dir]
731 set result [concat $result $ids]
732
733 foreach file $eated {
e31a8e52 734 set kds [osutils:findSrcSubPath "$file/EXTERNLIB"]
910970ab 735 if { [osutils:tk:eatpk $kds] != {} } {
736 lappend recurse $file
737 }
738 }
739 }
740 if { $recurse != {} } {
741 set result [concat $result [osutils:tk:close $recurse]]
742 }
743 return $result
744}
745
746proc osutils:tk:eatpk { EXTERNLIB } {
747 set l [wokUtils:FILES:FileToList $EXTERNLIB]
748 set lret {}
749 foreach str $l {
750 if ![regexp -- {(CSF_[^ ]*)} $str csf] {
751 lappend lret $str
752 }
753 }
754 return $lret
755}
756# Define libraries to link using only EXTERNLIB file
757
758proc LibToLink {theTKit} {
910970ab 759 regexp {^.*:([^:]+)$} $theTKit dummy theTKit
760 set type [_get_type $theTKit]
761 if {$type != "t" && $type != "x"} {
762 return
763 }
764 set aToolkits {}
e31a8e52 765 set anExtLibList [osutils:tk:eatpk [osutils:findSrcSubPath "$theTKit/EXTERNLIB"]]
910970ab 766 foreach anExtLib $anExtLibList {
767 set aFullPath [LocateRecur $anExtLib]
768 if { "$aFullPath" != "" && [_get_type $anExtLib] == "t" } {
769 lappend aToolkits $anExtLib
770 }
771 }
772 return $aToolkits
773}
774# Search unit recursively
775
776proc LocateRecur {theName} {
e31a8e52 777 set theNamePath [osutils:findSrcSubPath "$theName"]
910970ab 778 if {[file isdirectory $theNamePath]} {
779 return $theNamePath
780 }
781 return ""
782}
783
d6cda17a 784proc OS:genGUID { {theFormat "vc"} } {
785 if { "$theFormat" == "vc" } {
910970ab 786 set p1 "[format %07X [expr { int(rand() * 268435456) }]][format %X [expr { int(rand() * 16) }]]"
787 set p2 "[format %04X [expr { int(rand() * 6536) }]]"
788 set p3 "[format %04X [expr { int(rand() * 6536) }]]"
789 set p4 "[format %04X [expr { int(rand() * 6536) }]]"
790 set p5 "[format %06X [expr { int(rand() * 16777216) }]][format %06X [expr { int(rand() * 16777216) }]]"
791 return "{$p1-$p2-$p3-$p4-$p5}"
792 } else {
793 set p1 "[format %04X [expr { int(rand() * 6536) }]]"
794 set p2 "[format %04X [expr { int(rand() * 6536) }]]"
795 set p3 "[format %04X [expr { int(rand() * 6536) }]]"
796 set p4 "[format %04X [expr { int(rand() * 6536) }]]"
797 set p5 "[format %04X [expr { int(rand() * 6536) }]]"
798 set p6 "[format %04X [expr { int(rand() * 6536) }]]"
799 return "$p1$p2$p3$p4$p5$p6"
800 }
801}
802
803# collect all include file that required for theModules in theOutDir
944d808c 804proc osutils:collectinc {theModules theIncPath} {
910970ab 805 global path
910970ab 806 set aCasRoot [file normalize $path]
807 set anIncPath [file normalize $theIncPath]
808
809 if {![file isdirectory $aCasRoot]} {
810 puts "OCCT directory is not defined correctly: $aCasRoot"
811 return
812 }
813
814 set anUsedToolKits {}
815 foreach aModule $theModules {
816 foreach aToolKit [${aModule}:toolkits] {
817 lappend anUsedToolKits $aToolKit
818
819 foreach aDependency [LibToLink $aToolKit] {
820 lappend anUsedToolKits $aDependency
821 }
822 }
823 foreach anExecutable [OS:executable ${aModule}] {
824 lappend anUsedToolKits $anExecutable
825
826 foreach aDependency [LibToLink $anExecutable] {
827 lappend anUsedToolKits $aDependency
828 }
829 }
830 }
5951a088 831 set anUsedToolKits [lsort -unique $anUsedToolKits]
910970ab 832
833 set anUnits {}
834 foreach anUsedToolKit $anUsedToolKits {
835 set anUnits [concat $anUnits [osutils:tk:units $anUsedToolKit]]
836 }
5951a088 837 set anUnits [lsort -unique $anUnits]
838
839 # define copying style
840 set aCopyType "copy"
841 if { [info exists ::env(SHORTCUT_HEADERS)] } {
842 if { [string equal -nocase $::env(SHORTCUT_HEADERS) "hard"]
843 || [string equal -nocase $::env(SHORTCUT_HEADERS) "hardlink"] } {
844 set aCopyType "hardlink"
845 } elseif { [string equal -nocase $::env(SHORTCUT_HEADERS) "true"]
846 || [string equal -nocase $::env(SHORTCUT_HEADERS) "shortcut"] } {
847 set aCopyType "shortcut"
848 }
849 }
910970ab 850
5da3dfdf 851 set allHeaderFiles {}
5951a088 852 if { $aCopyType == "shortcut" } {
910970ab 853 # template preparation
e31a8e52 854 if { ![file exists $::THE_CASROOT/adm/templates/header.in] } {
855 puts "template file does not exist: $::THE_CASROOT/adm/templates/header.in"
910970ab 856 return
857 }
e31a8e52 858 set aHeaderTmpl [wokUtils:FILES:FileToString $::THE_CASROOT/adm/templates/header.in]
910970ab 859
860 # relative anIncPath in connection with aCasRoot/src
861 set aFromBuildIncToSrcPath [relativePath "$anIncPath" "$aCasRoot/src"]
862
863 # create and copy short-cut header files
864 foreach anUnit $anUnits {
5da3dfdf 865 osutils:checksrcfiles ${anUnit}
866
867 set aHFiles [_get_used_files ${anUnit} true false]
868 foreach aHeaderFile ${aHFiles} {
869 set aHeaderFileName [lindex ${aHeaderFile} 1]
870 lappend allHeaderFiles "${aHeaderFileName}"
910970ab 871
ee5befae 872 regsub -all -- {@OCCT_HEADER_FILE_CONTENT@} $aHeaderTmpl "#include \"$aFromBuildIncToSrcPath/$anUnit/$aHeaderFileName\"" aShortCutHeaderFileContent
910970ab 873
874 if {[file exists "$theIncPath/$aHeaderFileName"] && [file readable "$theIncPath/$aHeaderFileName"]} {
875 set fp [open "$theIncPath/$aHeaderFileName" r]
876 set aHeaderContent [read $fp]
877 close $fp
878
879 # minus eof
880 set aHeaderLenght [expr [string length $aHeaderContent] - 1]
881
882 if {$aHeaderLenght == [string length $aShortCutHeaderFileContent]} {
883 # remove eof from string
884 set aHeaderContent [string range $aHeaderContent 0 [expr $aHeaderLenght - 1]]
885
886 if {[string compare $aShortCutHeaderFileContent $aHeaderContent] == 0} {
887 continue
888 }
889 }
5951a088 890 file delete -force "$theIncPath/$aHeaderFileName"
910970ab 891 }
892
893 set aShortCutHeaderFile [open "$theIncPath/$aHeaderFileName" "w"]
894 fconfigure $aShortCutHeaderFile -translation lf
895 puts $aShortCutHeaderFile $aShortCutHeaderFileContent
896 close $aShortCutHeaderFile
897 }
5951a088 898 }
910970ab 899 } else {
900 set nbcopied 0
901 foreach anUnit $anUnits {
5da3dfdf 902 osutils:checksrcfiles ${anUnit}
903
904 set aHFiles [_get_used_files ${anUnit} true false]
905 foreach aHeaderFile ${aHFiles} {
906 set aHeaderFileName [lindex ${aHeaderFile} 1]
907 lappend allHeaderFiles "${aHeaderFileName}"
910970ab 908
909 # copy file only if target does not exist or is older than original
0fdbd10b 910 set torig [file mtime $aCasRoot/src/$anUnit/$aHeaderFileName]
5951a088 911 set tcopy 0
912 if { [file isfile $anIncPath/$aHeaderFileName] } {
910970ab 913 set tcopy [file mtime $anIncPath/$aHeaderFileName]
914 }
915 if { $tcopy < $torig } {
916 incr nbcopied
5951a088 917 if { $aCopyType == "hardlink" } {
918 if { $tcopy != 0 } {
919 file delete -force "$theIncPath/$aHeaderFileName"
920 }
0fdbd10b 921 file link -hard $anIncPath/$aHeaderFileName $aCasRoot/src/$anUnit/$aHeaderFileName
5951a088 922 } else {
0fdbd10b 923 file copy -force $aCasRoot/src/$anUnit/$aHeaderFileName $anIncPath/$aHeaderFileName
5951a088 924 }
910970ab 925 } elseif { $tcopy != $torig } {
0fdbd10b 926 puts "Warning: file $anIncPath/$aHeaderFileName is newer than $aCasRoot/src/$anUnit/$aHeaderFileName, not changed!"
910970ab 927 }
928 }
929 }
930 puts "Info: $nbcopied files updated"
931 }
5da3dfdf 932
933 # remove header files not listed in FILES
934 set anIncFiles [glob -tails -nocomplain -dir ${anIncPath} "*"]
935 foreach anIncFile ${anIncFiles} {
936 if { [lsearch -exact ${allHeaderFiles} ${anIncFile}] == -1 } {
937 puts "Warning: file ${anIncPath}/${anIncFile} is not presented in the sources and will be removed from ${theIncPath}!"
938 file delete -force "${theIncPath}/${anIncFile}"
939 }
940 }
910970ab 941}
942
943# Generate header for VS solution file
944proc osutils:vcsolution:header { vcversion } {
945 if { "$vcversion" == "vc7" } {
946 append var \
947 "Microsoft Visual Studio Solution File, Format Version 8.00\n"
948 } elseif { "$vcversion" == "vc8" } {
949 append var \
950 "Microsoft Visual Studio Solution File, Format Version 9.00\n" \
951 "# Visual Studio 2005\n"
952 } elseif { "$vcversion" == "vc9" } {
953 append var \
954 "Microsoft Visual Studio Solution File, Format Version 10.00\n" \
955 "# Visual Studio 2008\n"
956 } elseif { "$vcversion" == "vc10" } {
957 append var \
958 "Microsoft Visual Studio Solution File, Format Version 11.00\n" \
959 "# Visual Studio 2010\n"
960 } elseif { "$vcversion" == "vc11" } {
961 append var \
962 "Microsoft Visual Studio Solution File, Format Version 12.00\n" \
963 "# Visual Studio 2012\n"
964 } elseif { "$vcversion" == "vc12" } {
965 append var \
d6cda17a 966 "Microsoft Visual Studio Solution File, Format Version 12.00\n" \
910970ab 967 "# Visual Studio 2013\n"
d6cda17a 968 } elseif { "$vcversion" == "vc14" || "$vcversion" == "vc141"} {
39bff09c 969 append var \
970 "Microsoft Visual Studio Solution File, Format Version 12.00\n" \
971 "# Visual Studio 14\n"
910970ab 972 } else {
973 puts stderr "Error: Visual Studio version $vcversion is not supported by this function!"
974 }
975 return $var
976}
977# Returns extension (without dot) for project files of given version of VC
978
979proc osutils:vcproj:ext { vcversion } {
980 if { "$vcversion" == "vc7" || "$vcversion" == "vc8" || "$vcversion" == "vc9" } {
981 return "vcproj"
910970ab 982 } else {
39bff09c 983 return "vcxproj"
910970ab 984 }
985}
986# Generate start of configuration section of VS solution file
987
988proc osutils:vcsolution:config:begin { vcversion } {
989 if { "$vcversion" == "vc7" } {
990 append var \
991 "Global\n" \
992 "\tGlobalSection(SolutionConfiguration) = preSolution\n" \
993 "\t\tDebug = Debug\n" \
994 "\t\tRelease = Release\n" \
995 "\tEndGlobalSection\n" \
996 "\tGlobalSection(ProjectConfiguration) = postSolution\n"
39bff09c 997 } else {
910970ab 998 append var \
999 "Global\n" \
1000 "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n" \
1001 "\t\tDebug|Win32 = Debug|Win32\n" \
1002 "\t\tRelease|Win32 = Release|Win32\n" \
1003 "\t\tDebug|x64 = Debug|x64\n" \
1004 "\t\tRelease|x64 = Release|x64\n" \
1005 "\tEndGlobalSection\n" \
1006 "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n"
910970ab 1007 }
1008 return $var
1009}
1010# Generate part of configuration section of VS solution file describing one project
1011
1012proc osutils:vcsolution:config:project { vcversion guid } {
1013 if { "$vcversion" == "vc7" } {
1014 append var \
1015 "\t\t$guid.Debug.ActiveCfg = Debug|Win32\n" \
1016 "\t\t$guid.Debug.Build.0 = Debug|Win32\n" \
1017 "\t\t$guid.Release.ActiveCfg = Release|Win32\n" \
1018 "\t\t$guid.Release.Build.0 = Release|Win32\n"
39bff09c 1019 } else {
910970ab 1020 append var \
1021 "\t\t$guid.Debug|Win32.ActiveCfg = Debug|Win32\n" \
1022 "\t\t$guid.Debug|Win32.Build.0 = Debug|Win32\n" \
1023 "\t\t$guid.Release|Win32.ActiveCfg = Release|Win32\n" \
1024 "\t\t$guid.Release|Win32.Build.0 = Release|Win32\n" \
1025 "\t\t$guid.Debug|x64.ActiveCfg = Debug|x64\n" \
1026 "\t\t$guid.Debug|x64.Build.0 = Debug|x64\n" \
1027 "\t\t$guid.Release|x64.ActiveCfg = Release|x64\n" \
1028 "\t\t$guid.Release|x64.Build.0 = Release|x64\n"
910970ab 1029 }
1030 return $var
1031}
1032# Generate start of configuration section of VS solution file
1033
1034proc osutils:vcsolution:config:end { vcversion } {
1035 if { "$vcversion" == "vc7" } {
1036 append var \
1037 "\tEndGlobalSection\n" \
1038 "\tGlobalSection(ExtensibilityGlobals) = postSolution\n" \
1039 "\tEndGlobalSection\n" \
1040 "\tGlobalSection(ExtensibilityAddIns) = postSolution\n" \
1041 "\tEndGlobalSection\n"
39bff09c 1042 } else {
910970ab 1043 append var \
1044 "\tEndGlobalSection\n" \
1045 "\tGlobalSection(SolutionProperties) = preSolution\n" \
1046 "\t\tHideSolutionNode = FALSE\n" \
1047 "\tEndGlobalSection\n"
910970ab 1048 }
1049 return $var
1050}
1051# generate Visual Studio solution file
1052# if module is empty, generates one solution for all known modules
1053
1054proc OS:vcsolution { theVcVer theSolName theModules theOutDir theGuidsMap } {
1055 global path
1056 upvar $theGuidsMap aGuidsMap
1057
1058 # collect list of projects to be created
1059 set aProjects {}
1060 set aDependencies {}
1061 foreach aModule $theModules {
1062 # toolkits
1063 foreach aToolKit [osutils:tk:sort [${aModule}:toolkits]] {
1064 lappend aProjects $aToolKit
1065 lappend aProjectsInModule($aModule) $aToolKit
1066 lappend aDependencies [LibToLink $aToolKit]
1067 }
1068 # executables, assume one project per cxx file...
1069 foreach aUnit [OS:executable ${aModule}] {
1070 set aUnitLoc $aUnit
1071 set src_files [_get_used_files $aUnit false]
1072 set aSrcFiles {}
1073 foreach s $src_files {
1074 regexp {source ([^\s]+)} $s dummy name
1075 lappend aSrcFiles $name
1076 }
1077 foreach aSrcFile $aSrcFiles {
1078 set aFileExtension [file extension $aSrcFile]
1079 if { $aFileExtension == ".cxx" } {
1080 set aPrjName [file rootname $aSrcFile]
1081 lappend aProjects $aPrjName
1082 lappend aProjectsInModule($aModule) $aPrjName
1083 if {[file isdirectory $path/src/$aUnitLoc]} {
1084 lappend aDependencies [LibToLinkX $aUnitLoc [file rootname $aSrcFile]]
1085 } else {
1086 lappend aDependencies {}
1087 }
1088 }
1089 }
1090 }
1091 }
1092
1093# generate GUIDs for projects (unless already known)
1094 foreach aProject $aProjects {
1095 if { ! [info exists aGuidsMap($aProject)] } {
1096 set aGuidsMap($aProject) [OS:genGUID]
1097 }
1098 }
1099
1100 # generate solution file
1101# puts "Generating Visual Studio ($theVcVer) solution file for $theSolName ($aProjects)"
1102 append aFileBuff [osutils:vcsolution:header $theVcVer]
1103
1104 # GUID identifying group projects in Visual Studio
1105 set VC_GROUP_GUID "{2150E333-8FDC-42A3-9474-1A3956D46DE8}"
1106
1107 # generate group projects -- one per module
1108 if { "$theVcVer" != "vc7" && [llength "$theModules"] > 1 } {
1109 foreach aModule $theModules {
1110 if { ! [info exists aGuidsMap(_$aModule)] } {
1111 set aGuidsMap(_$aModule) [OS:genGUID]
1112 }
1113 set aGuid $aGuidsMap(_$aModule)
1114 append aFileBuff "Project(\"${VC_GROUP_GUID}\") = \"$aModule\", \"$aModule\", \"$aGuid\"\nEndProject\n"
1115 }
1116 }
1117
1118 # extension of project files
1119 set aProjExt [osutils:vcproj:ext $theVcVer]
1120
1121 # GUID identifying C++ projects in Visual Studio
1122 set VC_CPP_GUID "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"
1123
1124 # generate normal projects
1125 set aProjsNb [llength $aProjects]
1126 for {set aProjId 0} {$aProjId < $aProjsNb} {incr aProjId} {
1127 set aProj [lindex $aProjects $aProjId]
1128 set aGuid $aGuidsMap($aProj)
1129 append aFileBuff "Project(\"${VC_CPP_GUID}\") = \"$aProj\", \"$aProj.${aProjExt}\", \"$aGuid\"\n"
1130 # write projects dependencies information (vc7 to vc9)
1131 set aDepGuids ""
1132 foreach aDepLib [lindex $aDependencies $aProjId] {
1133 if { $aDepLib != $aProj && [lsearch $aProjects $aDepLib] != "-1" } {
1134 set depGUID $aGuidsMap($aDepLib)
1135 append aDepGuids "\t\t$depGUID = $depGUID\n"
1136 }
1137 }
1138 if { "$aDepGuids" != "" } {
1139 append aFileBuff "\tProjectSection(ProjectDependencies) = postProject\n"
1140 append aFileBuff "$aDepGuids"
1141 append aFileBuff "\tEndProjectSection\n"
1142 }
1143 append aFileBuff "EndProject\n"
1144 }
1145
1146 # generate configuration section
1147 append aFileBuff [osutils:vcsolution:config:begin $theVcVer]
1148 foreach aProj $aProjects {
1149 append aFileBuff [osutils:vcsolution:config:project $theVcVer $aGuidsMap($aProj)]
1150 }
1151 append aFileBuff [osutils:vcsolution:config:end $theVcVer]
1152
1153 # write information of grouping of projects by module
1154 if { "$theVcVer" != "vc7" && [llength "$theModules"] > 1 } {
1155 append aFileBuff " GlobalSection(NestedProjects) = preSolution\n"
1156 foreach aModule $theModules {
1157 if { ! [info exists aProjectsInModule($aModule)] } { continue }
1158 foreach aProject $aProjectsInModule($aModule) {
1159 append aFileBuff " $aGuidsMap($aProject) = $aGuidsMap(_$aModule)\n"
1160 }
1161 }
1162 append aFileBuff " EndGlobalSection\n"
1163 }
1164
1165 # final word (footer)
1166 append aFileBuff "EndGlobal"
1167
1168 # write solution
1169 set aFile [open [set fdsw [file join $theOutDir ${theSolName}.sln]] w]
1170 fconfigure $aFile -translation crlf
1171 puts $aFile $aFileBuff
1172 close $aFile
1173 return [file join $theOutDir ${theSolName}.sln]
1174}
1175# Generate Visual Studio projects for specified version
1176
d6cda17a 1177proc OS:vcproj { theVcVer isUWP theModules theOutDir theGuidsMap } {
910970ab 1178 upvar $theGuidsMap aGuidsMap
1179
1180 set aProjectFiles {}
1181
1182 foreach aModule $theModules {
1183 foreach aToolKit [${aModule}:toolkits] {
d6cda17a 1184 lappend aProjectFiles [osutils:vcproj $theVcVer $isUWP $theOutDir $aToolKit aGuidsMap]
910970ab 1185 }
1186 foreach anExecutable [OS:executable ${aModule}] {
d6cda17a 1187 lappend aProjectFiles [osutils:vcprojx $theVcVer $isUWP $theOutDir $anExecutable aGuidsMap]
910970ab 1188 }
1189 }
1190 return $aProjectFiles
1191}
1192# generate template name and load it for given version of Visual Studio and platform
1193
d6cda17a 1194proc osutils:vcproj:readtemplate {theVcVer isUWP isExec} {
39bff09c 1195 set anExt $theVcVer
1196 if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } {
1197 set anExt vc10
1198 }
1199
d6cda17a 1200 # determine versions of runtime and toolset
1201 set aVCRTVer $theVcVer
1202 set aToolset "v[string range $theVcVer 2 3]0"
1203 if { $theVcVer == "vc141" } {
1204 set aVCRTVer "vc14"
1205 set aToolset "v141"
1206 }
1207
39bff09c 1208 set what "$theVcVer"
39bff09c 1209 set aCmpl32 ""
1210 set aCmpl64 ""
ad03c234 1211 set aCharSet "Unicode"
d6cda17a 1212 if { $isExec } {
39bff09c 1213 set anExt "${anExt}x"
910970ab 1214 set what "$what executable"
1215 }
39bff09c 1216 if { "$theVcVer" == "vc10" } {
1217 # SSE2 is enabled by default in vc11+, but not in vc10 for 32-bit target
7fbac3c2 1218 set aCmpl32 "<EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>"
39bff09c 1219 }
1220 set aTmpl [osutils:readtemplate $anExt "MS VC++ project ($what)"]
7fbac3c2 1221
d6cda17a 1222 if { $isUWP } {
7fbac3c2 1223 set UwpWinRt "<CompileAsWinRT>false</CompileAsWinRT>"
1224 foreach bitness {32 64} {
1225 set indent ""
1226 if {"[set aCmpl${bitness}]" != ""} {
1227 set indent "\n "
1228 }
1229 set aCmpl${bitness} "[set aCmpl${bitness}]${indent}${UwpWinRt}"
1230 }
7fbac3c2 1231 }
1232
26cfd29c 1233 set format_template "\[\\r\\n\\s\]*"
7fbac3c2 1234 foreach bitness {32 64} {
26cfd29c 1235 set format_templateloc ""
7fbac3c2 1236 if {"[set aCmpl${bitness}]" == ""} {
26cfd29c 1237 set format_templateloc "$format_template"
7fbac3c2 1238 }
26cfd29c 1239 regsub -all -- "${format_templateloc}__VCMPL${bitness}__" $aTmpl "[set aCmpl${bitness}]" aTmpl
1240 }
1241
1242 set aDebugInfo "no"
1243 set aReleaseLnk ""
1244 if { "$::HAVE_RelWithDebInfo" == "true" } {
1245 set aDebugInfo "true"
1246 set aReleaseLnk "\n <OptimizeReferences>true</OptimizeReferences>\n <EnableCOMDATFolding>true</EnableCOMDATFolding>"
7fbac3c2 1247 }
1248
d6cda17a 1249 regsub -all -- {__VCVER__} $aTmpl $aVCRTVer aTmpl
1250 regsub -all -- {__VCVEREXT__} $aTmpl $aToolset aTmpl
7fbac3c2 1251 regsub -all -- {__VCCHARSET__} $aTmpl $aCharSet aTmpl
26cfd29c 1252 regsub -all -- {__VCReleasePDB__} $aTmpl $aDebugInfo aTmpl
1253 regsub -all -- "${format_template}__VCLNKREL__" $aTmpl "${aReleaseLnk}" aTmpl
1254
39bff09c 1255 return $aTmpl
910970ab 1256}
1257
1258proc osutils:readtemplate {ext what} {
e31a8e52 1259 set loc "$::THE_CASROOT/adm/templates/template.$ext"
910970ab 1260 return [wokUtils:FILES:FileToString $loc]
1261}
1262# Read a file in a string as is.
1263
1264proc wokUtils:FILES:FileToString { fin } {
1265 if { [catch { set in [ open $fin r ] } errin] == 0 } {
1266 set strin [read $in [file size $fin]]
1267 close $in
1268 return $strin
1269 } else {
1270 return {}
1271 }
1272}
910970ab 1273
944d808c 1274# List extensions of compilable files in OCCT
1275proc osutils:compilable {thePlatform} {
cf4bee7c 1276 if { "$thePlatform" == "mac" || "$thePlatform" == "ios" } { return [list .c .cxx .cpp .mm] }
910970ab 1277 return [list .c .cxx .cpp]
1278}
1279
cf4bee7c 1280# List extensions of header file in OCCT
1281proc osutils:fileExtensionsHeaders {thePlatform} {
1282 if { "$thePlatform" == "mac" || "$thePlatform" == "ios" } { return [list .h .hxx .hpp .lxx .pxx .gxx ] }
1283 return [list .h .hxx .hpp .lxx .pxx .gxx .mm ]
1284}
1285
910970ab 1286proc osutils:commonUsedTK { theToolKit } {
910970ab 1287 set anUsedToolKits [list]
1288 set aDepToolkits [LibToLink $theToolKit]
1289 foreach tkx $aDepToolkits {
1290 if {[_get_type $tkx] == "t"} {
1291 lappend anUsedToolKits "${tkx}"
1292 }
1293 }
1294 return $anUsedToolKits
1295}
910970ab 1296
c7d774c5 1297# Return the list of name *CSF_ in a EXTERNLIB description of a toolkit
1298proc osutils:tk:csfInExternlib { EXTERNLIB } {
910970ab 1299 set l [wokUtils:FILES:FileToList $EXTERNLIB]
1300 set lret {STLPort}
1301 foreach str $l {
1302 if [regexp -- {(CSF_[^ ]*)} $str csf] {
1303 lappend lret $csf
1304 }
1305 }
1306 return $lret
1307}
1308
7c65581d 1309# Collect dependencies map depending on target OS (libraries for CSF_ codenames used in EXTERNLIB) .
1310# @param theOS - target OS
c7d774c5 1311# @param theCsfLibsMap - libraries map
1312# @param theCsfFrmsMap - frameworks map, OS X specific
1313proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap } {
1314 upvar $theCsfLibsMap aLibsMap
1315 upvar $theCsfFrmsMap aFrmsMap
910970ab 1316
c7d774c5 1317 unset theCsfLibsMap
1318 unset theCsfFrmsMap
910970ab 1319
7c65581d 1320 set aLibsMap(CSF_FREETYPE) "freetype"
1321 set aLibsMap(CSF_TclLibs) "tcl8.6"
1322 set aLibsMap(CSF_TclTkLibs) "tk8.6"
1323 if { "$::HAVE_FREEIMAGE" == "true" } {
1324 if { "$theOS" == "wnt" } {
60273f77 1325 set aLibsMap(CSF_FreeImagePlus) "FreeImage"
7c65581d 1326 } else {
1327 set aLibsMap(CSF_FreeImagePlus) "freeimage"
1328 }
a975e06e 1329 } elseif { "$theOS" == "wnt" } {
1330 set aLibsMap(CSF_FreeImagePlus) "windowscodecs"
7c65581d 1331 }
e22105a9 1332 if { "$::HAVE_FFMPEG" == "true" } {
1333 set aLibsMap(CSF_FFmpeg) "avcodec avformat swscale avutil"
1334 }
7c65581d 1335 if { "$::HAVE_TBB" == "true" } {
1336 set aLibsMap(CSF_TBB) "tbb tbbmalloc"
1337 }
1338 if { "$::HAVE_VTK" == "true" } {
1339 if { "$theOS" == "wnt" } {
1340 set aLibsMap(CSF_VTK) [osutils:vtkCsf "wnt"]
1341 } else {
1342 set aLibsMap(CSF_VTK) [osutils:vtkCsf "unix"]
1343 }
1344 }
e22105a9 1345 if { "$::HAVE_ZLIB" == "true" } {
1346 set aLibsMap(CSF_ZLIB) "zlib"
1347 }
1348 if { "$::HAVE_LIBLZMA" == "true" } {
1349 set aLibsMap(CSF_LIBLZMA) "liblzma"
1350 }
7c65581d 1351
910970ab 1352 if { "$theOS" == "wnt" } {
c7d774c5 1353 # WinAPI libraries
7c65581d 1354 set aLibsMap(CSF_kernel32) "kernel32"
1355 set aLibsMap(CSF_advapi32) "advapi32"
1356 set aLibsMap(CSF_gdi32) "gdi32"
1357 set aLibsMap(CSF_user32) "user32 comdlg32"
f4d20b00 1358 set aLibsMap(CSF_shell32) "shell32"
7c65581d 1359 set aLibsMap(CSF_opengl32) "opengl32"
1360 set aLibsMap(CSF_wsock32) "wsock32"
1361 set aLibsMap(CSF_netapi32) "netapi32"
98e6c6d1 1362 set aLibsMap(CSF_winmm) "winmm"
7c65581d 1363 set aLibsMap(CSF_OpenGlLibs) "opengl32"
1ce0716b 1364 if { "$::HAVE_GLES2" == "true" } {
1365 set aLibsMap(CSF_OpenGlLibs) "libEGL libGLESv2"
1366 }
7c65581d 1367 set aLibsMap(CSF_psapi) "Psapi"
1368 set aLibsMap(CSF_d3d9) "d3d9"
1369
1370 # the naming is different on Windows
1371 set aLibsMap(CSF_TclLibs) "tcl86"
1372 set aLibsMap(CSF_TclTkLibs) "tk86"
1373
1374 set aLibsMap(CSF_QT) "QtCore4 QtGui4"
1375
1376 # tbb headers define different pragma lib depending on debug/release
1377 set aLibsMap(CSF_TBB) ""
910970ab 1378 } else {
41f97958 1379 set aLibsMap(CSF_dl) "dl"
48ba1811 1380 if { "$theOS" == "mac" || "$theOS" == "ios" } {
c7d774c5 1381 set aLibsMap(CSF_objc) "objc"
48ba1811 1382 if { "$theOS" == "ios" } {
1383 set aFrmsMap(CSF_Appkit) "UIKit"
1384 set aFrmsMap(CSF_OpenGlLibs) "OpenGLES"
1385 } else {
1386 set aFrmsMap(CSF_Appkit) "AppKit"
1387 set aFrmsMap(CSF_OpenGlLibs) "OpenGL"
1388 }
c7d774c5 1389 set aFrmsMap(CSF_IOKit) "IOKit"
c7d774c5 1390 set aFrmsMap(CSF_TclLibs) "Tcl"
7c65581d 1391 set aLibsMap(CSF_TclLibs) ""
c7d774c5 1392 set aFrmsMap(CSF_TclTkLibs) "Tk"
7c65581d 1393 set aLibsMap(CSF_TclTkLibs) ""
14bbbdcb 1394 set aLibsMap(CSF_QT) "QtCore QtGui"
c7d774c5 1395 } else {
c9983ee8 1396 set aLibsMap(CSF_fontconfig) "fontconfig"
d8d01f6e 1397 if { "$theOS" == "qnx" } {
7c65581d 1398 # CSF_ThreadLibs - pthread API is part of libc on QNX
d8d01f6e 1399 set aLibsMap(CSF_OpenGlLibs) "EGL GLESv2"
d8d01f6e 1400 } else {
1401 set aLibsMap(CSF_ThreadLibs) "pthread rt"
1402 set aLibsMap(CSF_OpenGlLibs) "GL"
d8d01f6e 1403 set aLibsMap(CSF_TclTkLibs) "X11 tk8.6"
1404 set aLibsMap(CSF_XwLibs) "X11 Xext Xmu Xi"
1405 set aLibsMap(CSF_MotifLibs) "X11"
1406 }
1ce0716b 1407
1408 if { "$::HAVE_GLES2" == "true" } {
1409 set aLibsMap(CSF_OpenGlLibs) "EGL GLESv2"
1410 }
910970ab 1411 }
910970ab 1412 }
1413}
1414
1c29294e 1415# Returns string of library dependencies for generation of Visual Studio project or make lists.
1416proc osutils:vtkCsf {{theOS ""}} {
1417 set aVtkVer "6.1"
1418
1c29294e 1419 set aPathSplitter ":"
1c29294e 1420 if {"$theOS" == "wnt"} {
1421 set aPathSplitter ";"
1c29294e 1422 }
1423
1424 set anOptIncs [split $::env(CSF_OPT_INC) "$aPathSplitter"]
1425 foreach anIncItem $anOptIncs {
1426 if {[regexp -- "vtk-(.*)$" [file tail $anIncItem] dummy aFoundVtkVer]} {
1427 set aVtkVer $aFoundVtkVer
1428 }
1429 }
1430
1431 set aLibArray [list vtkCommonCore vtkCommonDataModel vtkCommonExecutionModel vtkCommonMath vtkCommonTransforms vtkRenderingCore \
1432 vtkRenderingOpenGL vtkFiltersGeneral vtkIOCore vtkIOImage vtkImagingCore vtkInteractionStyle]
1433
1434 # Additional suffices for the libraries
1435 set anIdx 0
1436 foreach anItem $aLibArray {
7c65581d 1437 lset aLibArray $anIdx $anItem-$aVtkVer
1c29294e 1438 incr anIdx
1439 }
1440
1441 return [join $aLibArray " "]
1442}
1443
c7d774c5 1444# @param theLibsList - dependencies (libraries list)
1445# @param theFrameworks - dependencies (frameworks list, OS X specific)
1446proc osutils:usedOsLibs { theToolKit theOS theLibsList theFrameworks } {
910970ab 1447 global path
c7d774c5 1448 upvar $theLibsList aLibsList
1449 upvar $theFrameworks aFrameworks
1450 set aLibsList [list]
1451 set aFrameworks [list]
910970ab 1452
c7d774c5 1453 osutils:csfList $theOS aLibsMap aFrmsMap
910970ab 1454
c7d774c5 1455 foreach aCsfElem [osutils:tk:csfInExternlib "$path/src/${theToolKit}/EXTERNLIB"] {
1456 if [info exists aLibsMap($aCsfElem)] {
1457 foreach aLib [split "$aLibsMap($aCsfElem)"] {
1458 if { [lsearch $aLibsList $aLib] == "-1" } {
1459 lappend aLibsList $aLib
1460 }
1461 }
910970ab 1462 }
c7d774c5 1463 if [info exists aFrmsMap($aCsfElem)] {
1464 foreach aFrm [split "$aFrmsMap($aCsfElem)"] {
1465 if { [lsearch $aFrameworks $aFrm] == "-1" } {
1466 lappend aFrameworks $aFrm
1467 }
910970ab 1468 }
1469 }
1470 }
910970ab 1471}
1472
1473# Returns liste of UD in a toolkit. tkloc is a full path wok.
1474proc osutils:tk:units { tkloc } {
1475 global path
1476 set l {}
1477 set PACKAGES "$path/src/$tkloc/PACKAGES"
1478 foreach u [wokUtils:FILES:FileToList $PACKAGES] {
1479 if {[file isdirectory "$path/src/$u"]} {
1480 lappend l $u
1481 }
1482 }
1483 if { $l == {} } {
1484 ;#puts stderr "Warning. No devunit included in $tkloc"
1485 }
1486 return $l
1487}
1488
1489proc osutils:justwnt { listloc } {
cf4bee7c 1490 set goaway [list Xw]
910970ab 1491 return [osutils:juststation $goaway $listloc]
1492}
1493
1494# remove from listloc OpenCascade units indesirables on NT
1495proc osutils:juststation {goaway listloc} {
1496 global path
1497 set lret {}
1498 foreach u $listloc {
1499 if {([file isdirectory "$path/src/$u"] && [lsearch $goaway $u] == -1 )
1500 || (![file isdirectory "$path/src/$u"] && [lsearch $goaway $u] == -1 ) } {
1501 lappend lret $u
1502 }
1503 }
1504 return $lret
1505}
1506
1507# intersect3 - perform the intersecting of two lists, returning a list containing three lists.
1508# The first list is everything in the first list that wasn't in the second,
1509# the second list contains the intersection of the two lists, the third list contains everything
1510# in the second list that wasn't in the first.
1511proc osutils:intersect3 {list1 list2} {
1512 set la1(0) {} ; unset la1(0)
1513 set lai(0) {} ; unset lai(0)
1514 set la2(0) {} ; unset la2(0)
1515 foreach v $list1 {
1516 set la1($v) {}
1517 }
1518 foreach v $list2 {
1519 set la2($v) {}
1520 }
1521 foreach elem [concat $list1 $list2] {
1522 if {[info exists la1($elem)] && [info exists la2($elem)]} {
1523 unset la1($elem)
1524 unset la2($elem)
1525 set lai($elem) {}
1526 }
1527 }
1528 list [lsort [array names la1]] [lsort [array names lai]] [lsort [array names la2]]
1529}
1530
1531# Prepare relative path
1532proc relativePath {thePathFrom thePathTo} {
1533 if { [file isdirectory "$thePathFrom"] == 0 } {
1534 return ""
1535 }
1536
1537 set aPathFrom [file normalize "$thePathFrom"]
1538 set aPathTo [file normalize "$thePathTo"]
1539
1540 set aCutedPathFrom "${aPathFrom}/dummy"
1541 set aRelatedDeepPath ""
1542
1543 while { "$aCutedPathFrom" != [file normalize "$aCutedPathFrom/.."] } {
1544 set aCutedPathFrom [file normalize "$aCutedPathFrom/.."]
1545 # does aPathTo contain aCutedPathFrom?
1546 regsub -all $aCutedPathFrom $aPathTo "" aPathFromAfterCut
1547 if { "$aPathFromAfterCut" != "$aPathTo" } { # if so
1548 if { "$aCutedPathFrom" == "$aPathFrom" } { # just go higher, for example, ./somefolder/someotherfolder
1549 set aPathTo ".${aPathTo}"
1550 } elseif { "$aCutedPathFrom" == "$aPathTo" } { # remove the last "/"
1551 set aRelatedDeepPath [string replace $aRelatedDeepPath end end ""]
1552 }
1553 regsub -all $aCutedPathFrom $aPathTo $aRelatedDeepPath aPathToAfterCut
1554 regsub -all "//" $aPathToAfterCut "/" aPathToAfterCut
1555 return $aPathToAfterCut
1556 }
1557 set aRelatedDeepPath "$aRelatedDeepPath../"
1558
1559 }
1560
1561 return $thePathTo
1562}
1563
1564proc wokUtils:EASY:bs1 { s } {
1565 regsub -all {/} $s {\\} r
1566 return $r
1567}
1568
1569# Returs for a full path the liste of n last directory part
1570# n = 1 => tail
1571# n = 2 => dir/file.c
1572# n = 3 => sdir/dir/file.c
1573# etc..
1574proc wokUtils:FILES:wtail { f n } {
1575 set ll [expr [llength [set lif [file split $f]]] -$n]
1576 return [join [lrange $lif $ll end] /]
1577}
1578
1579# Generate entry for one source file in Visual Studio 10 project file
cf4bee7c 1580proc osutils:vcxproj:cxxfile { theFile theParams } {
1581 if { $theParams == "" } {
1582 return " <ClCompile Include=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $theFile 3]]\" />\n"
910970ab 1583 }
1584
cf4bee7c 1585 set aParams [string trim ${theParams}]
1586 append text " <ClCompile Include=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $theFile 3]]\">\n"
1587 append text " <AdditionalOptions Condition=\"\'\$(Configuration)|\$(Platform)\'==\'Debug|Win32\'\">${aParams} %(AdditionalOptions)</AdditionalOptions>\n"
1588 append text " <AdditionalOptions Condition=\"\'\$(Configuration)|\$(Platform)\'==\'Release|Win32\'\">${aParams} %(AdditionalOptions)</AdditionalOptions>\n"
1589 append text " <AdditionalOptions Condition=\"\'\$(Configuration)|\$(Platform)\'==\'Debug|x64\'\">${aParams} %(AdditionalOptions)</AdditionalOptions>\n"
1590 append text " <AdditionalOptions Condition=\"\'\$(Configuration)|\$(Platform)\'==\'Release|x64\'\">${aParams} %(AdditionalOptions)</AdditionalOptions>\n"
910970ab 1591 append text " </ClCompile>\n"
1592 return $text
1593}
1594
cf4bee7c 1595# Generate entry for one header file in Visual Studio 10 project file
1596proc osutils:vcxproj:hxxfile { theFile } { return " <ClInclude Include=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $theFile 3]]\" />\n" }
1597
910970ab 1598# Generate Visual Studio 2010 project filters file
cf4bee7c 1599proc osutils:vcxproj:filters { dir proj theCxxFilesMap theHxxFilesMap } {
1600 upvar $theCxxFilesMap aCxxFilesMap
1601 upvar $theHxxFilesMap aHxxFilesMap
910970ab 1602
1603 # header
1604 append text "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
1605 append text "<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n"
1606
1607 # list of "filters" (units)
1608 append text " <ItemGroup>\n"
1609 append text " <Filter Include=\"Source files\">\n"
1610 append text " <UniqueIdentifier>[OS:genGUID]</UniqueIdentifier>\n"
1611 append text " </Filter>\n"
cf4bee7c 1612 append text " <Filter Include=\"Header files\">\n"
1613 append text " <UniqueIdentifier>[OS:genGUID]</UniqueIdentifier>\n"
1614 append text " </Filter>\n"
1615 foreach unit $aCxxFilesMap(units) {
910970ab 1616 append text " <Filter Include=\"Source files\\${unit}\">\n"
1617 append text " <UniqueIdentifier>[OS:genGUID]</UniqueIdentifier>\n"
1618 append text " </Filter>\n"
1619 }
cf4bee7c 1620 foreach unit $aHxxFilesMap(units) {
1621 append text " <Filter Include=\"Header files\\${unit}\">\n"
1622 append text " <UniqueIdentifier>[OS:genGUID]</UniqueIdentifier>\n"
1623 append text " </Filter>\n"
1624 }
910970ab 1625 append text " </ItemGroup>\n"
1626
cf4bee7c 1627 # list of cxx files
910970ab 1628 append text " <ItemGroup>\n"
cf4bee7c 1629 foreach unit $aCxxFilesMap(units) {
1630 foreach file $aCxxFilesMap($unit) {
910970ab 1631 append text " <ClCompile Include=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $file 3]]\">\n"
1632 append text " <Filter>Source files\\${unit}</Filter>\n"
1633 append text " </ClCompile>\n"
1634 }
1635 }
1636 append text " </ItemGroup>\n"
1637
cf4bee7c 1638 # list of hxx files
910970ab 1639 append text " <ItemGroup>\n"
cf4bee7c 1640 foreach unit $aHxxFilesMap(units) {
1641 foreach file $aHxxFilesMap($unit) {
1642 append text " <ClInclude Include=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $file 3]]\">\n"
1643 append text " <Filter>Header files\\${unit}</Filter>\n"
1644 append text " </ClInclude>\n"
910970ab 1645 }
1646 }
1647 append text " </ItemGroup>\n"
1648
1649 append text " <ItemGroup>\n"
cf4bee7c 1650 append text " <ResourceCompile Include=\"${proj}.rc\" />\n"
910970ab 1651 append text " </ItemGroup>\n"
1652
1653 # end
1654 append text "</Project>"
1655
1656 # write file
1657 set fp [open [set fvcproj [file join $dir ${proj}.vcxproj.filters]] w]
1658 fconfigure $fp -translation crlf
1659 puts $fp $text
1660 close $fp
1661
1662 return ${proj}.vcxproj.filters
1663}
1664
1665# Generate RC file content for ToolKit from template
1666proc osutils:readtemplate:rc {theOutDir theToolKit} {
e31a8e52 1667 set aLoc "$::THE_CASROOT/adm/templates/template_dll.rc"
910970ab 1668 set aBody [wokUtils:FILES:FileToString $aLoc]
1669 regsub -all -- {__TKNAM__} $aBody $theToolKit aBody
1670
1671 set aFile [open "${theOutDir}/${theToolKit}.rc" "w"]
1672 fconfigure $aFile -translation lf
1673 puts $aFile $aBody
1674 close $aFile
1675 return "${theOutDir}/${theToolKit}.rc"
1676}
1677
1678# Generate Visual Studio project file for ToolKit
d6cda17a 1679proc osutils:vcproj { theVcVer isUWP theOutDir theToolKit theGuidsMap } {
1680 set theProjTmpl [osutils:vcproj:readtemplate $theVcVer $isUWP 0]
910970ab 1681
944d808c 1682 set l_compilable [osutils:compilable wnt]
910970ab 1683 regsub -all -- {__TKNAM__} $theProjTmpl $theToolKit theProjTmpl
1684
1685 upvar $theGuidsMap aGuidsMap
1686 if { ! [info exists aGuidsMap($theToolKit)] } {
1687 set aGuidsMap($theToolKit) [OS:genGUID]
1688 }
1689 regsub -all -- {__PROJECT_GUID__} $theProjTmpl $aGuidsMap($theToolKit) theProjTmpl
1690
d6cda17a 1691 set theProjTmpl [osutils:uwp:proj $isUWP ${theProjTmpl}]
7fbac3c2 1692
7c65581d 1693 set aUsedLibs [list]
7fbac3c2 1694
d6cda17a 1695 if { $isUWP } {
7fbac3c2 1696 lappend aUsedLibs "WindowsApp.lib"
1697 }
1698
910970ab 1699 foreach tkx [osutils:commonUsedTK $theToolKit] {
7c65581d 1700 lappend aUsedLibs "${tkx}.lib"
910970ab 1701 }
1702
c7d774c5 1703 osutils:usedOsLibs $theToolKit "wnt" aLibs aFrameworks
7c65581d 1704 foreach aLibIter $aLibs {
1705 lappend aUsedLibs "${aLibIter}.lib"
1706 }
910970ab 1707
1708 # correct names of referred third-party libraries that are named with suffix
1709 # depending on VC version
d6cda17a 1710 set aVCRTVer [string range $theVcVer 0 3]
1711 regsub -all -- {vc[0-9]+} $aUsedLibs $aVCRTVer aUsedLibs
910970ab 1712
1713 # and put this list to project file
7c65581d 1714 #puts "$theToolKit requires $aUsedLibs"
39bff09c 1715 if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } {
7c65581d 1716 set aUsedLibs [join $aUsedLibs {;}]
910970ab 1717 }
7c65581d 1718 regsub -all -- {__TKDEP__} $theProjTmpl $aUsedLibs theProjTmpl
910970ab 1719
1720 set anIncPaths "..\\..\\..\\inc"
68df8478 1721# set aTKDefines ""
910970ab 1722 set aFilesSection ""
cf4bee7c 1723 set aVcFilesCxx(units) ""
1724 set aVcFilesHxx(units) ""
910970ab 1725 set listloc [osutils:tk:units $theToolKit]
910970ab 1726 if [array exists written] { unset written }
1727 #puts "\t1 [wokparam -v %CMPLRS_CXX_Options [w_info -f]] father"
1728 #puts "\t2 [wokparam -v %CMPLRS_CXX_Options] branch"
1729 #puts "\t1 [wokparam -v %CMPLRS_C_Options [w_info -f]] father"
1730 #puts "\t2 [wokparam -v %CMPLRS_C_Options] branch"
1731 set fxloparamfcxx [lindex [osutils:intersect3 [_get_options wnt cmplrs_cxx f] [_get_options wnt cmplrs_cxx b]] 2]
1732 set fxloparamfc [lindex [osutils:intersect3 [_get_options wnt cmplrs_c f] [_get_options wnt cmplrs_c b]] 2]
1733 set fxloparam ""
cf4bee7c 1734 foreach fxlo $listloc {
910970ab 1735 set xlo $fxlo
cf4bee7c 1736 set aSrcFiles [osutils:tk:cxxfiles $xlo wnt]
1737 set aHxxFiles [osutils:tk:hxxfiles $xlo wnt]
910970ab 1738 set fxlo_cmplrs_options_cxx [_get_options wnt cmplrs_cxx $fxlo]
1739 if {$fxlo_cmplrs_options_cxx == ""} {
1740 set fxlo_cmplrs_options_cxx [_get_options wnt cmplrs_cxx b]
1741 }
1742 set fxlo_cmplrs_options_c [_get_options wnt cmplrs_c $fxlo]
1743 if {$fxlo_cmplrs_options_c == ""} {
1744 set fxlo_cmplrs_options_c [_get_options wnt cmplrs_c b]
1745 }
1746 set fxloparam "$fxloparam [lindex [osutils:intersect3 [_get_options wnt cmplrs_cxx b] $fxlo_cmplrs_options_cxx] 2]"
1747 set fxloparam "$fxloparam [lindex [osutils:intersect3 [_get_options wnt cmplrs_c b] $fxlo_cmplrs_options_c] 2]"
1748 #puts "\t3 [wokparam -v %CMPLRS_CXX_Options] branch CXX "
1749 #puts "\t4 [wokparam -v %CMPLRS_CXX_Options $fxlo] $fxlo CXX"
1750 #puts "\t5 [wokparam -v %CMPLRS_C_Options] branch C"
1751 #puts "\t6 [wokparam -v %CMPLRS_C_Options $fxlo] $fxlo C"
1752 set needparam ""
1753 foreach partopt $fxloparam {
1754 if {[string first "-I" $partopt] == "0"} {
1755 # this is an additional includes search path
1756 continue
1757 }
1758 set needparam "$needparam $partopt"
1759 }
1760
39bff09c 1761 # Format of projects in vc10+ is different from vc7-9
1762 if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } {
910970ab 1763 foreach aSrcFile [lsort $aSrcFiles] {
1764 if { ![info exists written([file tail $aSrcFile])] } {
1765 set written([file tail $aSrcFile]) 1
cf4bee7c 1766 append aFilesSection [osutils:vcxproj:cxxfile $aSrcFile $needparam]
910970ab 1767 } else {
1768 puts "Warning : in vcproj more than one occurences for [file tail $aSrcFile]"
1769 }
cf4bee7c 1770 if { ! [info exists aVcFilesCxx($xlo)] } { lappend aVcFilesCxx(units) $xlo }
1771 lappend aVcFilesCxx($xlo) $aSrcFile
1772 }
1773 foreach aHxxFile [lsort $aHxxFiles] {
1774 if { ![info exists written([file tail $aHxxFile])] } {
1775 set written([file tail $aHxxFile]) 1
1776 append aFilesSection [osutils:vcxproj:hxxfile $aHxxFile]
1777 } else {
1778 puts "Warning : in vcproj more than one occurences for [file tail $aHxxFile]"
1779 }
1780 if { ! [info exists aVcFilesHxx($xlo)] } { lappend aVcFilesHxx(units) $xlo }
1781 lappend aVcFilesHxx($xlo) $aHxxFile
910970ab 1782 }
1783 } else {
1784 append aFilesSection "\t\t\t<Filter\n"
1785 append aFilesSection "\t\t\t\tName=\"${xlo}\"\n"
1786 append aFilesSection "\t\t\t\t>\n"
1787 foreach aSrcFile [lsort $aSrcFiles] {
1788 if { ![info exists written([file tail $aSrcFile])] } {
1789 set written([file tail $aSrcFile]) 1
1790 append aFilesSection [osutils:vcproj:file $theVcVer $aSrcFile $needparam]
1791 } else {
1792 puts "Warning : in vcproj more than one occurences for [file tail $aSrcFile]"
1793 }
1794 }
1795 append aFilesSection "\t\t\t</Filter>\n"
1796 }
910970ab 1797 }
1798
1799 regsub -all -- {__TKINC__} $theProjTmpl $anIncPaths theProjTmpl
910970ab 1800 regsub -all -- {__FILES__} $theProjTmpl $aFilesSection theProjTmpl
1801
1802 # write file
1803 set aFile [open [set aVcFiles [file join $theOutDir ${theToolKit}.[osutils:vcproj:ext $theVcVer]]] w]
1804 fconfigure $aFile -translation crlf
1805 puts $aFile $theProjTmpl
1806 close $aFile
1807
39bff09c 1808 # write filters file for vc10+
cf4bee7c 1809 if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } {
1810 lappend aVcFiles [osutils:vcxproj:filters $theOutDir $theToolKit aVcFilesCxx aVcFilesHxx]
910970ab 1811 }
1812
1813 # write resource file
1814 lappend aVcFiles [osutils:readtemplate:rc $theOutDir $theToolKit]
1815
1816 return $aVcFiles
1817}
1818
1819# for a unit returns a map containing all its file in the current
1820# workbench
1821# local = 1 only local files
1822proc osutils:tk:loadunit { loc map } {
1823 #puts $loc
1824 upvar $map TLOC
1825 catch { unset TLOC }
1826 set lfiles [_get_used_files $loc]
1827 foreach f $lfiles {
1828 #puts "\t$f"
1829 set t [lindex $f 0]
1830 set p [lindex $f 2]
1831 if [info exists TLOC($t)] {
1832 set l $TLOC($t)
1833 lappend l $p
1834 set TLOC($t) $l
1835 } else {
1836 set TLOC($t) $p
1837 }
1838 }
1839 return
1840}
1841
cf4bee7c 1842# Returns the list of all files name in a toolkit within specified list of file extensions.
1843proc osutils:tk:files { tkloc theExtensions } {
910970ab 1844 set Tfiles(source,nocdlpack) {source pubinclude}
1845 set Tfiles(source,toolkit) {}
1846 set Tfiles(source,executable) {source pubinclude}
1847 set listloc [concat [osutils:tk:units $tkloc] $tkloc]
1848 #puts " listloc = $listloc"
944d808c 1849
944d808c 1850 set resultloc $listloc
910970ab 1851 set lret {}
1852 foreach loc $resultloc {
1853 set utyp [_get_type $loc]
1854 #puts "\"$utyp\" \"$loc\""
1855 switch $utyp {
1856 "t" { set utyp "toolkit" }
1857 "n" { set utyp "nocdlpack" }
1858 "x" { set utyp "executable" }
8c7fab9b 1859 default { error "Error: Cannot determine type of unit $loc, check adm/UDLIST!" }
910970ab 1860 }
1861 if [array exists map] { unset map }
1862 osutils:tk:loadunit $loc map
1863 #puts " loc = $loc === > [array names map]"
1864 set LType $Tfiles(source,${utyp})
1865 foreach typ [array names map] {
1866 if { [lsearch $LType $typ] == -1 } {
1867 unset map($typ)
1868 }
1869 }
1870 foreach type [array names map] {
1871 #puts $type
1872 foreach f $map($type) {
1873 #puts $f
cf4bee7c 1874 if { [lsearch $theExtensions [file extension $f]] != -1 } {
944d808c 1875 lappend lret $f
910970ab 1876 }
1877 }
1878 }
1879 }
1880 return $lret
1881}
1882
cf4bee7c 1883# Returns the list of all compilable files name in a toolkit.
1884proc osutils:tk:cxxfiles { tkloc thePlatform } { return [osutils:tk:files $tkloc [osutils:compilable $thePlatform]] }
1885
1886# Returns the list of all header files name in a toolkit.
1887proc osutils:tk:hxxfiles { tkloc thePlatform } { return [osutils:tk:files $tkloc [osutils:fileExtensionsHeaders $thePlatform]] }
1888
910970ab 1889# Generate Visual Studio project file for executable
d6cda17a 1890proc osutils:vcprojx { theVcVer isUWP theOutDir theToolKit theGuidsMap } {
910970ab 1891 set aVcFiles {}
cf4bee7c 1892 foreach f [osutils:tk:cxxfiles $theToolKit wnt] {
d6cda17a 1893 set aProjTmpl [osutils:vcproj:readtemplate $theVcVer $isUWP 1]
1894
910970ab 1895 set aProjName [file rootname [file tail $f]]
944d808c 1896 set l_compilable [osutils:compilable wnt]
910970ab 1897 regsub -all -- {__XQTNAM__} $aProjTmpl $aProjName aProjTmpl
1898
1899 upvar $theGuidsMap aGuidsMap
1900 if { ! [info exists aGuidsMap($aProjName)] } {
1901 set aGuidsMap($aProjName) [OS:genGUID]
1902 }
1903 regsub -all -- {__PROJECT_GUID__} $aProjTmpl $aGuidsMap($aProjName) aProjTmpl
1904
7c65581d 1905 set aUsedLibs [list]
910970ab 1906 foreach tkx [osutils:commonUsedTK $theToolKit] {
7c65581d 1907 lappend aUsedLibs "${tkx}.lib"
910970ab 1908 }
1909
c7d774c5 1910 osutils:usedOsLibs $theToolKit "wnt" aLibs aFrameworks
7c65581d 1911 foreach aLibIter $aLibs {
1912 lappend aUsedLibs "${aLibIter}.lib"
1913 }
910970ab 1914
1915 # correct names of referred third-party libraries that are named with suffix
1916 # depending on VC version
d6cda17a 1917 set aVCRTVer [string range $theVcVer 0 3]
1918 regsub -all -- {vc[0-9]+} $aUsedLibs $aVCRTVer aUsedLibs
910970ab 1919
7c65581d 1920# puts "$aProjName requires $aUsedLibs"
39bff09c 1921 if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } {
7c65581d 1922 set aUsedLibs [join $aUsedLibs {;}]
910970ab 1923 }
7c65581d 1924 regsub -all -- {__TKDEP__} $aProjTmpl $aUsedLibs aProjTmpl
910970ab 1925
1926 set aFilesSection ""
cf4bee7c 1927 set aVcFilesCxx(units) ""
1928 set aVcFilesHxx(units) ""
910970ab 1929
1930 if { ![info exists written([file tail $f])] } {
1931 set written([file tail $f]) 1
1932
39bff09c 1933 if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } {
cf4bee7c 1934 append aFilesSection [osutils:vcxproj:cxxfile $f ""]
1935 if { ! [info exists aVcFilesCxx($theToolKit)] } { lappend aVcFilesCxx(units) $theToolKit }
1936 lappend aVcFilesCxx($theToolKit) $f
910970ab 1937 } else {
1938 append aFilesSection "\t\t\t<Filter\n"
1939 append aFilesSection "\t\t\t\tName=\"$theToolKit\"\n"
1940 append aFilesSection "\t\t\t\t>\n"
1941 append aFilesSection [osutils:vcproj:file $theVcVer $f ""]
1942 append aFilesSection "\t\t\t</Filter>"
1943 }
1944 } else {
1945 puts "Warning : in vcproj there are than one occurences for [file tail $f]"
1946 }
1947 #puts "$aProjTmpl $aFilesSection"
910970ab 1948 set anIncPaths "..\\..\\..\\inc"
1949 regsub -all -- {__TKINC__} $aProjTmpl $anIncPaths aProjTmpl
910970ab 1950 regsub -all -- {__FILES__} $aProjTmpl $aFilesSection aProjTmpl
1c29294e 1951 regsub -all -- {__CONF__} $aProjTmpl Application aProjTmpl
1952
1953 regsub -all -- {__XQTEXT__} $aProjTmpl "exe" aProjTmpl
910970ab 1954
1955 set aFile [open [set aVcFilePath [file join $theOutDir ${aProjName}.[osutils:vcproj:ext $theVcVer]]] w]
1956 fconfigure $aFile -translation crlf
1957 puts $aFile $aProjTmpl
1958 close $aFile
1959
1960 set aCommonSettingsFile "$aVcFilePath.user"
1961 lappend aVcFiles $aVcFilePath
1962
1963 # write filters file for vc10
39bff09c 1964 if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } {
cf4bee7c 1965 lappend aVcFiles [osutils:vcxproj:filters $theOutDir $aProjName aVcFilesCxx aVcFilesHxx]
910970ab 1966 }
1967
cf4bee7c 1968 # write resource file
1969 lappend aVcFiles [osutils:readtemplate:rc $theOutDir $aProjName]
1970
910970ab 1971 set aCommonSettingsFileTmpl ""
39bff09c 1972 if { "$theVcVer" == "vc7" || "$theVcVer" == "vc8" } {
1973 # nothing
1974 } elseif { "$theVcVer" == "vc9" } {
e31a8e52 1975 set aCommonSettingsFileTmpl [wokUtils:FILES:FileToString "$::THE_CASROOT/adm/templates/vcproj.user.vc9x"]
39bff09c 1976 } else {
e31a8e52 1977 set aCommonSettingsFileTmpl [wokUtils:FILES:FileToString "$::THE_CASROOT/adm/templates/vcxproj.user.vc10x"]
910970ab 1978 }
1979 if { "$aCommonSettingsFileTmpl" != "" } {
d6cda17a 1980 regsub -all -- {__VCVER__} $aCommonSettingsFileTmpl $aVCRTVer aCommonSettingsFileTmpl
39bff09c 1981
1982 set aFile [open [set aVcFilePath "$aCommonSettingsFile"] w]
1983 fconfigure $aFile -translation crlf
1984 puts $aFile $aCommonSettingsFileTmpl
1985 close $aFile
1986
910970ab 1987 lappend aVcFiles "$aCommonSettingsFile"
1988 }
1989 }
1990 return $aVcFiles
1991}
1992
1993# Generate entry for one source file in Visual Studio 7 - 9 project file
1994proc osutils:vcproj:file { theVcVer theFile theOptions } {
1995 append aText "\t\t\t\t<File\n"
1996 append aText "\t\t\t\t\tRelativePath=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $theFile 3]]\">\n"
1997 if { $theOptions == "" } {
1998 append aText "\t\t\t\t</File>\n"
1999 return $aText
2000 }
2001
2002 append aText "\t\t\t\t\t<FileConfiguration\n"
2003 append aText "\t\t\t\t\t\tName=\"Release\|Win32\">\n"
2004 append aText "\t\t\t\t\t\t<Tool\n"
2005 append aText "\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\n"
2006 append aText "\t\t\t\t\t\t\tAdditionalOptions=\""
2007 foreach aParam $theOptions {
2008 append aText "$aParam "
2009 }
2010 append aText "\"\n"
2011 append aText "\t\t\t\t\t\t/>\n"
2012 append aText "\t\t\t\t\t</FileConfiguration>\n"
2013
2014 append aText "\t\t\t\t\t<FileConfiguration\n"
2015 append aText "\t\t\t\t\t\tName=\"Debug\|Win32\">\n"
2016 append aText "\t\t\t\t\t\t<Tool\n"
2017 append aText "\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\n"
2018 append aText "\t\t\t\t\t\t\tAdditionalOptions=\""
2019 foreach aParam $theOptions {
2020 append aText "$aParam "
2021 }
2022 append aText "\"\n"
2023 append aText "\t\t\t\t\t\t/>\n"
2024 append aText "\t\t\t\t\t</FileConfiguration>\n"
2025 if { "$theVcVer" == "vc7" } {
2026 append aText "\t\t\t\t</File>\n"
2027 return $aText
2028 }
2029
2030 append aText "\t\t\t\t\t<FileConfiguration\n"
2031 append aText "\t\t\t\t\t\tName=\"Release\|x64\">\n"
2032 append aText "\t\t\t\t\t\t<Tool\n"
2033 append aText "\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\n"
2034 append aText "\t\t\t\t\t\t\tAdditionalOptions=\""
2035 foreach aParam $theOptions {
2036 append aText "$aParam "
2037 }
2038 append aText "\"\n"
2039 append aText "\t\t\t\t\t\t/>\n"
2040 append aText "\t\t\t\t\t</FileConfiguration>\n"
2041
2042 append aText "\t\t\t\t\t<FileConfiguration\n"
2043 append aText "\t\t\t\t\t\tName=\"Debug\|x64\">\n"
2044 append aText "\t\t\t\t\t\t<Tool\n"
2045 append aText "\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\n"
2046 append aText "\t\t\t\t\t\t\tAdditionalOptions=\""
2047 foreach aParam $theOptions {
2048 append aText "$aParam "
2049 }
2050 append aText "\"\n"
2051 append aText "\t\t\t\t\t\t/>\n"
2052 append aText "\t\t\t\t\t</FileConfiguration>\n"
2053
2054 append aText "\t\t\t\t</File>\n"
2055 return $aText
2056}
2057
910970ab 2058proc wokUtils:FILES:mkdir { d } {
2059 global tcl_version
2060 regsub -all {\.[^.]*} $tcl_version "" major
2061 if { $major == 8 } {
2062 file mkdir $d
2063 } else {
2064 if ![file exists $d] {
2065 if { "[info command mkdir]" == "mkdir" } {
2066 mkdir -path $d
2067 } else {
2068 puts stderr "wokUtils:FILES:mkdir : Error unable to find a mkdir command."
2069 }
2070 }
2071 }
2072 if [file exists $d] {
2073 return $d
2074 } else {
2075 return {}
2076 }
2077}
2078
910970ab 2079# remove from listloc OpenCascade units indesirables on Unix
2080proc osutils:justunix { listloc } {
c7d774c5 2081 if { "$::tcl_platform(os)" == "Darwin" } {
910970ab 2082 set goaway [list Xw WNT]
2083 } else {
2084 set goaway [list WNT]
2085 }
2086 return [osutils:juststation $goaway $listloc]
2087}
2088
910970ab 2089
2090####### CODEBLOCK ###################################################################
2091# Function to generate Code Blocks workspace and project files
944d808c 2092proc OS:MKCBP { theOutDir theModules theAllSolution thePlatform theCmpl } {
910970ab 2093 puts stderr "Generating project files for Code Blocks"
2094
2095 # Generate projects for toolkits and separate workspace for each module
2096 foreach aModule $theModules {
7c65581d 2097 OS:cworkspace $aModule $aModule $theOutDir
944d808c 2098 OS:cbp $theCmpl $aModule $theOutDir $thePlatform
910970ab 2099 }
2100
2101 # Generate single workspace "OCCT" containing projects from all modules
2102 if { "$theAllSolution" != "" } {
2103 OS:cworkspace $theAllSolution $theModules $theOutDir
2104 }
2105
2106 puts "The Code Blocks workspace and project files are stored in the $theOutDir directory"
2107}
2108
2109# Generate Code Blocks projects
944d808c 2110proc OS:cbp { theCmpl theModules theOutDir thePlatform } {
910970ab 2111 set aProjectFiles {}
2112 foreach aModule $theModules {
2113 foreach aToolKit [${aModule}:toolkits] {
944d808c 2114 lappend aProjectFiles [osutils:cbptk $theCmpl $theOutDir $aToolKit $thePlatform]
910970ab 2115 }
2116 foreach anExecutable [OS:executable ${aModule}] {
944d808c 2117 lappend aProjectFiles [osutils:cbpx $theCmpl $theOutDir $anExecutable $thePlatform]
910970ab 2118 }
2119 }
2120 return $aProjectFiles
2121}
2122
2123# Generate Code::Blocks project file for ToolKit
944d808c 2124proc osutils:cbptk { theCmpl theOutDir theToolKit thePlatform} {
7c65581d 2125 set aUsedLibs [list]
910970ab 2126 set aFrameworks [list]
2127 set anIncPaths [list]
2128 set aTKDefines [list]
2129 set aTKSrcFiles [list]
2130
7c65581d 2131 # collect list of referred libraries to link with
944d808c 2132 osutils:usedOsLibs $theToolKit $thePlatform aUsedLibs aFrameworks
7c65581d 2133 set aDepToolkits [wokUtils:LIST:Purge [osutils:tk:close $theToolKit]]
2134 foreach tkx $aDepToolkits {
2135 lappend aUsedLibs "${tkx}"
2136 }
2137
2138 lappend anIncPaths "../../../inc"
2139 set listloc [osutils:tk:units $theToolKit]
2140
2141 if { [llength $listloc] == 0 } {
2142 set listloc $theToolKit
2143 }
2144
d6cda17a 2145 if { $thePlatform == "wnt" || $thePlatform == "uwp" } {
7c65581d 2146 set resultloc [osutils:justwnt $listloc]
2147 } else {
2148 set resultloc [osutils:justunix $listloc]
2149 }
2150 if [array exists written] { unset written }
2151 foreach fxlo $resultloc {
2152 set xlo $fxlo
cf4bee7c 2153 set aSrcFiles [osutils:tk:cxxfiles $xlo $thePlatform]
7c65581d 2154 foreach aSrcFile [lsort $aSrcFiles] {
2155 if { ![info exists written([file tail $aSrcFile])] } {
2156 set written([file tail $aSrcFile]) 1
2157 lappend aTKSrcFiles "../../../[wokUtils:FILES:wtail $aSrcFile 3]"
2158 } else {
2159 puts "Warning : more than one occurences for [file tail $aSrcFile]"
2160 }
2161 }
2162
2163 # macros for correct DLL exports
68df8478 2164# if { $thePlatform == "wnt" || $thePlatform == "uwp" } {
2165# lappend aTKDefines "__${xlo}_DLL"
2166# }
7c65581d 2167 }
910970ab 2168
944d808c 2169 return [osutils:cbp $theCmpl $theOutDir $theToolKit $thePlatform $aTKSrcFiles $aUsedLibs $aFrameworks $anIncPaths $aTKDefines]
910970ab 2170}
2171
2172# Generates Code Blocks workspace.
2173proc OS:cworkspace { theSolName theModules theOutDir } {
2174 global path
2175 set aWsFilePath "${theOutDir}/${theSolName}.workspace"
2176 set aFile [open $aWsFilePath "w"]
2177 set isActiveSet 0
2178 puts $aFile "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>"
2179 puts $aFile "<CodeBlocks_workspace_file>"
2180 puts $aFile "\t<Workspace title=\"${theSolName}\">"
2181
2182 # collect list of projects to be created
2183 foreach aModule $theModules {
2184 # toolkits
2185 foreach aToolKit [osutils:tk:sort [${aModule}:toolkits]] {
2186 set aDependencies [LibToLink $aToolKit]
2187 if { [llength $aDependencies] == 0 } {
2188 puts $aFile "\t\t<Project filename=\"${aToolKit}.cbp\" />"
2189 } else {
2190 puts $aFile "\t\t<Project filename=\"${aToolKit}.cbp\" >"
2191 foreach aDepTk $aDependencies {
2192 puts $aFile "\t\t\t<Depends filename=\"${aDepTk}.cbp\" />"
2193 }
2194 puts $aFile "\t\t</Project>"
2195 }
2196 }
2197
2198 # executables, assume one project per cxx file...
2199 foreach aUnit [OS:executable ${aModule}] {
2200 set aUnitLoc $aUnit
2201 set src_files [_get_used_files $aUnit false]
2202 set aSrcFiles {}
2203 foreach s $src_files {
2204 regexp {source ([^\s]+)} $s dummy name
2205 lappend aSrcFiles $name
2206 }
2207 foreach aSrcFile $aSrcFiles {
2208 set aFileExtension [file extension $aSrcFile]
2209 if { $aFileExtension == ".cxx" } {
2210 set aPrjName [file rootname $aSrcFile]
2211 set aDependencies [list]
2212 if {[file isdirectory $path/src/$aUnitLoc]} {
2213 set aDependencies [LibToLinkX $aUnitLoc [file rootname $aSrcFile]]
2214 }
2215 set anActiveState ""
2216 if { $isActiveSet == 0 } {
2217 set anActiveState " active=\"1\""
2218 set isActiveSet 1
2219 }
2220 if { [llength $aDependencies] == 0 } {
2221 puts $aFile "\t\t<Project filename=\"${aPrjName}.cbp\"${anActiveState}/>"
2222 } else {
2223 puts $aFile "\t\t<Project filename=\"${aPrjName}.cbp\"${anActiveState}>"
2224 foreach aDepTk $aDependencies {
2225 puts $aFile "\t\t\t<Depends filename=\"${aDepTk}.cbp\" />"
2226 }
2227 puts $aFile "\t\t</Project>"
2228 }
2229 }
2230 }
2231 }
2232 }
2233
2234 puts $aFile "\t</Workspace>"
2235 puts $aFile "</CodeBlocks_workspace_file>"
2236 close $aFile
2237
2238 return $aWsFilePath
2239}
2240
2241# Generate Code::Blocks project file for Executable
944d808c 2242proc osutils:cbpx { theCmpl theOutDir theToolKit thePlatform } {
2243 global path
910970ab 2244 set aWokArch "$::env(ARCH)"
2245
2246 set aCbpFiles {}
cf4bee7c 2247 foreach aSrcFile [osutils:tk:cxxfiles $theToolKit $thePlatform] {
910970ab 2248 # collect list of referred libraries to link with
7c65581d 2249 set aUsedLibs [list]
910970ab 2250 set aFrameworks [list]
2251 set anIncPaths [list]
2252 set aTKDefines [list]
2253 set aTKSrcFiles [list]
2254 set aProjName [file rootname [file tail $aSrcFile]]
2255
944d808c 2256 osutils:usedOsLibs $theToolKit $thePlatform aUsedLibs aFrameworks
7c65581d 2257
910970ab 2258 set aDepToolkits [LibToLinkX $theToolKit $aProjName]
2259 foreach tkx $aDepToolkits {
2260 if {[_get_type $tkx] == "t"} {
7c65581d 2261 lappend aUsedLibs "${tkx}"
910970ab 2262 }
2263 if {[lsearch [glob -tails -directory "$path/src" -types d *] $tkx] == "-1"} {
7c65581d 2264 lappend aUsedLibs "${tkx}"
910970ab 2265 }
2266 }
2267
910970ab 2268 set WOKSteps_exec_link [_get_options lin WOKSteps_exec_link $theToolKit]
2269 if { [regexp {WOKStep_DLLink} $WOKSteps_exec_link] || [regexp {WOKStep_Libink} $WOKSteps_exec_link] } {
2270 set isExecutable "false"
2271 } else {
2272 set isExecutable "true"
2273 }
2274
2275 if { ![info exists written([file tail $aSrcFile])] } {
2276 set written([file tail $aSrcFile]) 1
7c65581d 2277 lappend aTKSrcFiles "../../../[wokUtils:FILES:wtail $aSrcFile 3]"
910970ab 2278 } else {
2279 puts "Warning : in cbp there are more than one occurences for [file tail $aSrcFile]"
2280 }
2281
2282 # macros for correct DLL exports
68df8478 2283# if { $thePlatform == "wnt" || $thePlatform == "uwp" } {
2284# lappend aTKDefines "__${theToolKit}_DLL"
2285# }
910970ab 2286
2287 # common include paths
2288 lappend anIncPaths "../../../inc"
2289
944d808c 2290 lappend aCbpFiles [osutils:cbp $theCmpl $theOutDir $aProjName $thePlatform $aTKSrcFiles $aUsedLibs $aFrameworks $anIncPaths $aTKDefines $isExecutable]
910970ab 2291 }
2292
2293 return $aCbpFiles
2294}
2295
910970ab 2296# This function intended to generate Code::Blocks project file
7c65581d 2297# @param theCmpl - the compiler (gcc or msvc)
910970ab 2298# @param theOutDir - output directory to place project file
2299# @param theProjName - project name
2300# @param theSrcFiles - list of source files
2301# @param theLibsList - dependencies (libraries list)
2302# @param theFrameworks - dependencies (frameworks list, Mac OS X specific)
2303# @param theIncPaths - header search paths
2304# @param theDefines - compiler macro definitions
2305# @param theIsExe - flag to indicate executable / library target
944d808c 2306proc osutils:cbp { theCmpl theOutDir theProjName thePlatform theSrcFiles theLibsList theFrameworks theIncPaths theDefines {theIsExe "false"} } {
910970ab 2307 set aWokArch "$::env(ARCH)"
2308
7c65581d 2309 set aCmplCbp "gcc"
2310 set aCmplFlags [list]
2311 set aCmplFlagsRelease [list]
2312 set aCmplFlagsDebug [list]
2313 set toPassArgsByFile 0
2314 set aLibPrefix "lib"
aafe169f 2315 set aPlatformAndCompiler "${thePlatform}/gcc"
2316 if { "$thePlatform" == "mac" || "$thePlatform" == "ios" } {
2317 set aPlatformAndCompiler "${thePlatform}/clang"
2318 }
d6cda17a 2319 if { "$thePlatform" == "wnt" || "$thePlatform" == "uwp" || "$thePlatform" == "qnx" } {
7c65581d 2320 set toPassArgsByFile 1
2321 }
2322 if { "$theCmpl" == "msvc" } {
2323 set aCmplCbp "msvc8"
2324 set aLibPrefix ""
2325 }
2326
2327 if { "$theCmpl" == "msvc" } {
2328 set aCmplFlags "-arch:SSE2 -EHsc -W4 -MP"
2329 set aCmplFlagsRelease "-MD -O2"
2330 set aCmplFlagsDebug "-MDd -Od -Zi"
2331 lappend aCmplFlags "-D_CRT_SECURE_NO_WARNINGS"
2332 lappend aCmplFlags "-D_CRT_NONSTDC_NO_DEPRECATE"
2333 } elseif { "$theCmpl" == "gcc" } {
d6cda17a 2334 if { "$thePlatform" != "qnx" } {
7c65581d 2335 set aCmplFlags "-mmmx -msse -msse2 -mfpmath=sse"
2336 }
2337 set aCmplFlagsRelease "-O2"
2338 set aCmplFlagsDebug "-O0 -g"
d6cda17a 2339 if { "$thePlatform" == "wnt" || "$thePlatform" == "uwp" } {
7c65581d 2340 lappend aCmplFlags "-std=gnu++0x"
2341 lappend aCmplFlags "-D_WIN32_WINNT=0x0501"
2342 } else {
2343 lappend aCmplFlags "-std=c++0x"
2344 lappend aCmplFlags "-fPIC"
2345 lappend aCmplFlags "-DOCC_CONVERT_SIGNALS"
2346 }
2347 lappend aCmplFlags "-Wall"
2348 lappend aCmplFlags "-fexceptions"
2349 }
2350 lappend aCmplFlagsRelease "-DNDEBUG"
2351 lappend aCmplFlagsRelease "-DNo_Exception"
2352 lappend aCmplFlagsDebug "-D_DEBUG"
d6cda17a 2353 if { "$thePlatform" == "qnx" } {
7c65581d 2354 lappend aCmplFlags "-D_QNX_SOURCE"
2355 }
2356
2357 set aCbpFilePath "${theOutDir}/${theProjName}.cbp"
2358 set aLnkFileName "${theProjName}_obj.link"
2359 set aLnkDebFileName "${theProjName}_objd.link"
2360 set aLnkFilePath "${theOutDir}/${aLnkFileName}"
2361 set aLnkDebFilePath "${theOutDir}/${aLnkDebFileName}"
910970ab 2362 set aFile [open $aCbpFilePath "w"]
2363 puts $aFile "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>"
2364 puts $aFile "<CodeBlocks_project_file>"
2365 puts $aFile "\t<FileVersion major=\"1\" minor=\"6\" />"
2366 puts $aFile "\t<Project>"
2367 puts $aFile "\t\t<Option title=\"$theProjName\" />"
2368 puts $aFile "\t\t<Option pch_mode=\"2\" />"
7c65581d 2369 puts $aFile "\t\t<Option compiler=\"$aCmplCbp\" />"
910970ab 2370 puts $aFile "\t\t<Build>"
2371
2372 # Release target configuration
2373 puts $aFile "\t\t\t<Target title=\"Release\">"
2374 if { "$theIsExe" == "true" } {
aafe169f 2375 puts $aFile "\t\t\t\t<Option output=\"../../../${aPlatformAndCompiler}/bin/${theProjName}\" prefix_auto=\"0\" extension_auto=\"0\" />"
910970ab 2376 puts $aFile "\t\t\t\t<Option type=\"1\" />"
2377 } else {
d6cda17a 2378 if { "$thePlatform" == "wnt" || "$thePlatform" == "uwp" } {
aafe169f 2379 puts $aFile "\t\t\t\t<Option output=\"../../../${aPlatformAndCompiler}/bin/${aLibPrefix}${theProjName}\" imp_lib=\"../../../${aPlatformAndCompiler}/lib/\$(TARGET_OUTPUT_BASENAME)\" prefix_auto=\"1\" extension_auto=\"1\" />"
910970ab 2380 } else {
aafe169f 2381 puts $aFile "\t\t\t\t<Option output=\"../../../${aPlatformAndCompiler}/lib/lib${theProjName}.so\" prefix_auto=\"0\" extension_auto=\"0\" />"
910970ab 2382 }
2383 puts $aFile "\t\t\t\t<Option type=\"3\" />"
2384 }
aafe169f 2385 puts $aFile "\t\t\t\t<Option object_output=\"../../../${aPlatformAndCompiler}/obj\" />"
7c65581d 2386 puts $aFile "\t\t\t\t<Option compiler=\"$aCmplCbp\" />"
2387 puts $aFile "\t\t\t\t<Option createDefFile=\"0\" />"
d6cda17a 2388 if { "$thePlatform" == "wnt" || "$thePlatform" == "uwp" } {
7c65581d 2389 puts $aFile "\t\t\t\t<Option createStaticLib=\"1\" />"
910970ab 2390 } else {
7c65581d 2391 puts $aFile "\t\t\t\t<Option createStaticLib=\"0\" />"
910970ab 2392 }
910970ab 2393
2394 # compiler options per TARGET (including defines)
2395 puts $aFile "\t\t\t\t<Compiler>"
7c65581d 2396 foreach aFlagIter $aCmplFlagsRelease {
2397 puts $aFile "\t\t\t\t\t<Add option=\"$aFlagIter\" />"
910970ab 2398 }
2399 foreach aMacro $theDefines {
2400 puts $aFile "\t\t\t\t\t<Add option=\"-D${aMacro}\" />"
2401 }
910970ab 2402 puts $aFile "\t\t\t\t</Compiler>"
2403
2404 puts $aFile "\t\t\t\t<Linker>"
7c65581d 2405 if { $toPassArgsByFile == 1 } {
2406 puts $aFile "\t\t\t\t\t<Add option=\"\@$aLnkFileName\" />"
2407 }
aafe169f 2408 puts $aFile "\t\t\t\t\t<Add directory=\"../../../${aPlatformAndCompiler}/lib\" />"
d6cda17a 2409 if { "$thePlatform" == "mac" } {
7c65581d 2410 if { [ lsearch $theLibsList X11 ] >= 0} {
2411 puts $aFile "\t\t\t\t\t<Add directory=\"/usr/X11/lib\" />"
2412 }
910970ab 2413 }
2414 puts $aFile "\t\t\t\t\t<Add option=\"\$(CSF_OPT_LNK${aWokArch})\" />"
d6cda17a 2415 if { "$thePlatform" == "lin" } {
aafe169f 2416 puts $aFile "\t\t\t\t\t<Add option=\"-Wl,-rpath-link=../../../${aPlatformAndCompiler}/lib\" />"
55fb31da 2417 }
910970ab 2418 puts $aFile "\t\t\t\t</Linker>"
2419
2420 puts $aFile "\t\t\t</Target>"
2421
2422 # Debug target configuration
2423 puts $aFile "\t\t\t<Target title=\"Debug\">"
2424 if { "$theIsExe" == "true" } {
aafe169f 2425 puts $aFile "\t\t\t\t<Option output=\"../../../${aPlatformAndCompiler}/bind/${theProjName}\" prefix_auto=\"0\" extension_auto=\"0\" />"
910970ab 2426 puts $aFile "\t\t\t\t<Option type=\"1\" />"
2427 } else {
d6cda17a 2428 if { "$thePlatform" == "wnt" || "$thePlatform" == "uwp" } {
aafe169f 2429 puts $aFile "\t\t\t\t<Option output=\"../../../${aPlatformAndCompiler}/bind/${aLibPrefix}${theProjName}\" imp_lib=\"../../../${aPlatformAndCompiler}/libd/\$(TARGET_OUTPUT_BASENAME)\" prefix_auto=\"1\" extension_auto=\"1\" />"
910970ab 2430 } else {
aafe169f 2431 puts $aFile "\t\t\t\t<Option output=\"../../../${aPlatformAndCompiler}/libd/lib${theProjName}.so\" prefix_auto=\"0\" extension_auto=\"0\" />"
910970ab 2432 }
2433 puts $aFile "\t\t\t\t<Option type=\"3\" />"
2434 }
aafe169f 2435 puts $aFile "\t\t\t\t<Option object_output=\"../../../${aPlatformAndCompiler}/objd\" />"
7c65581d 2436 puts $aFile "\t\t\t\t<Option compiler=\"$aCmplCbp\" />"
2437 puts $aFile "\t\t\t\t<Option createDefFile=\"0\" />"
d6cda17a 2438 if { "$thePlatform" == "wnt" || "$thePlatform" == "uwp" } {
7c65581d 2439 puts $aFile "\t\t\t\t<Option createStaticLib=\"1\" />"
910970ab 2440 } else {
7c65581d 2441 puts $aFile "\t\t\t\t<Option createStaticLib=\"0\" />"
910970ab 2442 }
910970ab 2443
2444 # compiler options per TARGET (including defines)
2445 puts $aFile "\t\t\t\t<Compiler>"
7c65581d 2446 foreach aFlagIter $aCmplFlagsDebug {
2447 puts $aFile "\t\t\t\t\t<Add option=\"$aFlagIter\" />"
910970ab 2448 }
2449 foreach aMacro $theDefines {
2450 puts $aFile "\t\t\t\t\t<Add option=\"-D${aMacro}\" />"
2451 }
910970ab 2452 puts $aFile "\t\t\t\t</Compiler>"
2453
2454 puts $aFile "\t\t\t\t<Linker>"
7c65581d 2455 if { $toPassArgsByFile == 1 } {
2456 puts $aFile "\t\t\t\t\t<Add option=\"\@$aLnkDebFileName\" />"
2457 }
aafe169f 2458 puts $aFile "\t\t\t\t\t<Add directory=\"../../../${aPlatformAndCompiler}/libd\" />"
d6cda17a 2459 if { "$thePlatform" == "mac" } {
7c65581d 2460 if { [ lsearch $theLibsList X11 ] >= 0} {
2461 puts $aFile "\t\t\t\t\t<Add directory=\"/usr/X11/lib\" />"
2462 }
910970ab 2463 }
2464 puts $aFile "\t\t\t\t\t<Add option=\"\$(CSF_OPT_LNK${aWokArch}D)\" />"
d6cda17a 2465 if { "$thePlatform" == "lin" } {
aafe169f 2466 puts $aFile "\t\t\t\t\t<Add option=\"-Wl,-rpath-link=../../../${aPlatformAndCompiler}/libd\" />"
55fb31da 2467 }
910970ab 2468 puts $aFile "\t\t\t\t</Linker>"
2469
2470 puts $aFile "\t\t\t</Target>"
2471
2472 puts $aFile "\t\t</Build>"
2473
2474 # COMMON compiler options
2475 puts $aFile "\t\t<Compiler>"
7c65581d 2476 foreach aFlagIter $aCmplFlags {
2477 puts $aFile "\t\t\t<Add option=\"$aFlagIter\" />"
2478 }
910970ab 2479 puts $aFile "\t\t\t<Add option=\"\$(CSF_OPT_CMPL)\" />"
2480 foreach anIncPath $theIncPaths {
2481 puts $aFile "\t\t\t<Add directory=\"$anIncPath\" />"
2482 }
2483 puts $aFile "\t\t</Compiler>"
2484
2485 # COMMON linker options
2486 puts $aFile "\t\t<Linker>"
d6cda17a 2487 if { "$thePlatform" == "wnt" && "$theCmpl" == "gcc" } {
7c65581d 2488 puts $aFile "\t\t\t<Add option=\"-Wl,--export-all-symbols\" />"
2489 }
910970ab 2490 foreach aFrameworkName $theFrameworks {
2491 if { "$aFrameworkName" != "" } {
2492 puts $aFile "\t\t\t<Add option=\"-framework $aFrameworkName\" />"
2493 }
2494 }
2495 foreach aLibName $theLibsList {
2496 if { "$aLibName" != "" } {
7c65581d 2497 if { "$theCmpl" == "msvc" } {
2498 puts $aFile "\t\t\t<Add library=\"${aLibName}.lib\" />"
2499 } else {
2500 puts $aFile "\t\t\t<Add library=\"${aLibName}\" />"
2501 }
910970ab 2502 }
2503 }
2504 puts $aFile "\t\t</Linker>"
2505
2506 # list of sources
7c65581d 2507
2508 set aFileLnkObj ""
2509 set aFileLnkObjd ""
2510 set isFirstSrcFile 1
2511 if { $toPassArgsByFile == 1 } {
2512 set aFileLnkObj [open $aLnkFilePath "w"]
2513 set aFileLnkObjd [open $aLnkDebFilePath "w"]
2514 }
2515
910970ab 2516 foreach aSrcFile $theSrcFiles {
2517 if {[string equal -nocase [file extension $aSrcFile] ".mm"]} {
2518 puts $aFile "\t\t<Unit filename=\"$aSrcFile\">"
2519 puts $aFile "\t\t\t<Option compile=\"1\" />"
2520 puts $aFile "\t\t\t<Option link=\"1\" />"
2521 puts $aFile "\t\t</Unit>"
2522 } elseif {[string equal -nocase [file extension $aSrcFile] ".c"]} {
2523 puts $aFile "\t\t<Unit filename=\"$aSrcFile\">"
2524 puts $aFile "\t\t\t<Option compilerVar=\"CC\" />"
2525 puts $aFile "\t\t</Unit>"
7c65581d 2526 } elseif { $toPassArgsByFile == 1 && $isFirstSrcFile == 0 && [string equal -nocase [file extension $aSrcFile] ".cxx" ] } {
2527 # pass at list single source file to Code::Blocks as is
2528 # and pack the list of other files into the dedicated file to workaround process arguments limits on systems like Windows
2529 puts $aFile "\t\t<Unit filename=\"$aSrcFile\">"
2530 puts $aFile "\t\t\t<Option link=\"0\" />"
2531 puts $aFile "\t\t</Unit>"
2532
aafe169f 2533 set aFileObj [string map {.cxx .o} [string map [list "/src/" "/${aPlatformAndCompiler}/obj/src/"] $aSrcFile]]
2534 set aFileObjd [string map {.cxx .o} [string map [list "/src/" "/${aPlatformAndCompiler}/objd/src/"] $aSrcFile]]
7c65581d 2535 puts -nonewline $aFileLnkObj "$aFileObj "
2536 puts -nonewline $aFileLnkObjd "$aFileObjd "
910970ab 2537 } else {
2538 puts $aFile "\t\t<Unit filename=\"$aSrcFile\" />"
7c65581d 2539 set isFirstSrcFile 0
910970ab 2540 }
2541 }
2542
d6cda17a 2543 if { "$thePlatform" == "wnt" || "$thePlatform" == "uwp" } {
7c65581d 2544 close $aFileLnkObj
2545 close $aFileLnkObjd
2546 }
2547
910970ab 2548 puts $aFile "\t</Project>"
2549 puts $aFile "</CodeBlocks_project_file>"
2550 close $aFile
2551
2552 return $aCbpFilePath
2553}
2554
910970ab 2555# Define libraries to link using only EXTERNLIB file
2556proc LibToLinkX {thePackage theDummyName} {
2557 set aToolKits [LibToLink $thePackage]
2558 return $aToolKits
2559}
2560
c7d774c5 2561# Function to generate Xcode workspace and project files
2562proc OS:MKXCD { theOutDir {theModules {}} {theAllSolution ""} {theLibType "dynamic"} {thePlatform ""} } {
2563
2564 puts stderr "Generating project files for Xcode"
2565
2566 # Generate projects for toolkits and separate workspace for each module
2567 foreach aModule $theModules {
2568 OS:xcworkspace $aModule $aModule $theOutDir
2569 OS:xcodeproj $aModule $theOutDir ::THE_GUIDS_LIST $theLibType $thePlatform
2570 }
2571
2572 # Generate single workspace "OCCT" containing projects from all modules
2573 if { "$theAllSolution" != "" } {
2574 OS:xcworkspace $theAllSolution $theModules $theOutDir
2575 }
2576}
2577
2578# Generates toolkits sections for Xcode workspace file.
2579proc OS:xcworkspace:toolkits { theModule } {
2580 set aBuff ""
2581
2582 # Adding toolkits for module in workspace.
2583 foreach aToolKit [osutils:tk:sort [${theModule}:toolkits]] {
2584 append aBuff " <FileRef\n"
2585 append aBuff " location = \"group:${aToolKit}.xcodeproj\">\n"
2586 append aBuff " </FileRef>\n"
2587 }
2588
2589 # Adding executables for module, assume one project per cxx file...
2590 foreach aUnit [OS:executable ${theModule}] {
2591 set aUnitLoc $aUnit
2592 set src_files [_get_used_files $aUnit false]
2593 set aSrcFiles {}
2594 foreach s $src_files {
2595 regexp {source ([^\s]+)} $s dummy name
2596 lappend aSrcFiles $name
2597 }
2598 foreach aSrcFile $aSrcFiles {
2599 set aFileExtension [file extension $aSrcFile]
2600 if { $aFileExtension == ".cxx" } {
2601 set aPrjName [file rootname $aSrcFile]
2602 append aBuff " <FileRef\n"
2603 append aBuff " location = \"group:${aPrjName}.xcodeproj\">\n"
2604 append aBuff " </FileRef>\n"
2605 }
2606 }
2607 }
2608
2609 # Removing unnecessary newline character from the end.
2610 set aBuff [string replace $aBuff end end]
2611 return $aBuff
2612}
2613
2614# Generates workspace files for Xcode.
2615proc OS:xcworkspace { theWorkspaceName theModules theOutDir } {
2616 # Creating workspace directory for Xcode.
2617 set aWorkspaceDir "${theOutDir}/${theWorkspaceName}.xcworkspace"
2618 wokUtils:FILES:mkdir $aWorkspaceDir
2619 if { ! [file exists $aWorkspaceDir] } {
2620 puts stderr "Error: Could not create workspace directory \"$aWorkspaceDir\""
2621 return
2622 }
2623
2624 # Creating workspace file.
2625 set aWsFilePath "${aWorkspaceDir}/contents.xcworkspacedata"
2626 set aFile [open $aWsFilePath "w"]
2627
2628 # Adding header and section for main Group.
2629 puts $aFile "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
2630 puts $aFile "<Workspace"
2631 puts $aFile " version = \"1.0\">"
2632 puts $aFile " <Group"
2633 puts $aFile " location = \"container:\""
2634 puts $aFile " name = \"${theWorkspaceName}\">"
2635
2636 # Adding modules.
2637 if { [llength "$theModules"] > 1 } {
2638 foreach aModule $theModules {
2639 puts $aFile " <Group"
2640 puts $aFile " location = \"container:\""
2641 puts $aFile " name = \"${aModule}\">"
2642 puts $aFile [OS:xcworkspace:toolkits $aModule]
2643 puts $aFile " </Group>"
2644 }
2645 } else {
2646 puts $aFile [OS:xcworkspace:toolkits $theModules]
2647 }
2648
2649 # Adding footer.
2650 puts $aFile " </Group>"
2651 puts $aFile "</Workspace>"
2652 close $aFile
2653}
2654
2655# Generates Xcode project files.
2656proc OS:xcodeproj { theModules theOutDir theGuidsMap theLibType thePlatform} {
2657 upvar $theGuidsMap aGuidsMap
2658
2659 set isStatic 0
2660 if { "$theLibType" == "static" } {
2661 set isStatic 1
2662 } elseif { "$thePlatform" == "ios" } {
2663 set isStatic 1
2664 }
2665
2666 set aProjectFiles {}
2667 foreach aModule $theModules {
2668 foreach aToolKit [${aModule}:toolkits] {
2669 lappend aProjectFiles [osutils:xcdtk $theOutDir $aToolKit aGuidsMap $isStatic $thePlatform "dylib"]
2670 }
2671 foreach anExecutable [OS:executable ${aModule}] {
2672 lappend aProjectFiles [osutils:xcdtk $theOutDir $anExecutable aGuidsMap $isStatic $thePlatform "executable"]
2673 }
2674 }
2675 return $aProjectFiles
2676}
2677
2678# Generates dependencies section for Xcode project files.
48ba1811 2679proc osutils:xcdtk:deps {theToolKit theTargetType theGuidsMap theFileRefSection theDepsGuids theDepsRefGuids thePlatform theIsStatic} {
c7d774c5 2680 upvar $theGuidsMap aGuidsMap
2681 upvar $theFileRefSection aFileRefSection
2682 upvar $theDepsGuids aDepsGuids
2683 upvar $theDepsRefGuids aDepsRefGuids
2684
2685 set aBuildFileSection ""
7c65581d 2686 set aUsedLibs [wokUtils:LIST:Purge [osutils:tk:close $theToolKit]]
c7d774c5 2687 set aDepToolkits [lappend [wokUtils:LIST:Purge [osutils:tk:close $theToolKit]] $theToolKit]
2688
2689 if { "$theTargetType" == "executable" } {
cf4bee7c 2690 set aFile [osutils:tk:cxxfiles $theToolKit mac]
c7d774c5 2691 set aProjName [file rootname [file tail $aFile]]
2692 set aDepToolkits [LibToLinkX $theToolKit $aProjName]
2693 }
2694
2695 set aLibExt "dylib"
2696 if { $theIsStatic == 1 } {
2697 set aLibExt "a"
2698 if { "$theTargetType" != "executable" } {
2699 return $aBuildFileSection
2700 }
2701 }
2702
48ba1811 2703 osutils:usedOsLibs $theToolKit $thePlatform aLibs aFrameworks
7c65581d 2704 set aUsedLibs [concat $aUsedLibs $aLibs]
2705 set aUsedLibs [concat $aUsedLibs $aFrameworks]
2706 foreach tkx $aUsedLibs {
c7d774c5 2707 set aDepLib "${tkx}_Dep"
2708 set aDepLibRef "${tkx}_DepRef"
2709
2710 if { ! [info exists aGuidsMap($aDepLib)] } {
2711 set aGuidsMap($aDepLib) [OS:genGUID "xcd"]
2712 }
2713 if { ! [info exists aGuidsMap($aDepLibRef)] } {
2714 set aGuidsMap($aDepLibRef) [OS:genGUID "xcd"]
2715 }
2716
2717 append aBuildFileSection "\t\t$aGuidsMap($aDepLib) = \{isa = PBXBuildFile; fileRef = $aGuidsMap($aDepLibRef) ; \};\n"
2718 if {[lsearch -nocase $aFrameworks $tkx] == -1} {
2719 append aFileRefSection "\t\t$aGuidsMap($aDepLibRef) = \{isa = PBXFileReference; lastKnownFileType = file; name = lib${tkx}.${aLibExt}; path = lib${tkx}.${aLibExt}; sourceTree = \"<group>\"; \};\n"
2720 } else {
2721 append aFileRefSection "\t\t$aGuidsMap($aDepLibRef) = \{isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ${tkx}.framework; path = /System/Library/Frameworks/${tkx}.framework; sourceTree = \"<absolute>\"; \};\n"
2722 }
2723 append aDepsGuids "\t\t\t\t$aGuidsMap($aDepLib) ,\n"
2724 append aDepsRefGuids "\t\t\t\t$aGuidsMap($aDepLibRef) ,\n"
2725 }
2726
2727 return $aBuildFileSection
2728}
2729
2730# Generates PBXBuildFile and PBXGroup sections for project file.
2731proc osutils:xcdtk:sources {theToolKit theTargetType theSrcFileRefSection theGroupSection thePackageGuids theSrcFileGuids theGuidsMap theIncPaths} {
2732 upvar $theSrcFileRefSection aSrcFileRefSection
2733 upvar $theGroupSection aGroupSection
2734 upvar $thePackageGuids aPackagesGuids
2735 upvar $theSrcFileGuids aSrcFileGuids
2736 upvar $theGuidsMap aGuidsMap
2737 upvar $theIncPaths anIncPaths
2738
2739 set listloc [osutils:tk:units $theToolKit]
2740 set resultloc [osutils:justunix $listloc]
2741 set aBuildFileSection ""
2742 set aPackages [lsort -nocase $resultloc]
2743 if { "$theTargetType" == "executable" } {
2744 set aPackages [list "$theToolKit"]
2745 }
2746
2747 # Generating PBXBuildFile, PBXGroup sections and groups for each package.
2748 foreach fxlo $aPackages {
2749 set xlo $fxlo
2750 set aPackage "${xlo}_Package"
2751 set aSrcFileRefGuids ""
2752 if { ! [info exists aGuidsMap($aPackage)] } {
2753 set aGuidsMap($aPackage) [OS:genGUID "xcd"]
2754 }
2755
cf4bee7c 2756 set aSrcFiles [osutils:tk:cxxfiles $xlo mac]
c7d774c5 2757 foreach aSrcFile [lsort $aSrcFiles] {
2758 set aFileExt "sourcecode.cpp.cpp"
2759
2760 if { [file extension $aSrcFile] == ".c" } {
2761 set aFileExt "sourcecode.c.c"
2762 } elseif { [file extension $aSrcFile] == ".mm" } {
2763 set aFileExt "sourcecode.cpp.objcpp"
2764 }
2765
2766 if { ! [info exists aGuidsMap($aSrcFile)] } {
2767 set aGuidsMap($aSrcFile) [OS:genGUID "xcd"]
2768 }
2769 set aSrcFileRef "${aSrcFile}_Ref"
2770 if { ! [info exists aGuidsMap($aSrcFileRef)] } {
2771 set aGuidsMap($aSrcFileRef) [OS:genGUID "xcd"]
2772 }
2773 if { ! [info exists written([file tail $aSrcFile])] } {
2774 set written([file tail $aSrcFile]) 1
2775 append aBuildFileSection "\t\t$aGuidsMap($aSrcFile) = \{isa = PBXBuildFile; fileRef = $aGuidsMap($aSrcFileRef) ;\};\n"
2776 append aSrcFileRefSection "\t\t$aGuidsMap($aSrcFileRef) = \{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = ${aFileExt}; name = [wokUtils:FILES:wtail $aSrcFile 1]; path = ../../../[wokUtils:FILES:wtail $aSrcFile 3]; sourceTree = \"<group>\"; \};\n"
2777 append aSrcFileGuids "\t\t\t\t$aGuidsMap($aSrcFile) ,\n"
2778 append aSrcFileRefGuids "\t\t\t\t$aGuidsMap($aSrcFileRef) ,\n"
2779 } else {
2780 puts "Warning : more than one occurences for [file tail $aSrcFile]"
2781 }
2782 }
2783
2784 append aGroupSection "\t\t$aGuidsMap($aPackage) = \{\n"
2785 append aGroupSection "\t\t\tisa = PBXGroup;\n"
2786 append aGroupSection "\t\t\tchildren = (\n"
2787 append aGroupSection $aSrcFileRefGuids
2788 append aGroupSection "\t\t\t);\n"
2789 append aGroupSection "\t\t\tname = $xlo;\n"
2790 append aGroupSection "\t\t\tsourceTree = \"<group>\";\n"
2791 append aGroupSection "\t\t\};\n"
2792
2793 # Storing packages IDs for adding them later as a child of toolkit
2794 append aPackagesGuids "\t\t\t\t$aGuidsMap($aPackage) ,\n"
2795 }
2796
2797 # Removing unnecessary newline character from the end.
2798 set aPackagesGuids [string replace $aPackagesGuids end end]
2799
2800 return $aBuildFileSection
2801}
2802
2803# Creates folders structure and all necessary files for Xcode project.
2804proc osutils:xcdtk { theOutDir theToolKit theGuidsMap theIsStatic thePlatform {theTargetType "dylib"} } {
2805 set aPBXBuildPhase "Headers"
2806 set aRunOnlyForDeployment "0"
2807 set aProductType "library.dynamic"
2808 set anExecExtension "\t\t\t\tEXECUTABLE_EXTENSION = dylib;"
2809 set anExecPrefix "\t\t\t\tEXECUTABLE_PREFIX = lib;"
2810 set aWrapperExtension "\t\t\t\tWRAPPER_EXTENSION = dylib;"
050c18ac 2811 set aTKDefines [list "OCC_CONVERT_SIGNALS"]
d5265175 2812 if { $theIsStatic == 1 } {
2813 lappend aTKDefines "OCCT_NO_PLUGINS"
2814 }
c7d774c5 2815
2816 if { "$theTargetType" == "executable" } {
2817 set aPBXBuildPhase "CopyFiles"
2818 set aRunOnlyForDeployment "1"
2819 set aProductType "tool"
2820 set anExecExtension ""
2821 set anExecPrefix ""
2822 set aWrapperExtension ""
2823 } elseif { $theIsStatic == 1 } {
2824 set aProductType "library.static"
2825 set anExecExtension "\t\t\t\tEXECUTABLE_EXTENSION = a;"
2826 set aWrapperExtension "\t\t\t\tWRAPPER_EXTENSION = a;"
2827 }
2828
2829 set aUsername [exec whoami]
2830
2831 # Creation of folders for Xcode projectP.
2832 set aToolkitDir "${theOutDir}/${theToolKit}.xcodeproj"
2833 wokUtils:FILES:mkdir $aToolkitDir
2834 if { ! [file exists $aToolkitDir] } {
2835 puts stderr "Error: Could not create project directory \"$aToolkitDir\""
2836 return
2837 }
2838
2839 set aUserDataDir "${aToolkitDir}/xcuserdata"
2840 wokUtils:FILES:mkdir $aUserDataDir
2841 if { ! [file exists $aUserDataDir] } {
2842 puts stderr "Error: Could not create xcuserdata directorty in \"$aToolkitDir\""
2843 return
2844 }
2845
2846 set aUserDataDir "${aUserDataDir}/${aUsername}.xcuserdatad"
2847 wokUtils:FILES:mkdir $aUserDataDir
2848 if { ! [file exists $aUserDataDir] } {
2849 puts stderr "Error: Could not create ${aUsername}.xcuserdatad directorty in \"$aToolkitDir\"/xcuserdata"
2850 return
2851 }
2852
2853 set aSchemesDir "${aUserDataDir}/xcschemes"
2854 wokUtils:FILES:mkdir $aSchemesDir
2855 if { ! [file exists $aSchemesDir] } {
2856 puts stderr "Error: Could not create xcschemes directorty in \"$aUserDataDir\""
2857 return
2858 }
2859 # End of folders creation.
2860
2861 # Generating GUID for tookit.
2862 upvar $theGuidsMap aGuidsMap
2863 if { ! [info exists aGuidsMap($theToolKit)] } {
2864 set aGuidsMap($theToolKit) [OS:genGUID "xcd"]
2865 }
2866
2867 # Creating xcscheme file for toolkit from template.
2868 set aXcschemeTmpl [osutils:readtemplate "xcscheme" "xcd"]
2869 regsub -all -- {__TOOLKIT_NAME__} $aXcschemeTmpl $theToolKit aXcschemeTmpl
2870 regsub -all -- {__TOOLKIT_GUID__} $aXcschemeTmpl $aGuidsMap($theToolKit) aXcschemeTmpl
2871 set aXcschemeFile [open "$aSchemesDir/${theToolKit}.xcscheme" "w"]
2872 puts $aXcschemeFile $aXcschemeTmpl
2873 close $aXcschemeFile
2874
2875 # Creating xcschememanagement.plist file for toolkit from template.
2876 set aPlistTmpl [osutils:readtemplate "plist" "xcd"]
2877 regsub -all -- {__TOOLKIT_NAME__} $aPlistTmpl $theToolKit aPlistTmpl
2878 regsub -all -- {__TOOLKIT_GUID__} $aPlistTmpl $aGuidsMap($theToolKit) aPlistTmpl
2879 set aPlistFile [open "$aSchemesDir/xcschememanagement.plist" "w"]
2880 puts $aPlistFile $aPlistTmpl
2881 close $aPlistFile
2882
2883 # Creating project.pbxproj file for toolkit.
2884 set aPbxprojFile [open "$aToolkitDir/project.pbxproj" "w"]
2885 puts $aPbxprojFile "// !\$*UTF8*\$!"
2886 puts $aPbxprojFile "\{"
2887 puts $aPbxprojFile "\tarchiveVersion = 1;"
2888 puts $aPbxprojFile "\tclasses = \{"
2889 puts $aPbxprojFile "\t\};"
2890 puts $aPbxprojFile "\tobjectVersion = 46;"
2891 puts $aPbxprojFile "\tobjects = \{\n"
2892
2893 # Begin PBXBuildFile section
2894 set aPackagesGuids ""
2895 set aGroupSection ""
2896 set aSrcFileRefSection ""
2897 set aSrcFileGuids ""
2898 set aDepsFileRefSection ""
2899 set aDepsGuids ""
2900 set aDepsRefGuids ""
2901 set anIncPaths [list "../../../inc"]
2902 set anLibPaths ""
2903
2904 if { [info exists ::env(CSF_OPT_INC)] } {
2905 set anIncCfg [split "$::env(CSF_OPT_INC)" ":"]
2906 foreach anIncCfgPath $anIncCfg {
2907 lappend anIncPaths $anIncCfgPath
2908 }
2909 }
2910 if { [info exists ::env(CSF_OPT_LIB64)] } {
2911 set anLibCfg [split "$::env(CSF_OPT_LIB64)" ":"]
2912 foreach anLibCfgPath $anLibCfg {
2913 lappend anLibPaths $anLibCfgPath
2914 }
2915 }
2916
2917 puts $aPbxprojFile [osutils:xcdtk:sources $theToolKit $theTargetType aSrcFileRefSection aGroupSection aPackagesGuids aSrcFileGuids aGuidsMap anIncPaths]
48ba1811 2918 puts $aPbxprojFile [osutils:xcdtk:deps $theToolKit $theTargetType aGuidsMap aDepsFileRefSection aDepsGuids aDepsRefGuids $thePlatform $theIsStatic]
c7d774c5 2919 # End PBXBuildFile section
2920
2921 # Begin PBXFileReference section
2922 set aToolkitLib "lib${theToolKit}.dylib"
2923 set aPath "$aToolkitLib"
2924 if { "$theTargetType" == "executable" } {
2925 set aPath "$theToolKit"
2926 } elseif { $theIsStatic == 1 } {
2927 set aToolkitLib "lib${theToolKit}.a"
2928 }
2929
2930 if { ! [info exists aGuidsMap($aToolkitLib)] } {
2931 set aGuidsMap($aToolkitLib) [OS:genGUID "xcd"]
2932 }
2933
2934 puts $aPbxprojFile "\t\t$aGuidsMap($aToolkitLib) = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.${theTargetType}\"; includeInIndex = 0; path = $aPath; sourceTree = BUILT_PRODUCTS_DIR; };\n"
2935 puts $aPbxprojFile $aSrcFileRefSection
2936 puts $aPbxprojFile $aDepsFileRefSection
2937 # End PBXFileReference section
2938
2939
2940 # Begin PBXFrameworksBuildPhase section
2941 set aTkFrameworks "${theToolKit}_Frameworks"
2942 if { ! [info exists aGuidsMap($aTkFrameworks)] } {
2943 set aGuidsMap($aTkFrameworks) [OS:genGUID "xcd"]
2944 }
2945
2946 puts $aPbxprojFile "\t\t$aGuidsMap($aTkFrameworks) = \{"
2947 puts $aPbxprojFile "\t\t\tisa = PBXFrameworksBuildPhase;"
2948 puts $aPbxprojFile "\t\t\tbuildActionMask = 2147483647;"
2949 puts $aPbxprojFile "\t\t\tfiles = ("
2950 puts $aPbxprojFile $aDepsGuids
2951 puts $aPbxprojFile "\t\t\t);"
2952 puts $aPbxprojFile "\t\t\trunOnlyForDeploymentPostprocessing = 0;"
2953 puts $aPbxprojFile "\t\t\};\n"
2954 # End PBXFrameworksBuildPhase section
2955
2956 # Begin PBXGroup section
2957 set aTkPBXGroup "${theToolKit}_PBXGroup"
2958 if { ! [info exists aGuidsMap($aTkPBXGroup)] } {
2959 set aGuidsMap($aTkPBXGroup) [OS:genGUID "xcd"]
2960 }
2961
2962 set aTkSrcGroup "${theToolKit}_SrcGroup"
2963 if { ! [info exists aGuidsMap($aTkSrcGroup)] } {
2964 set aGuidsMap($aTkSrcGroup) [OS:genGUID "xcd"]
2965 }
2966
2967 puts $aPbxprojFile $aGroupSection
2968 puts $aPbxprojFile "\t\t$aGuidsMap($aTkPBXGroup) = \{"
2969 puts $aPbxprojFile "\t\t\tisa = PBXGroup;"
2970 puts $aPbxprojFile "\t\t\tchildren = ("
2971 puts $aPbxprojFile $aDepsRefGuids
2972 puts $aPbxprojFile "\t\t\t\t$aGuidsMap($aTkSrcGroup) ,"
2973 puts $aPbxprojFile "\t\t\t\t$aGuidsMap($aToolkitLib) ,"
2974 puts $aPbxprojFile "\t\t\t);"
2975 puts $aPbxprojFile "\t\t\tsourceTree = \"<group>\";"
2976 puts $aPbxprojFile "\t\t\};"
2977 puts $aPbxprojFile "\t\t$aGuidsMap($aTkSrcGroup) = \{"
2978 puts $aPbxprojFile "\t\t\tisa = PBXGroup;"
2979 puts $aPbxprojFile "\t\t\tchildren = ("
2980 puts $aPbxprojFile $aPackagesGuids
2981 puts $aPbxprojFile "\t\t\t);"
2982 puts $aPbxprojFile "\t\t\tname = \"Source files\";"
2983 puts $aPbxprojFile "\t\t\tsourceTree = \"<group>\";"
2984 puts $aPbxprojFile "\t\t\};\n"
2985 # End PBXGroup section
2986
2987 # Begin PBXHeadersBuildPhase section
2988 set aTkHeaders "${theToolKit}_Headers"
2989 if { ! [info exists aGuidsMap($aTkHeaders)] } {
2990 set aGuidsMap($aTkHeaders) [OS:genGUID "xcd"]
2991 }
2992
2993 puts $aPbxprojFile "\t\t$aGuidsMap($aTkHeaders) = \{"
2994 puts $aPbxprojFile "\t\t\tisa = PBX${aPBXBuildPhase}BuildPhase;"
2995 puts $aPbxprojFile "\t\t\tbuildActionMask = 2147483647;"
2996 puts $aPbxprojFile "\t\t\tfiles = ("
2997 puts $aPbxprojFile "\t\t\t);"
2998 puts $aPbxprojFile "\t\t\trunOnlyForDeploymentPostprocessing = ${aRunOnlyForDeployment};"
2999 puts $aPbxprojFile "\t\t\};\n"
3000 # End PBXHeadersBuildPhase section
3001
3002 # Begin PBXNativeTarget section
3003 set aTkBuildCfgListNativeTarget "${theToolKit}_BuildCfgListNativeTarget"
3004 if { ! [info exists aGuidsMap($aTkBuildCfgListNativeTarget)] } {
3005 set aGuidsMap($aTkBuildCfgListNativeTarget) [OS:genGUID "xcd"]
3006 }
3007
3008 set aTkSources "${theToolKit}_Sources"
3009 if { ! [info exists aGuidsMap($aTkSources)] } {
3010 set aGuidsMap($aTkSources) [OS:genGUID "xcd"]
3011 }
3012
3013 puts $aPbxprojFile "\t\t$aGuidsMap($theToolKit) = \{"
3014 puts $aPbxprojFile "\t\t\tisa = PBXNativeTarget;"
3015 puts $aPbxprojFile "\t\t\tbuildConfigurationList = $aGuidsMap($aTkBuildCfgListNativeTarget) ;"
3016 puts $aPbxprojFile "\t\t\tbuildPhases = ("
3017 puts $aPbxprojFile "\t\t\t\t$aGuidsMap($aTkSources) ,"
3018 puts $aPbxprojFile "\t\t\t\t$aGuidsMap($aTkFrameworks) ,"
3019 puts $aPbxprojFile "\t\t\t\t$aGuidsMap($aTkHeaders) ,"
3020 puts $aPbxprojFile "\t\t\t);"
3021 puts $aPbxprojFile "\t\t\tbuildRules = ("
3022 puts $aPbxprojFile "\t\t\t);"
3023 puts $aPbxprojFile "\t\t\tdependencies = ("
3024 puts $aPbxprojFile "\t\t\t);"
3025 puts $aPbxprojFile "\t\t\tname = $theToolKit;"
3026 puts $aPbxprojFile "\t\t\tproductName = $theToolKit;"
3027 puts $aPbxprojFile "\t\t\tproductReference = $aGuidsMap($aToolkitLib) ;"
3028 puts $aPbxprojFile "\t\t\tproductType = \"com.apple.product-type.${aProductType}\";"
3029 puts $aPbxprojFile "\t\t\};\n"
3030 # End PBXNativeTarget section
3031
3032 # Begin PBXProject section
3033 set aTkProjectObj "${theToolKit}_ProjectObj"
3034 if { ! [info exists aGuidsMap($aTkProjectObj)] } {
3035 set aGuidsMap($aTkProjectObj) [OS:genGUID "xcd"]
3036 }
3037
3038 set aTkBuildCfgListProj "${theToolKit}_BuildCfgListProj"
3039 if { ! [info exists aGuidsMap($aTkBuildCfgListProj)] } {
3040 set aGuidsMap($aTkBuildCfgListProj) [OS:genGUID "xcd"]
3041 }
3042
3043 puts $aPbxprojFile "\t\t$aGuidsMap($aTkProjectObj) = \{"
3044 puts $aPbxprojFile "\t\t\tisa = PBXProject;"
3045 puts $aPbxprojFile "\t\t\tattributes = \{"
3046 puts $aPbxprojFile "\t\t\t\tLastUpgradeCheck = 0430;"
3047 puts $aPbxprojFile "\t\t\t\};"
3048 puts $aPbxprojFile "\t\t\tbuildConfigurationList = $aGuidsMap($aTkBuildCfgListProj) ;"
3049 puts $aPbxprojFile "\t\t\tcompatibilityVersion = \"Xcode 3.2\";"
3050 puts $aPbxprojFile "\t\t\tdevelopmentRegion = English;"
3051 puts $aPbxprojFile "\t\t\thasScannedForEncodings = 0;"
3052 puts $aPbxprojFile "\t\t\tknownRegions = ("
3053 puts $aPbxprojFile "\t\t\t\ten,"
3054 puts $aPbxprojFile "\t\t\t);"
3055 puts $aPbxprojFile "\t\t\tmainGroup = $aGuidsMap($aTkPBXGroup);"
3056 puts $aPbxprojFile "\t\t\tproductRefGroup = $aGuidsMap($aTkPBXGroup);"
3057 puts $aPbxprojFile "\t\t\tprojectDirPath = \"\";"
3058 puts $aPbxprojFile "\t\t\tprojectRoot = \"\";"
3059 puts $aPbxprojFile "\t\t\ttargets = ("
3060 puts $aPbxprojFile "\t\t\t\t$aGuidsMap($theToolKit) ,"
3061 puts $aPbxprojFile "\t\t\t);"
3062 puts $aPbxprojFile "\t\t\};\n"
3063 # End PBXProject section
3064
3065 # Begin PBXSourcesBuildPhase section
3066 puts $aPbxprojFile "\t\t$aGuidsMap($aTkSources) = \{"
3067 puts $aPbxprojFile "\t\t\tisa = PBXSourcesBuildPhase;"
3068 puts $aPbxprojFile "\t\t\tbuildActionMask = 2147483647;"
3069 puts $aPbxprojFile "\t\t\tfiles = ("
3070 puts $aPbxprojFile $aSrcFileGuids
3071 puts $aPbxprojFile "\t\t\t);"
3072 puts $aPbxprojFile "\t\t\trunOnlyForDeploymentPostprocessing = 0;"
3073 puts $aPbxprojFile "\t\t\};\n"
3074 # End PBXSourcesBuildPhase section
3075
3076 # Begin XCBuildConfiguration section
3077 set aTkDebugProject "${theToolKit}_DebugProject"
3078 if { ! [info exists aGuidsMap($aTkDebugProject)] } {
3079 set aGuidsMap($aTkDebugProject) [OS:genGUID "xcd"]
3080 }
3081
3082 set aTkReleaseProject "${theToolKit}_ReleaseProject"
3083 if { ! [info exists aGuidsMap($aTkReleaseProject)] } {
3084 set aGuidsMap($aTkReleaseProject) [OS:genGUID "xcd"]
3085 }
3086
3087 set aTkDebugNativeTarget "${theToolKit}_DebugNativeTarget"
3088 if { ! [info exists aGuidsMap($aTkDebugNativeTarget)] } {
3089 set aGuidsMap($aTkDebugNativeTarget) [OS:genGUID "xcd"]
3090 }
3091
3092 set aTkReleaseNativeTarget "${theToolKit}_ReleaseNativeTarget"
3093 if { ! [info exists aGuidsMap($aTkReleaseNativeTarget)] } {
3094 set aGuidsMap($aTkReleaseNativeTarget) [OS:genGUID "xcd"]
3095 }
3096
3097 # Debug target
3098 puts $aPbxprojFile "\t\t$aGuidsMap($aTkDebugProject) = \{"
3099 puts $aPbxprojFile "\t\t\tisa = XCBuildConfiguration;"
3100 puts $aPbxprojFile "\t\t\tbuildSettings = \{"
3101
3102 puts $aPbxprojFile "\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;"
3103 puts $aPbxprojFile "\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;"
3104 if { "$thePlatform" == "ios" } {
3105 puts $aPbxprojFile "\t\t\t\t\"ARCHS\[sdk=iphoneos\*\]\" = \"\$(ARCHS_STANDARD)\";";
3106 puts $aPbxprojFile "\t\t\t\t\"ARCHS\[sdk=iphonesimulator\*\]\" = \"x86_64\";";
c7d774c5 3107 puts $aPbxprojFile "\t\t\t\tCLANG_ENABLE_MODULES = YES;"
3108 puts $aPbxprojFile "\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;"
3109 }
3110 puts $aPbxprojFile "\t\t\t\tARCHS = \"\$(ARCHS_STANDARD_64_BIT)\";"
810b672f 3111 puts $aPbxprojFile "\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";"
3112 puts $aPbxprojFile "\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"c++0x\";"
c7d774c5 3113 puts $aPbxprojFile "\t\t\t\tCOPY_PHASE_STRIP = NO;"
3114 puts $aPbxprojFile "\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;"
3115 puts $aPbxprojFile "\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;"
3116 puts $aPbxprojFile "\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;"
3117 puts $aPbxprojFile "\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;"
3118 puts $aPbxprojFile "\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = ("
3119 puts $aPbxprojFile "\t\t\t\t\t\"DEBUG=1\","
3120 puts $aPbxprojFile "\t\t\t\t\t\"\$\(inherited\)\","
3121 puts $aPbxprojFile "\t\t\t\t);"
3122 puts $aPbxprojFile "\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;"
3123 puts $aPbxprojFile "\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;"
3124 puts $aPbxprojFile "\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;"
3125 puts $aPbxprojFile "\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;"
3126 puts $aPbxprojFile "\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;"
3127 puts $aPbxprojFile "\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;"
3128 puts $aPbxprojFile "\t\t\t\tOTHER_LDFLAGS = \"\$(CSF_OPT_LNK64D)\"; "
3129 if { "$thePlatform" == "ios" } {
3130 puts $aPbxprojFile "\t\t\t\tONLY_ACTIVE_ARCH = NO;"
3131 puts $aPbxprojFile "\t\t\t\tSDKROOT = iphoneos;"
3132 } else {
3133 puts $aPbxprojFile "\t\t\t\tONLY_ACTIVE_ARCH = YES;"
3134 }
3135 puts $aPbxprojFile "\t\t\t\};"
3136
3137 puts $aPbxprojFile "\t\t\tname = Debug;"
3138 puts $aPbxprojFile "\t\t\};"
3139
3140 # Release target
3141 puts $aPbxprojFile "\t\t$aGuidsMap($aTkReleaseProject) = \{"
3142 puts $aPbxprojFile "\t\t\tisa = XCBuildConfiguration;"
3143 puts $aPbxprojFile "\t\t\tbuildSettings = \{"
3144
3145 puts $aPbxprojFile "\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";"
3146 puts $aPbxprojFile "\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;"
3147 if { "$thePlatform" == "ios" } {
3148 puts $aPbxprojFile "\t\t\t\t\"ARCHS\[sdk=iphoneos\*\]\" = \"\$(ARCHS_STANDARD)\";";
3149 puts $aPbxprojFile "\t\t\t\t\"ARCHS\[sdk=iphonesimulator\*\]\" = \"x86_64\";";
c7d774c5 3150 puts $aPbxprojFile "\t\t\t\tCLANG_ENABLE_MODULES = YES;"
3151 puts $aPbxprojFile "\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;"
3152 }
3153 puts $aPbxprojFile "\t\t\t\tARCHS = \"\$(ARCHS_STANDARD_64_BIT)\";"
810b672f 3154 puts $aPbxprojFile "\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";"
3155 puts $aPbxprojFile "\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"c++0x\";"
c7d774c5 3156 puts $aPbxprojFile "\t\t\t\tCOPY_PHASE_STRIP = YES;"
3157 puts $aPbxprojFile "\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;"
3158 puts $aPbxprojFile "\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;"
3159 puts $aPbxprojFile "\t\t\t\tDEAD_CODE_STRIPPING = NO;"
3160 puts $aPbxprojFile "\t\t\t\tGCC_OPTIMIZATION_LEVEL = 2;"
3161 puts $aPbxprojFile "\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;"
3162 puts $aPbxprojFile "\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;"
3163 puts $aPbxprojFile "\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;"
3164 puts $aPbxprojFile "\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;"
3165 puts $aPbxprojFile "\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;"
3166 puts $aPbxprojFile "\t\t\t\tOTHER_LDFLAGS = \"\$(CSF_OPT_LNK64)\";"
3167 if { "$thePlatform" == "ios" } {
3168 puts $aPbxprojFile "\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 7.0;"
3169 puts $aPbxprojFile "\t\t\t\tSDKROOT = iphoneos;"
3170 }
3171 puts $aPbxprojFile "\t\t\t\};"
3172 puts $aPbxprojFile "\t\t\tname = Release;"
3173 puts $aPbxprojFile "\t\t\};"
3174 puts $aPbxprojFile "\t\t$aGuidsMap($aTkDebugNativeTarget) = \{"
3175 puts $aPbxprojFile "\t\t\tisa = XCBuildConfiguration;"
3176 puts $aPbxprojFile "\t\t\tbuildSettings = \{"
3177 puts $aPbxprojFile "${anExecExtension}"
3178 puts $aPbxprojFile "${anExecPrefix}"
3179 puts $aPbxprojFile "\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = ("
3180 foreach aMacro $aTKDefines {
3181 puts $aPbxprojFile "\t\t\t\t\t${aMacro} ,"
3182 }
3183 puts $aPbxprojFile "\t\t\t\t);"
3184
3185 puts $aPbxprojFile "\t\t\t\tHEADER_SEARCH_PATHS = ("
3186 foreach anIncPath $anIncPaths {
3187 puts $aPbxprojFile "\t\t\t\t\t${anIncPath},"
3188 }
3189 puts $aPbxprojFile "\t\t\t\t\t\"\$(CSF_OPT_INC)\","
3190 puts $aPbxprojFile "\t\t\t\t);"
3191
3192 puts $aPbxprojFile "\t\t\t\tLIBRARY_SEARCH_PATHS = ("
3193 foreach anLibPath $anLibPaths {
3194 puts $aPbxprojFile "\t\t\t\t\t${anLibPath},"
3195 }
3196 puts $aPbxprojFile "\t\t\t\t);"
3197
3198 puts $aPbxprojFile "\t\t\t\tOTHER_CFLAGS = ("
3199 puts $aPbxprojFile "\t\t\t\t\t\"\$(CSF_OPT_CMPL)\","
3200 puts $aPbxprojFile "\t\t\t\t);"
3201 puts $aPbxprojFile "\t\t\t\tOTHER_CPLUSPLUSFLAGS = ("
3202 puts $aPbxprojFile "\t\t\t\t\t\"\$(OTHER_CFLAGS)\","
3203 puts $aPbxprojFile "\t\t\t\t);"
3204 puts $aPbxprojFile "\t\t\t\tPRODUCT_NAME = \"\$(TARGET_NAME)\";"
3205 set anUserHeaderSearchPath "\t\t\t\tUSER_HEADER_SEARCH_PATHS = \""
3206 foreach anIncPath $anIncPaths {
3207 append anUserHeaderSearchPath " ${anIncPath}"
3208 }
3209 append anUserHeaderSearchPath "\";"
3210 puts $aPbxprojFile $anUserHeaderSearchPath
3211 puts $aPbxprojFile "${aWrapperExtension}"
3212 puts $aPbxprojFile "\t\t\t\};"
3213 puts $aPbxprojFile "\t\t\tname = Debug;"
3214 puts $aPbxprojFile "\t\t\};"
3215 puts $aPbxprojFile "\t\t$aGuidsMap($aTkReleaseNativeTarget) = \{"
3216 puts $aPbxprojFile "\t\t\tisa = XCBuildConfiguration;"
3217 puts $aPbxprojFile "\t\t\tbuildSettings = \{"
3218 puts $aPbxprojFile "${anExecExtension}"
3219 puts $aPbxprojFile "${anExecPrefix}"
3220 puts $aPbxprojFile "\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = ("
3221 foreach aMacro $aTKDefines {
3222 puts $aPbxprojFile "\t\t\t\t\t${aMacro} ,"
3223 }
3224 puts $aPbxprojFile "\t\t\t\t);"
3225 puts $aPbxprojFile "\t\t\t\tHEADER_SEARCH_PATHS = ("
3226 foreach anIncPath $anIncPaths {
3227 puts $aPbxprojFile "\t\t\t\t\t${anIncPath},"
3228 }
3229 puts $aPbxprojFile "\t\t\t\t\t\"\$(CSF_OPT_INC)\","
3230 puts $aPbxprojFile "\t\t\t\t);"
3231
3232 puts $aPbxprojFile "\t\t\t\tLIBRARY_SEARCH_PATHS = ("
3233 foreach anLibPath $anLibPaths {
3234 puts $aPbxprojFile "\t\t\t\t\t${anLibPath},"
3235 }
3236 puts $aPbxprojFile "\t\t\t\t);"
3237
3238 puts $aPbxprojFile "\t\t\t\tOTHER_CFLAGS = ("
3239 puts $aPbxprojFile "\t\t\t\t\t\"\$(CSF_OPT_CMPL)\","
3240 puts $aPbxprojFile "\t\t\t\t);"
3241 puts $aPbxprojFile "\t\t\t\tOTHER_CPLUSPLUSFLAGS = ("
3242 puts $aPbxprojFile "\t\t\t\t\t\"\$(OTHER_CFLAGS)\","
3243 puts $aPbxprojFile "\t\t\t\t);"
3244 puts $aPbxprojFile "\t\t\t\tPRODUCT_NAME = \"\$(TARGET_NAME)\";"
3245 puts $aPbxprojFile $anUserHeaderSearchPath
3246 puts $aPbxprojFile "${aWrapperExtension}"
3247 puts $aPbxprojFile "\t\t\t\};"
3248 puts $aPbxprojFile "\t\t\tname = Release;"
3249 puts $aPbxprojFile "\t\t\};\n"
3250 # End XCBuildConfiguration section
3251
3252 # Begin XCConfigurationList section
3253 puts $aPbxprojFile "\t\t$aGuidsMap($aTkBuildCfgListProj) = \{"
3254 puts $aPbxprojFile "\t\t\tisa = XCConfigurationList;"
3255 puts $aPbxprojFile "\t\tbuildConfigurations = ("
3256 puts $aPbxprojFile "\t\t\t\t$aGuidsMap($aTkDebugProject) ,"
3257 puts $aPbxprojFile "\t\t\t\t$aGuidsMap($aTkReleaseProject) ,"
3258 puts $aPbxprojFile "\t\t\t);"
3259 puts $aPbxprojFile "\t\t\tdefaultConfigurationIsVisible = 0;"
3260 puts $aPbxprojFile "\t\t\tdefaultConfigurationName = Release;"
3261 puts $aPbxprojFile "\t\t\};"
3262 puts $aPbxprojFile "\t\t$aGuidsMap($aTkBuildCfgListNativeTarget) = \{"
3263 puts $aPbxprojFile "\t\t\tisa = XCConfigurationList;"
3264 puts $aPbxprojFile "\t\t\tbuildConfigurations = ("
3265 puts $aPbxprojFile "\t\t\t\t$aGuidsMap($aTkDebugNativeTarget) ,"
3266 puts $aPbxprojFile "\t\t\t\t$aGuidsMap($aTkReleaseNativeTarget) ,"
3267 puts $aPbxprojFile "\t\t\t);"
3268 puts $aPbxprojFile "\t\t\tdefaultConfigurationIsVisible = 0;"
3269 puts $aPbxprojFile "\t\t\tdefaultConfigurationName = Release;"
3270 puts $aPbxprojFile "\t\t\};\n"
3271 # End XCConfigurationList section
3272
3273 puts $aPbxprojFile "\t\};"
3274 puts $aPbxprojFile "\trootObject = $aGuidsMap($aTkProjectObj) ;"
3275 puts $aPbxprojFile "\}"
3276
3277 close $aPbxprojFile
3278}
3279
3280proc osutils:xcdx { theOutDir theExecutable theGuidsMap } {
3281 set aUsername [exec whoami]
3282
3283 # Creating folders for Xcode project file.
3284 set anExecutableDir "${theOutDir}/${theExecutable}.xcodeproj"
3285 wokUtils:FILES:mkdir $anExecutableDir
3286 if { ! [file exists $anExecutableDir] } {
3287 puts stderr "Error: Could not create project directory \"$anExecutableDir\""
3288 return
3289 }
3290
3291 set aUserDataDir "${anExecutableDir}/xcuserdata"
3292 wokUtils:FILES:mkdir $aUserDataDir
3293 if { ! [file exists $aUserDataDir] } {
3294 puts stderr "Error: Could not create xcuserdata directorty in \"$anExecutableDir\""
3295 return
3296 }
3297
3298 set aUserDataDir "${aUserDataDir}/${aUsername}.xcuserdatad"
3299 wokUtils:FILES:mkdir $aUserDataDir
3300 if { ! [file exists $aUserDataDir] } {
3301 puts stderr "Error: Could not create ${aUsername}.xcuserdatad directorty in \"$anExecutableDir\"/xcuserdata"
3302 return
3303 }
3304
3305 set aSchemesDir "${aUserDataDir}/xcschemes"
3306 wokUtils:FILES:mkdir $aSchemesDir
3307 if { ! [file exists $aSchemesDir] } {
3308 puts stderr "Error: Could not create xcschemes directorty in \"$aUserDataDir\""
3309 return
3310 }
3311 # End folders creation.
3312
3313 # Generating GUID for tookit.
3314 upvar $theGuidsMap aGuidsMap
3315 if { ! [info exists aGuidsMap($theExecutable)] } {
3316 set aGuidsMap($theExecutable) [OS:genGUID "xcd"]
3317 }
3318
3319 # Creating xcscheme file for toolkit from template.
3320 set aXcschemeTmpl [osutils:readtemplate "xcscheme" "xcode"]
3321 regsub -all -- {__TOOLKIT_NAME__} $aXcschemeTmpl $theExecutable aXcschemeTmpl
3322 regsub -all -- {__TOOLKIT_GUID__} $aXcschemeTmpl $aGuidsMap($theExecutable) aXcschemeTmpl
3323 set aXcschemeFile [open "$aSchemesDir/${theExecutable}.xcscheme" "w"]
3324 puts $aXcschemeFile $aXcschemeTmpl
3325 close $aXcschemeFile
3326
3327 # Creating xcschememanagement.plist file for toolkit from template.
3328 set aPlistTmpl [osutils:readtemplate "plist" "xcode"]
3329 regsub -all -- {__TOOLKIT_NAME__} $aPlistTmpl $theExecutable aPlistTmpl
3330 regsub -all -- {__TOOLKIT_GUID__} $aPlistTmpl $aGuidsMap($theExecutable) aPlistTmpl
3331 set aPlistFile [open "$aSchemesDir/xcschememanagement.plist" "w"]
3332 puts $aPlistFile $aPlistTmpl
3333 close $aPlistFile
3334}
7fbac3c2 3335
3336# Returns available Windows SDKs versions
3337proc osutils:sdk { theSdkMajorVer {isQuietMode false} {theSdkDirectories {}} } {
3338 if { ![llength ${theSdkDirectories}] } {
3339 foreach anEnvVar { "ProgramFiles" "ProgramFiles\(x86\)" "ProgramW6432" } {
3340 if {[ info exists ::env(${anEnvVar}) ]} {
3341 lappend theSdkDirectories "$::env(${anEnvVar})/Windows Kits/${theSdkMajorVer}/Include"
3342 }
3343 }
3344 }
3345
3346 set sdk_versions {}
3347 foreach sdk_dir ${theSdkDirectories} {
3348 if { [file isdirectory ${sdk_dir}] } {
3349 lappend sdk_versions [glob -tails -directory "${sdk_dir}" -type d *]
3350 }
3351 }
3352
3353 if {![llength ${sdk_versions}] && !${isQuietMode}} {
3354 error "Error : Could not find Windows SDK ${theSdkMajorVer}"
3355 }
3356
3357 return [join [lsort -unique ${sdk_versions}] " "]
3358}
3359
3360# Generate global properties to Visual Studio project file for UWP solution
d6cda17a 3361proc osutils:uwp:proj { isUWP theProjTmpl } {
7fbac3c2 3362
3363 set uwp_properties ""
3364 set uwp_generate_metadata ""
3365 set uwp_app_container ""
3366
3367 set format_template ""
3368
d6cda17a 3369 if { $isUWP } {
7fbac3c2 3370 set sdk_versions [osutils:sdk 10]
3371 set sdk_max_ver [lindex ${sdk_versions} end]
3372
3373 set uwp_properties "<DefaultLanguage>en-US</DefaultLanguage>\n \
3374<ApplicationType>Windows Store</ApplicationType>\n \
3375<ApplicationTypeRevision>10.0</ApplicationTypeRevision>\n \
3376<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>\n \
3377<AppContainerApplication>true</AppContainerApplication>\n \
3378<WindowsTargetPlatformVersion>${sdk_max_ver}</WindowsTargetPlatformVersion>\n \
3379<WindowsTargetPlatformMinVersion>${sdk_max_ver}</WindowsTargetPlatformMinVersion>"
3380
3381 set uwp_generate_metadata "<GenerateWindowsMetadata>false</GenerateWindowsMetadata>"
3382
3383 regsub -all -- {[\r\n\s]*<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>} ${theProjTmpl} "" theProjTmpl
3384 } else {
3385 set format_template "\[\\r\\n\\s\]*"
3386 }
3387
3388 regsub -all -- "${format_template}__UWP_PROPERTIES__" ${theProjTmpl} "${uwp_properties}" theProjTmpl
3389 regsub -all -- "${format_template}__UWP_GENERATE_METADATA__" ${theProjTmpl} "${uwp_generate_metadata}" theProjTmpl
3390
3391 return ${theProjTmpl}
3392}
5da3dfdf 3393
3394# Report all files found in package directory but not listed in FILES
3395proc osutils:checksrcfiles { theUnit } {
3396 global path
3397 set aCasRoot [file normalize ${path}]
3398
3399 if {![file isdirectory ${aCasRoot}]} {
3400 puts "OCCT directory is not defined correctly: ${aCasRoot}"
3401 return
3402 }
3403
3404 set anUnitAbsPath [file normalize "${aCasRoot}/src/${theUnit}"]
3405
3406 if {[file exists "${anUnitAbsPath}/FILES"]} {
3407 set aFilesFile [open "${anUnitAbsPath}/FILES" rb]
3408 set aFilesFileList [split [read ${aFilesFile}] "\n"]
3409 close ${aFilesFile}
3410
3411 set aFilesFileList [lsearch -inline -all -not -exact ${aFilesFileList} ""]
3412
3413 # report all files not listed in FILES
3414 set anAllFiles [glob -tails -nocomplain -dir ${anUnitAbsPath} "*"]
3415 foreach aFile ${anAllFiles} {
3416 if { "${aFile}" == "FILES" } {
3417 continue
3418 }
3419 if { [lsearch -exact ${aFilesFileList} ${aFile}] == -1 } {
3420 puts "Warning: file ${anUnitAbsPath}/${aFile} is not listed in ${anUnitAbsPath}/FILES!"
3421 }
3422 }
3423 }
3424}