| 1 | # ======================================================================= |
| 2 | # Created on: 2012-01-26 |
| 3 | # Created by: Kirill GAVRILOV |
| 4 | # Copyright (c) 2012 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 | # Tools for search of third-party libraries and generation on environment |
| 19 | # customization script |
| 20 | # ======================================================================= |
| 21 | |
| 22 | set ARCH "64" |
| 23 | |
| 24 | if { "$tcl_platform(platform)" == "unix" } { |
| 25 | set SYS_PATH_SPLITTER ":" |
| 26 | set SYS_LIB_PREFIX "lib" |
| 27 | set SYS_EXE_SUFFIX "" |
| 28 | if { "$tcl_platform(os)" == "Darwin" } { |
| 29 | set SYS_LIB_SUFFIX "dylib" |
| 30 | } else { |
| 31 | set SYS_LIB_SUFFIX "so" |
| 32 | } |
| 33 | set VCVER "gcc" |
| 34 | set VCVARS "" |
| 35 | } elseif { "$tcl_platform(platform)" == "windows" } { |
| 36 | set SYS_PATH_SPLITTER ";" |
| 37 | set SYS_LIB_PREFIX "" |
| 38 | set SYS_LIB_SUFFIX "lib" |
| 39 | set SYS_EXE_SUFFIX ".exe" |
| 40 | set VCVER "vc10" |
| 41 | set VCVARS "" |
| 42 | } |
| 43 | |
| 44 | set SHORTCUT_HEADERS "ShortCut" |
| 45 | |
| 46 | set PRODUCTS_PATH "" |
| 47 | set CSF_OPT_INC [list] |
| 48 | set CSF_OPT_LIB32 [list] |
| 49 | set CSF_OPT_LIB64 [list] |
| 50 | set CSF_OPT_BIN32 [list] |
| 51 | set CSF_OPT_BIN64 [list] |
| 52 | |
| 53 | if { "$tcl_platform(pointerSize)" == "4" } { |
| 54 | set ARCH "32" |
| 55 | } |
| 56 | if { [info exists ::env(ARCH)] } { |
| 57 | set ARCH "$::env(ARCH)" |
| 58 | } |
| 59 | |
| 60 | if { [info exists ::env(SHORTCUT_HEADERS)] } { |
| 61 | set SHORTCUT_HEADERS "$::env(SHORTCUT_HEADERS)" |
| 62 | if { $SHORTCUT_HEADERS == "true" } { |
| 63 | set SHORTCUT_HEADERS "ShortCut" |
| 64 | } |
| 65 | } |
| 66 | |
| 67 | # fetch environment variables (e.g. set by custom.sh or custom.bat) and set them as tcl variables with the same name |
| 68 | set THE_ENV_VARIABLES {HAVE_FREEIMAGE HAVE_FFMPEG HAVE_TBB HAVE_GLES2 HAVE_D3D HAVE_VTK HAVE_GL2PS HAVE_ZLIB HAVE_LIBLZMA HAVE_OPENCL CHECK_QT4 CHECK_JDK MACOSX_USE_GLX HAVE_RelWithDebInfo} |
| 69 | foreach anEnvIter $THE_ENV_VARIABLES { |
| 70 | set ${anEnvIter} "false" |
| 71 | if { [info exists ::env(${anEnvIter})] } { |
| 72 | set ${anEnvIter} "$::env(${anEnvIter})" |
| 73 | } |
| 74 | } |
| 75 | # do not export platform-specific variables |
| 76 | if { "$::tcl_platform(os)" == "Darwin" } { |
| 77 | set HAVE_GLES2 "" |
| 78 | } else { |
| 79 | set MACOSX_USE_GLX "" |
| 80 | } |
| 81 | if { "$tcl_platform(platform)" != "windows" } { |
| 82 | set HAVE_D3D "" |
| 83 | set HAVE_RelWithDebInfo "" |
| 84 | } |
| 85 | foreach anEnvIter {ARCH VCVER VCVARS PRODUCTS_PATH} { |
| 86 | if { [info exists ::env(${anEnvIter})] } { |
| 87 | set ${anEnvIter} "$::env(${anEnvIter})" |
| 88 | } |
| 89 | } |
| 90 | |
| 91 | if { [info exists ::env(CSF_OPT_INC)] } { |
| 92 | set CSF_OPT_INC [split "$::env(CSF_OPT_INC)" $::SYS_PATH_SPLITTER] |
| 93 | } |
| 94 | if { [info exists ::env(CSF_OPT_LIB32)] } { |
| 95 | set CSF_OPT_LIB32 [split "$::env(CSF_OPT_LIB32)" $::SYS_PATH_SPLITTER] |
| 96 | } |
| 97 | if { [info exists ::env(CSF_OPT_LIB64)] } { |
| 98 | set CSF_OPT_LIB64 [split "$::env(CSF_OPT_LIB64)" $::SYS_PATH_SPLITTER] |
| 99 | } |
| 100 | if { [info exists ::env(CSF_OPT_BIN32)] } { |
| 101 | set CSF_OPT_BIN32 [split "$::env(CSF_OPT_BIN32)" $::SYS_PATH_SPLITTER] |
| 102 | } |
| 103 | if { [info exists ::env(CSF_OPT_BIN64)] } { |
| 104 | set CSF_OPT_BIN64 [split "$::env(CSF_OPT_BIN64)" $::SYS_PATH_SPLITTER] |
| 105 | } |
| 106 | |
| 107 | # Search header file in $::CSF_OPT_INC and standard paths |
| 108 | proc wokdep:SearchHeader {theHeader} { |
| 109 | # search in custom paths |
| 110 | foreach anIncPath $::CSF_OPT_INC { |
| 111 | set aPath "${anIncPath}/${theHeader}" |
| 112 | if { [file exists "$aPath"] } { |
| 113 | return "$aPath" |
| 114 | } |
| 115 | } |
| 116 | |
| 117 | # search in system |
| 118 | set aPath "/usr/include/${theHeader}" |
| 119 | if { [file exists "$aPath"] } { |
| 120 | return "$aPath" |
| 121 | } |
| 122 | return "" |
| 123 | } |
| 124 | |
| 125 | # Search library file in $::CSF_OPT_LIB* and standard paths |
| 126 | proc wokdep:SearchLib {theLib theBitness {theSearchPath ""}} { |
| 127 | if { "$theSearchPath" != "" } { |
| 128 | set aPath "${theSearchPath}/${::SYS_LIB_PREFIX}${theLib}.${::SYS_LIB_SUFFIX}" |
| 129 | if { [file exists "$aPath"] } { |
| 130 | return "$aPath" |
| 131 | } else { |
| 132 | return "" |
| 133 | } |
| 134 | } |
| 135 | |
| 136 | # search in custom paths |
| 137 | foreach aLibPath [set ::CSF_OPT_LIB$theBitness] { |
| 138 | set aPath "${aLibPath}/${::SYS_LIB_PREFIX}${theLib}.${::SYS_LIB_SUFFIX}" |
| 139 | if { [file exists "$aPath"] } { |
| 140 | return "$aPath" |
| 141 | } |
| 142 | } |
| 143 | |
| 144 | # search in system |
| 145 | if { "$::ARCH" == "$theBitness"} { |
| 146 | set aPath "/usr/lib/${::SYS_LIB_PREFIX}${theLib}.${::SYS_LIB_SUFFIX}" |
| 147 | if { [file exists "$aPath"] } { |
| 148 | return "$aPath" |
| 149 | } |
| 150 | } |
| 151 | |
| 152 | |
| 153 | if { "$::tcl_platform(os)" == "Linux" } { |
| 154 | if { "$theBitness" == "64" } { |
| 155 | set aPath "/usr/lib/x86_64-linux-gnu/lib${theLib}.so" |
| 156 | if { [file exists "$aPath"] } { |
| 157 | return "$aPath" |
| 158 | } |
| 159 | } else { |
| 160 | set aPath "/usr/lib/i386-linux-gnu/lib${theLib}.so" |
| 161 | if { [file exists "$aPath"] } { |
| 162 | return "$aPath" |
| 163 | } |
| 164 | } |
| 165 | } |
| 166 | |
| 167 | return "" |
| 168 | } |
| 169 | |
| 170 | # Search file in $::CSF_OPT_BIN* and standard paths |
| 171 | proc wokdep:SearchBin {theBin theBitness {theSearchPath ""}} { |
| 172 | if { "$theSearchPath" != "" } { |
| 173 | set aPath "${theSearchPath}/${theBin}" |
| 174 | if { [file exists "$aPath"] } { |
| 175 | return "$aPath" |
| 176 | } else { |
| 177 | return "" |
| 178 | } |
| 179 | } |
| 180 | |
| 181 | # search in custom paths |
| 182 | foreach aBinPath [set ::CSF_OPT_BIN$theBitness] { |
| 183 | set aPath "${aBinPath}/${theBin}" |
| 184 | if { [file exists "$aPath"] } { |
| 185 | return "$aPath" |
| 186 | } |
| 187 | } |
| 188 | |
| 189 | # search in system |
| 190 | if { "$::ARCH" == "$theBitness"} { |
| 191 | set aPath "/usr/bin/${theBin}" |
| 192 | if { [file exists "$aPath"] } { |
| 193 | return "$aPath" |
| 194 | } |
| 195 | } |
| 196 | |
| 197 | return "" |
| 198 | } |
| 199 | |
| 200 | # Detect compiler C-runtime version 'vc*' and architecture '32'/'64' |
| 201 | # to determine preferred path. |
| 202 | proc wokdep:Preferred {theList theCmpl theArch} { |
| 203 | if { [llength $theList] == 0 } { |
| 204 | return "" |
| 205 | } |
| 206 | |
| 207 | # keep only two first digits in "vc141" |
| 208 | if { ! [regexp {^vc[0-9][0-9]} $theCmpl aCmpl] } { |
| 209 | set aCmpl $theCmpl |
| 210 | } |
| 211 | |
| 212 | set aShortList {} |
| 213 | foreach aPath $theList { |
| 214 | if { [string first "$aCmpl" "$aPath"] != "-1" } { |
| 215 | lappend aShortList "$aPath" |
| 216 | } |
| 217 | } |
| 218 | |
| 219 | if { [llength $aShortList] == 0 } { |
| 220 | #return [lindex $theList 0] |
| 221 | set aShortList $theList |
| 222 | } |
| 223 | |
| 224 | set aVeryShortList {} |
| 225 | foreach aPath $aShortList { |
| 226 | if { [string first "$theArch" "$aPath"] != "-1" } { |
| 227 | lappend aVeryShortList "$aPath" |
| 228 | } |
| 229 | } |
| 230 | if { [llength $aVeryShortList] == 0 } { |
| 231 | return [lindex [lsort -decreasing $aShortList] 0] |
| 232 | } |
| 233 | |
| 234 | return [lindex [lsort -decreasing $aVeryShortList] 0] |
| 235 | } |
| 236 | |
| 237 | # Search library placement |
| 238 | proc wokdep:SearchStandardLibrary {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64 theName theCheckHeader theCheckLib theCheckFolders} { |
| 239 | upvar $theErrInc anErrInc |
| 240 | upvar $theErrLib32 anErrLib32 |
| 241 | upvar $theErrLib64 anErrLib64 |
| 242 | upvar $theErrBin32 anErrBin32 |
| 243 | upvar $theErrBin64 anErrBin64 |
| 244 | |
| 245 | set isFound "true" |
| 246 | set aHeaderPath [wokdep:SearchHeader "$theCheckHeader"] |
| 247 | if { "$aHeaderPath" == "" } { |
| 248 | set hasHeader false |
| 249 | foreach aFolderIter $theCheckFolders { |
| 250 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{$aFolderIter}*] "$::VCVER" "$::ARCH" ] |
| 251 | if { "$aPath" != "" && [file exists "$aPath/include/$theCheckHeader"] } { |
| 252 | lappend ::CSF_OPT_INC "$aPath/include" |
| 253 | set hasHeader true |
| 254 | break |
| 255 | } |
| 256 | } |
| 257 | if { !$hasHeader } { |
| 258 | lappend anErrInc "Error: '$theCheckHeader' not found ($theName)" |
| 259 | set isFound "false" |
| 260 | } |
| 261 | } |
| 262 | |
| 263 | foreach anArchIter {64 32} { |
| 264 | set aLibPath [wokdep:SearchLib "$theCheckLib" "$anArchIter"] |
| 265 | if { "$aLibPath" == "" } { |
| 266 | set hasLib false |
| 267 | foreach aFolderIter $theCheckFolders { |
| 268 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{$aFolderIter}*] "$::VCVER" "$anArchIter" ] |
| 269 | set aLibPath [wokdep:SearchLib "$theCheckLib" "$anArchIter" "$aPath/lib"] |
| 270 | if { "$aLibPath" != "" } { |
| 271 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib" |
| 272 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" |
| 273 | set hasLib true |
| 274 | break |
| 275 | } |
| 276 | } |
| 277 | if { !$hasLib } { |
| 278 | lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}$theCheckLib.${::SYS_LIB_SUFFIX}' not found ($theName)" |
| 279 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 280 | } |
| 281 | } |
| 282 | |
| 283 | if { "$::tcl_platform(platform)" == "windows" } { |
| 284 | set aDllPath [wokdep:SearchBin "$theCheckLib.dll" "$anArchIter"] |
| 285 | if { "$aDllPath" == "" } { |
| 286 | set hasDll false |
| 287 | foreach aFolderIter $theCheckFolders { |
| 288 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{$aFolderIter}*] "$::VCVER" "$anArchIter" ] |
| 289 | set aDllPath [wokdep:SearchBin "$theCheckLib.dll" "$anArchIter" "$aPath/bin"] |
| 290 | if { "$aDllPath" != "" } { |
| 291 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" |
| 292 | set hasDll true |
| 293 | break |
| 294 | } else { |
| 295 | set aDllPath [wokdep:SearchBin "$theCheckLib.dll" "$anArchIter" "$aPath/lib"] |
| 296 | if { "$aDllPath" != "" } { |
| 297 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/lib" |
| 298 | set hasDll true |
| 299 | break |
| 300 | } |
| 301 | } |
| 302 | } |
| 303 | if { !$hasDll } { |
| 304 | lappend anErrBin$anArchIter "Error: '$theCheckLib.dll' not found ($theName)" |
| 305 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 306 | } |
| 307 | } |
| 308 | } |
| 309 | } |
| 310 | |
| 311 | return "$isFound" |
| 312 | } |
| 313 | |
| 314 | # Search Tcl/Tk libraries placement |
| 315 | proc wokdep:SearchTclTk {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { |
| 316 | upvar $theErrInc anErrInc |
| 317 | upvar $theErrLib32 anErrLib32 |
| 318 | upvar $theErrLib64 anErrLib64 |
| 319 | upvar $theErrBin32 anErrBin32 |
| 320 | upvar $theErrBin64 anErrBin64 |
| 321 | |
| 322 | set tclver_maj 8 |
| 323 | set tclver_min 6 |
| 324 | |
| 325 | set isFound "true" |
| 326 | set aTclHPath [wokdep:SearchHeader "tcl.h"] |
| 327 | set aTkHPath [wokdep:SearchHeader "tk.h"] |
| 328 | if { "$aTclHPath" == "" || "$aTkHPath" == "" } { |
| 329 | if { [file exists "/usr/include/tcl8.6/tcl.h"] |
| 330 | && [file exists "/usr/include/tcl8.6/tk.h" ] } { |
| 331 | lappend ::CSF_OPT_INC "/usr/include/tcl8.6" |
| 332 | set aTclHPath "/usr/include/tcl8.6/tcl.h" |
| 333 | } else { |
| 334 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{tcl}*] "$::VCVER" "$::ARCH" ] |
| 335 | if { "$aPath" != "" && [file exists "$aPath/include/tcl.h"] && [file exists "$aPath/include/tk.h"] } { |
| 336 | lappend ::CSF_OPT_INC "$aPath/include" |
| 337 | set aTclHPath "$aPath/include/tcl.h" |
| 338 | } else { |
| 339 | lappend anErrInc "Error: 'tcl.h' or 'tk.h' not found (Tcl/Tk)" |
| 340 | set isFound "false" |
| 341 | } |
| 342 | } |
| 343 | } |
| 344 | |
| 345 | # detect tcl version by parsing header file |
| 346 | if { $isFound } { |
| 347 | set fh [open $aTclHPath] |
| 348 | set tcl_h [read $fh] |
| 349 | close $fh |
| 350 | regexp {define\s+TCL_MAJOR_VERSION\s+([0-9]+)} $tcl_h dummy tclver_maj |
| 351 | regexp {define\s+TCL_MINOR_VERSION\s+([0-9]+)} $tcl_h dummy tclver_min |
| 352 | } |
| 353 | |
| 354 | if { "$::tcl_platform(platform)" == "windows" } { |
| 355 | set aTclLibName "tcl${tclver_maj}${tclver_min}" |
| 356 | set aTkLibName "tk${tclver_maj}${tclver_min}" |
| 357 | } else { |
| 358 | set aTclLibName "tcl${tclver_maj}.${tclver_min}" |
| 359 | set aTkLibName "tk${tclver_maj}.${tclver_min}" |
| 360 | } |
| 361 | |
| 362 | foreach anArchIter {64 32} { |
| 363 | set aTclLibPath [wokdep:SearchLib "$aTclLibName" "$anArchIter"] |
| 364 | set aTkLibPath [wokdep:SearchLib "$aTkLibName" "$anArchIter"] |
| 365 | if { "$aTclLibPath" == "" || "$aTkLibPath" == "" } { |
| 366 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{tcl}*] "$::VCVER" "$anArchIter" ] |
| 367 | set aTclLibPath [wokdep:SearchLib "$aTclLibName" "$anArchIter" "$aPath/lib"] |
| 368 | set aTkLibPath [wokdep:SearchLib "$aTkLibName" "$anArchIter" "$aPath/lib"] |
| 369 | if { "$aTclLibPath" != "" && "$aTkLibPath" != "" } { |
| 370 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib" |
| 371 | } else { |
| 372 | lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}${aTclLibName}.${::SYS_LIB_SUFFIX}' or '${::SYS_LIB_PREFIX}${aTkLibName}.${::SYS_LIB_SUFFIX}' not found (Tcl/Tk)" |
| 373 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 374 | } |
| 375 | } |
| 376 | |
| 377 | if { "$::tcl_platform(platform)" == "windows" } { |
| 378 | set aTclDllPath [wokdep:SearchBin "${aTclLibName}.dll" "$anArchIter"] |
| 379 | set aTkDllPath [wokdep:SearchBin "${aTkLibName}.dll" "$anArchIter"] |
| 380 | if { "$aTclDllPath" == "" || "$aTkDllPath" == "" } { |
| 381 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{tcl}*] "$::VCVER" "$anArchIter" ] |
| 382 | set aTclDllPath [wokdep:SearchBin "${aTclLibName}.dll" "$anArchIter" "$aPath/bin"] |
| 383 | set aTkDllPath [wokdep:SearchBin "${aTkLibName}.dll" "$anArchIter" "$aPath/bin"] |
| 384 | if { "$aTclDllPath" != "" && "$aTkDllPath" != "" } { |
| 385 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" |
| 386 | } else { |
| 387 | lappend anErrBin$anArchIter "Error: '${aTclLibName}.dll' or '${aTkLibName}.dll' not found (Tcl/Tk)" |
| 388 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 389 | } |
| 390 | } |
| 391 | } |
| 392 | } |
| 393 | |
| 394 | return "$isFound" |
| 395 | } |
| 396 | |
| 397 | # Search FreeType library placement |
| 398 | proc wokdep:SearchFreeType {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { |
| 399 | upvar $theErrInc anErrInc |
| 400 | upvar $theErrLib32 anErrLib32 |
| 401 | upvar $theErrLib64 anErrLib64 |
| 402 | upvar $theErrBin32 anErrBin32 |
| 403 | upvar $theErrBin64 anErrBin64 |
| 404 | |
| 405 | set isFound "true" |
| 406 | set aFtBuildPath [wokdep:SearchHeader "ft2build.h"] |
| 407 | |
| 408 | if { "$aFtBuildPath" == "" } { |
| 409 | # TODO - use `freetype-config --cflags` instead |
| 410 | set aSysFreeType "/usr/include/freetype2" |
| 411 | if { [file exists "$aSysFreeType/ft2build.h"] } { |
| 412 | lappend ::CSF_OPT_INC "$aSysFreeType" |
| 413 | } elseif { [file exists "$aSysFreeType/freetype2/ft2build.h"] } { |
| 414 | lappend ::CSF_OPT_INC "$aSysFreeType/freetype2" |
| 415 | } else { |
| 416 | set aSysFreeType "/usr/X11/include/freetype2" |
| 417 | if { [file exists "$aSysFreeType/ft2build.h"] } { |
| 418 | lappend ::CSF_OPT_INC "/usr/X11/include" |
| 419 | lappend ::CSF_OPT_INC "$aSysFreeType" |
| 420 | } else { |
| 421 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{freetype}*] "$::VCVER" "$::ARCH" ] |
| 422 | if {"$aPath" != ""} { |
| 423 | if {[file exists "$aPath/include/ft2build.h"]} { |
| 424 | lappend ::CSF_OPT_INC "$aPath/include" |
| 425 | } elseif {[file exists "$aPath/include/freetype2/ft2build.h"]} { |
| 426 | lappend ::CSF_OPT_INC "$aPath/include/freetype2" |
| 427 | } |
| 428 | } else { |
| 429 | lappend anErrInc "Error: 'freetype.h' not found (FreeType2)" |
| 430 | set isFound "false" |
| 431 | } |
| 432 | } |
| 433 | } |
| 434 | } |
| 435 | |
| 436 | # parse 'freetype-config --libs' |
| 437 | set aConfLibPath "" |
| 438 | if { [catch { set aConfLibs [exec freetype-config --libs] } ] == 0 } { |
| 439 | foreach aPath [split $aConfLibs " "] { |
| 440 | if { [string first "-L" "$aPath"] == 0 } { |
| 441 | set aConfLibPath [string range "$aPath" 2 [string length "$aPath"]] |
| 442 | } |
| 443 | } |
| 444 | } |
| 445 | |
| 446 | foreach anArchIter {64 32} { |
| 447 | set aFtLibPath [wokdep:SearchLib "freetype" "$anArchIter"] |
| 448 | if { "$aFtLibPath" == "" } { |
| 449 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{freetype}*] "$::VCVER" "$anArchIter" ] |
| 450 | set aFtLibPath [wokdep:SearchLib "freetype" "$anArchIter" "$aPath/lib"] |
| 451 | if { "$aFtLibPath" != "" } { |
| 452 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib" |
| 453 | } else { |
| 454 | set aFtLibPath [wokdep:SearchLib "freetype" "$anArchIter" "$aConfLibPath"] |
| 455 | if { "$aFtLibPath" != "" } { |
| 456 | lappend ::CSF_OPT_LIB$anArchIter "$aConfLibPath" |
| 457 | } else { |
| 458 | lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}freetype.${::SYS_LIB_SUFFIX}' not found (FreeType2)" |
| 459 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 460 | } |
| 461 | } |
| 462 | } |
| 463 | if { "$::tcl_platform(platform)" == "windows" } { |
| 464 | set aFtDllPath [wokdep:SearchBin "freetype.dll" "$anArchIter"] |
| 465 | if { "$aFtDllPath" == "" } { |
| 466 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{freetype}*] "$::VCVER" "$anArchIter" ] |
| 467 | set aFtDllPath [wokdep:SearchBin "freetype.dll" "$anArchIter" "$aPath/bin"] |
| 468 | if { "$aFtDllPath" != "" } { |
| 469 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" |
| 470 | } else { |
| 471 | set aFtDllPath [wokdep:SearchBin "freetype.dll" "$anArchIter" "$aPath/lib"] |
| 472 | if { "$aFtDllPath" != "" } { |
| 473 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/lib" |
| 474 | } else { |
| 475 | lappend anErrBin$anArchIter "Error: 'freetype.dll' not found (FreeType2)" |
| 476 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 477 | } |
| 478 | } |
| 479 | } |
| 480 | } |
| 481 | } |
| 482 | |
| 483 | return "$isFound" |
| 484 | } |
| 485 | |
| 486 | # Search FreeImage library placement |
| 487 | proc wokdep:SearchFreeImage {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { |
| 488 | upvar $theErrInc anErrInc |
| 489 | upvar $theErrLib32 anErrLib32 |
| 490 | upvar $theErrLib64 anErrLib64 |
| 491 | upvar $theErrBin32 anErrBin32 |
| 492 | upvar $theErrBin64 anErrBin64 |
| 493 | |
| 494 | # binary distribution has another layout |
| 495 | set aFImageDist "Dist" |
| 496 | |
| 497 | set isFound "true" |
| 498 | set aFImageHPath [wokdep:SearchHeader "FreeImage.h"] |
| 499 | if { "$aFImageHPath" == "" } { |
| 500 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{freeimage}*] "$::VCVER" "$::ARCH" ] |
| 501 | if { "$aPath" != "" && [file exists "$aPath/include/FreeImage.h"] } { |
| 502 | lappend ::CSF_OPT_INC "$aPath/include" |
| 503 | } elseif { "$aPath" != "" && [file exists "$aPath/$aFImageDist/FreeImage.h"] } { |
| 504 | lappend ::CSF_OPT_INC "$aPath/$aFImageDist" |
| 505 | } else { |
| 506 | lappend anErrInc "Error: 'FreeImage.h' not found (FreeImage)" |
| 507 | set isFound "false" |
| 508 | } |
| 509 | } |
| 510 | |
| 511 | foreach anArchIter {64 32} { |
| 512 | set aFImageLibPath [wokdep:SearchLib "freeimage" "$anArchIter"] |
| 513 | if { "$aFImageLibPath" == "" } { |
| 514 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{freeimage}*] "$::VCVER" "$anArchIter" ] |
| 515 | set aFImageLibPath [wokdep:SearchLib "freeimage" "$anArchIter" "$aPath/lib"] |
| 516 | if { "$aFImageLibPath" != "" } { |
| 517 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib" |
| 518 | } else { |
| 519 | set aFImageLibPath [wokdep:SearchLib "freeimage" "$anArchIter" "$aPath/$aFImageDist"] |
| 520 | if { "$aFImageLibPath" != "" } { |
| 521 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/$aFImageDist" |
| 522 | } else { |
| 523 | lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}freeimage.${::SYS_LIB_SUFFIX}' not found (FreeImage)" |
| 524 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 525 | } |
| 526 | } |
| 527 | } |
| 528 | if { "$::tcl_platform(platform)" == "windows" } { |
| 529 | set aFImageDllPath [wokdep:SearchBin "freeimage.dll" "$anArchIter"] |
| 530 | if { "$aFImageDllPath" == "" } { |
| 531 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{freeimage}*] "$::VCVER" "$anArchIter" ] |
| 532 | set aFImageDllPath [wokdep:SearchBin "freeimage.dll" "$anArchIter" "$aPath/bin"] |
| 533 | if { "$aFImageDllPath" != "" } { |
| 534 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" |
| 535 | } else { |
| 536 | set aFImageDllPath [wokdep:SearchBin "freeimage.dll" "$anArchIter" "$aPath/$aFImageDist"] |
| 537 | if { "$aFImageDllPath" != "" } { |
| 538 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/$aFImageDist" |
| 539 | } else { |
| 540 | lappend anErrBin$anArchIter "Error: 'freeimage.dll' is not found (FreeImage)" |
| 541 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 542 | } |
| 543 | } |
| 544 | } |
| 545 | } |
| 546 | } |
| 547 | |
| 548 | return "$isFound" |
| 549 | } |
| 550 | |
| 551 | # Search FFmpeg framework placement |
| 552 | proc wokdep:SearchFFmpeg {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { |
| 553 | upvar $theErrInc anErrInc |
| 554 | upvar $theErrLib32 anErrLib32 |
| 555 | upvar $theErrLib64 anErrLib64 |
| 556 | upvar $theErrBin32 anErrBin32 |
| 557 | upvar $theErrBin64 anErrBin64 |
| 558 | |
| 559 | set isFound "true" |
| 560 | set aFFmpegHPath [wokdep:SearchHeader "libavutil/avutil.h"] |
| 561 | if { "$aFFmpegHPath" == "" } { |
| 562 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{ffmpeg}*] "$::VCVER" "$::ARCH" ] |
| 563 | if { "$aPath" != "" && [file exists "$aPath/include/libavutil/avutil.h"] } { |
| 564 | lappend ::CSF_OPT_INC "$aPath/include" |
| 565 | } else { |
| 566 | lappend anErrInc "Error: 'libavutil/avutil.h' not found (FFmpeg)" |
| 567 | set isFound "false" |
| 568 | } |
| 569 | } |
| 570 | |
| 571 | foreach anArchIter {64 32} { |
| 572 | set aFFmpegLibPath [wokdep:SearchLib "avutil" "$anArchIter"] |
| 573 | if { "$aFFmpegLibPath" == "" } { |
| 574 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{ffmpeg}*] "$::VCVER" "$anArchIter" ] |
| 575 | set aFFmpegLibPath [wokdep:SearchLib "avutil" "$anArchIter" "$aPath/lib"] |
| 576 | if { "$aFFmpegLibPath" != "" } { |
| 577 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib" |
| 578 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" |
| 579 | } else { |
| 580 | lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}avutil.${::SYS_LIB_SUFFIX}' not found (FFmpeg)" |
| 581 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 582 | } |
| 583 | } |
| 584 | } |
| 585 | |
| 586 | return "$isFound" |
| 587 | } |
| 588 | |
| 589 | # Search TBB library placement |
| 590 | proc wokdep:SearchTBB {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { |
| 591 | upvar $theErrInc anErrInc |
| 592 | upvar $theErrLib32 anErrLib32 |
| 593 | upvar $theErrLib64 anErrLib64 |
| 594 | upvar $theErrBin32 anErrBin32 |
| 595 | upvar $theErrBin64 anErrBin64 |
| 596 | |
| 597 | # keep only two first digits in "vc141" |
| 598 | if { ! [regexp {^vc[0-9][0-9]} ${::VCVER} aVcLib] } { |
| 599 | set aVcLib ${::VCVER} |
| 600 | } |
| 601 | |
| 602 | set isFound "true" |
| 603 | set aTbbHPath [wokdep:SearchHeader "tbb/scalable_allocator.h"] |
| 604 | if { "$aTbbHPath" == "" } { |
| 605 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{tbb}*] "$::VCVER" "$::ARCH" ] |
| 606 | if { "$aPath" != "" && [file exists "$aPath/include/tbb/scalable_allocator.h"] } { |
| 607 | lappend ::CSF_OPT_INC "$aPath/include" |
| 608 | } else { |
| 609 | lappend anErrInc "Error: 'tbb/scalable_allocator.h' not found (Intel TBB)" |
| 610 | set isFound "false" |
| 611 | } |
| 612 | } |
| 613 | |
| 614 | foreach anArchIter {64 32} { |
| 615 | set aSubDir "ia32" |
| 616 | if { "$anArchIter" == "64"} { |
| 617 | set aSubDir "intel64" |
| 618 | } |
| 619 | |
| 620 | set aTbbLibPath [wokdep:SearchLib "tbb" "$anArchIter"] |
| 621 | if { "$aTbbLibPath" == "" } { |
| 622 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{tbb}*] $aVcLib "$anArchIter" ] |
| 623 | set aTbbLibPath [wokdep:SearchLib "tbb" "$anArchIter" "$aPath/lib/$aSubDir/$aVcLib"] |
| 624 | if { "$aTbbLibPath" == "" } { |
| 625 | # Set the path to the TBB library for Linux |
| 626 | if { "$::tcl_platform(platform)" != "windows" } { |
| 627 | set aSubDir "$aSubDir/cc4.1.0_libc2.4_kernel2.6.16.21" |
| 628 | } |
| 629 | set aTbbLibPath [wokdep:SearchLib "tbb" "$anArchIter" "$aPath/lib/$aSubDir"] |
| 630 | if { "$aTbbLibPath" != "" } { |
| 631 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib/$aSubDir" |
| 632 | } |
| 633 | } else { |
| 634 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib/$aSubDir/$aVcLib" |
| 635 | } |
| 636 | if { "$aTbbLibPath" == "" } { |
| 637 | lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}tbb.${::SYS_LIB_SUFFIX}' not found (Intel TBB)" |
| 638 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 639 | } |
| 640 | } |
| 641 | if { "$::tcl_platform(platform)" == "windows" } { |
| 642 | set aTbbDllPath [wokdep:SearchBin "tbb.dll" "$anArchIter"] |
| 643 | if { "$aTbbDllPath" == "" } { |
| 644 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{tbb}*] $aVcLib "$anArchIter" ] |
| 645 | set aTbbDllPath [wokdep:SearchBin "tbb.dll" "$anArchIter" "$aPath/bin/$aSubDir/$aVcLib"] |
| 646 | if { "$aTbbDllPath" != "" } { |
| 647 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin/$aSubDir/$aVcLib" |
| 648 | } else { |
| 649 | lappend anErrBin$anArchIter "Error: 'tbb.dll' not found (Intel TBB)" |
| 650 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 651 | } |
| 652 | } |
| 653 | } |
| 654 | } |
| 655 | |
| 656 | return "$isFound" |
| 657 | } |
| 658 | |
| 659 | # Search OpenCL library placement |
| 660 | proc wokdep:SearchOpenCL {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { |
| 661 | upvar $theErrInc anErrInc |
| 662 | upvar $theErrLib32 anErrLib32 |
| 663 | upvar $theErrLib64 anErrLib64 |
| 664 | upvar $theErrBin32 anErrBin32 |
| 665 | upvar $theErrBin64 anErrBin64 |
| 666 | |
| 667 | set isFound "true" |
| 668 | if { "$::tcl_platform(os)" == "Darwin" } { |
| 669 | # OpenCL framework available since Mac OS X 16 |
| 670 | return "$isFound" |
| 671 | } |
| 672 | |
| 673 | set aCLHPath [wokdep:SearchHeader "CL/cl_gl.h"] |
| 674 | if { "$aCLHPath" == "" } { |
| 675 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{OpenCL}*] "$::VCVER" "$::ARCH" ] |
| 676 | if { "$aPath" != "" && [file exists "$aPath/include/CL/cl_gl.h"] } { |
| 677 | lappend ::CSF_OPT_INC "$aPath/include" |
| 678 | } else { |
| 679 | lappend anErrInc "Error: 'CL/cl_gl.h' not found (OpenCL)" |
| 680 | set isFound "false" |
| 681 | } |
| 682 | } |
| 683 | |
| 684 | foreach anArchIter {64 32} { |
| 685 | set aCLLibPath [wokdep:SearchLib "OpenCL" "$anArchIter"] |
| 686 | if { "$aCLLibPath" == "" } { |
| 687 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{OpenCL}*] "$::VCVER" "$anArchIter" ] |
| 688 | set aCLLibPath [wokdep:SearchLib "OpenCL" "$anArchIter" "$aPath/lib"] |
| 689 | if { "$aCLLibPath" != "" } { |
| 690 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib" |
| 691 | } else { |
| 692 | lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}OpenCL.${::SYS_LIB_SUFFIX}' not found (OpenCL)" |
| 693 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 694 | } |
| 695 | } |
| 696 | } |
| 697 | |
| 698 | return "$isFound" |
| 699 | } |
| 700 | |
| 701 | # Search EGL library placement |
| 702 | proc wokdep:SearchEGL {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { |
| 703 | upvar $theErrInc anErrInc |
| 704 | upvar $theErrLib32 anErrLib32 |
| 705 | upvar $theErrLib64 anErrLib64 |
| 706 | upvar $theErrBin32 anErrBin32 |
| 707 | upvar $theErrBin64 anErrBin64 |
| 708 | |
| 709 | set isFound "true" |
| 710 | set aHeaderPath [wokdep:SearchHeader "EGL/egl.h"] |
| 711 | if { "$aHeaderPath" == "" } { |
| 712 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{EGL}*] "$::VCVER" "$::ARCH" ] |
| 713 | if { "$aPath" == "" || ![file exists "$aPath/include/EGL/egl.h"] } { |
| 714 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{angle}*] "$::VCVER" "$::ARCH" ] |
| 715 | } |
| 716 | |
| 717 | if { "$aPath" != "" && [file exists "$aPath/include/EGL/egl.h"] } { |
| 718 | lappend ::CSF_OPT_INC "$aPath/include" |
| 719 | } else { |
| 720 | lappend anErrInc "Error: 'EGL/egl.h' not found (EGL)" |
| 721 | set isFound "false" |
| 722 | } |
| 723 | } |
| 724 | |
| 725 | set aLibName "EGL" |
| 726 | if { "$::tcl_platform(platform)" == "windows" } { |
| 727 | # awkward exception |
| 728 | set aLibName "libEGL" |
| 729 | } |
| 730 | |
| 731 | foreach anArchIter {64 32} { |
| 732 | set aLibPath [wokdep:SearchLib "$aLibName" "$anArchIter"] |
| 733 | if { "$aLibPath" == "" } { |
| 734 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{EGL}*] "$::VCVER" "$anArchIter" ] |
| 735 | set aLibPath [wokdep:SearchLib "$aLibName" "$anArchIter" "$aPath/lib"] |
| 736 | if { "$aLibPath" == "" } { |
| 737 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{angle}*] "$::VCVER" "$anArchIter" ] |
| 738 | set aLibPath [wokdep:SearchLib "$aLibName" "$anArchIter" "$aPath/lib"] |
| 739 | } |
| 740 | |
| 741 | if { "$aLibPath" != "" } { |
| 742 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib" |
| 743 | } else { |
| 744 | lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}${aLibName}.${::SYS_LIB_SUFFIX}' not found (EGL)" |
| 745 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 746 | } |
| 747 | } |
| 748 | |
| 749 | if { "$::tcl_platform(platform)" == "windows" } { |
| 750 | set aDllPath [wokdep:SearchBin "libEGL.dll" "$anArchIter"] |
| 751 | if { "$aDllPath" == "" } { |
| 752 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{EGL}*] "$::VCVER" "$anArchIter" ] |
| 753 | set aDllPath [wokdep:SearchBin "libEGL.dll" "$anArchIter" "$aPath/bin"] |
| 754 | if { "$aDllPath" == "" } { |
| 755 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{angle}*] "$::VCVER" "$anArchIter" ] |
| 756 | set aDllPath [wokdep:SearchBin "libEGL.dll" "$anArchIter" "$aPath/bin"] |
| 757 | } |
| 758 | |
| 759 | if { "$aDllPath" != "" } { |
| 760 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" |
| 761 | } else { |
| 762 | lappend anErrBin$anArchIter "Error: 'libEGL.dll' not found (EGL)" |
| 763 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 764 | } |
| 765 | } |
| 766 | } |
| 767 | } |
| 768 | |
| 769 | return "$isFound" |
| 770 | } |
| 771 | |
| 772 | # Search OpenGL ES 2.0 library placement |
| 773 | proc wokdep:SearchGLES {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { |
| 774 | upvar $theErrInc anErrInc |
| 775 | upvar $theErrLib32 anErrLib32 |
| 776 | upvar $theErrLib64 anErrLib64 |
| 777 | upvar $theErrBin32 anErrBin32 |
| 778 | upvar $theErrBin64 anErrBin64 |
| 779 | |
| 780 | set isFound "true" |
| 781 | set aHeaderPath [wokdep:SearchHeader "GLES2/gl2.h"] |
| 782 | if { "$aHeaderPath" == "" } { |
| 783 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{GLES}*] "$::VCVER" "$::ARCH" ] |
| 784 | if { "$aPath" == "" || ![file exists "$aPath/include/GLES2/gl2.h"] } { |
| 785 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{angle}*] "$::VCVER" "$::ARCH" ] |
| 786 | } |
| 787 | |
| 788 | if { "$aPath" != "" && [file exists "$aPath/include/GLES2/gl2.h"] } { |
| 789 | lappend ::CSF_OPT_INC "$aPath/include" |
| 790 | } else { |
| 791 | lappend anErrInc "Error: 'GLES2/gl2.h' not found (OpenGL ES 2.0)" |
| 792 | set isFound "false" |
| 793 | } |
| 794 | } |
| 795 | |
| 796 | set aLibName "GLESv2" |
| 797 | if { "$::tcl_platform(platform)" == "windows" } { |
| 798 | # awkward exception |
| 799 | set aLibName "libGLESv2" |
| 800 | } |
| 801 | |
| 802 | foreach anArchIter {64 32} { |
| 803 | set aLibPath [wokdep:SearchLib "$aLibName" "$anArchIter"] |
| 804 | if { "$aLibPath" == "" } { |
| 805 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{GLES}*] "$::VCVER" "$anArchIter" ] |
| 806 | set aLibPath [wokdep:SearchLib "$aLibName" "$anArchIter" "$aPath/lib"] |
| 807 | if { "$aLibPath" == "" } { |
| 808 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{angle}*] "$::VCVER" "$anArchIter" ] |
| 809 | set aLibPath [wokdep:SearchLib "$aLibName" "$anArchIter" "$aPath/lib"] |
| 810 | } |
| 811 | |
| 812 | if { "$aLibPath" != "" } { |
| 813 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib" |
| 814 | } else { |
| 815 | lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}${aLibName}.${::SYS_LIB_SUFFIX}' not found (OpenGL ES 2.0)" |
| 816 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 817 | } |
| 818 | } |
| 819 | |
| 820 | if { "$::tcl_platform(platform)" == "windows" } { |
| 821 | set aDllPath [wokdep:SearchBin "libGLESv2.dll" "$anArchIter"] |
| 822 | if { "$aDllPath" == "" } { |
| 823 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{EGL}*] "$::VCVER" "$anArchIter" ] |
| 824 | set aDllPath [wokdep:SearchBin "libGLESv2.dll" "$anArchIter" "$aPath/bin"] |
| 825 | if { "$aDllPath" == "" } { |
| 826 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{angle}*] "$::VCVER" "$anArchIter" ] |
| 827 | set aDllPath [wokdep:SearchBin "libGLESv2.dll" "$anArchIter" "$aPath/bin"] |
| 828 | } |
| 829 | |
| 830 | if { "$aDllPath" != "" } { |
| 831 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" |
| 832 | } else { |
| 833 | lappend anErrBin$anArchIter "Error: 'libGLESv2.dll' not found (OpenGL ES 2.0)" |
| 834 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 835 | } |
| 836 | } |
| 837 | } |
| 838 | } |
| 839 | |
| 840 | return "$isFound" |
| 841 | } |
| 842 | |
| 843 | # Auxiliary function, gets VTK version to set default search directory |
| 844 | proc wokdep:VtkVersion { thePath } { |
| 845 | set aResult "6.1" |
| 846 | |
| 847 | set aVtkRoot [lindex [regexp -all -inline {[0-9.]*} [file tail $thePath]] 0] |
| 848 | if { "$aVtkRoot" != "" } { |
| 849 | set aVtkRoot [regexp -inline {[0-9]*.[0-9]*} $aVtkRoot] |
| 850 | if { "$aVtkRoot" != "" } { |
| 851 | set aResult $aVtkRoot |
| 852 | } |
| 853 | } |
| 854 | |
| 855 | return $aResult |
| 856 | } |
| 857 | |
| 858 | # Search VTK library placement |
| 859 | proc wokdep:SearchVTK {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { |
| 860 | upvar $theErrInc anErrInc |
| 861 | upvar $theErrLib32 anErrLib32 |
| 862 | upvar $theErrLib64 anErrLib64 |
| 863 | upvar $theErrBin32 anErrBin32 |
| 864 | upvar $theErrBin64 anErrBin64 |
| 865 | |
| 866 | set isFound "true" |
| 867 | |
| 868 | set aVtkPath "" |
| 869 | set aVtkIncPath [wokdep:SearchHeader "vtkConfigure.h"] |
| 870 | set aVtkVer [wokdep:VtkVersion $aVtkIncPath] |
| 871 | if { "$aVtkIncPath" == ""} { |
| 872 | set aPathList [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{VTK}*] |
| 873 | set aVtkPath [wokdep:Preferred "$aPathList" "$::VCVER" "$::ARCH" ] |
| 874 | if { "$aVtkPath" != "" && [file exists "$aVtkPath/include/vtk-[wokdep:VtkVersion $aVtkPath]/vtkConfigure.h"]} { |
| 875 | set aVtkVer [wokdep:VtkVersion $aVtkPath] |
| 876 | lappend ::CSF_OPT_INC "$aVtkPath/include/vtk-[wokdep:VtkVersion $aVtkPath]" |
| 877 | } else { # try to search in all found paths |
| 878 | set isFound "false" |
| 879 | foreach anIt $aPathList { |
| 880 | if { [file exists "$anIt/include/vtk-[wokdep:VtkVersion $anIt]/vtkConfigure.h"] } { |
| 881 | set aVtkPath $anIt |
| 882 | set aVtkVer [wokdep:VtkVersion $aVtkPath] |
| 883 | lappend ::CSF_OPT_INC "$anIt/include/vtk-[wokdep:VtkVersion $anIt]" |
| 884 | set isFound "true" |
| 885 | break |
| 886 | } |
| 887 | } |
| 888 | |
| 889 | # Bad case: we do not found vtkConfigure.h in all paths. |
| 890 | if { "$isFound" == "false"} { |
| 891 | lappend anErrInc "Error: 'vtkConfigure.h' not found (VTK)" |
| 892 | set isFound "false" |
| 893 | } |
| 894 | } |
| 895 | } |
| 896 | |
| 897 | set aVtkLibPath "" |
| 898 | foreach anArchIter {64 32} { |
| 899 | set aVtkLibPath [wokdep:SearchLib "vtkCommonCore-$aVtkVer" "$anArchIter"] |
| 900 | if { "$aVtkLibPath" == "" } { |
| 901 | set aPathList [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{VTK}*] |
| 902 | set aPath [wokdep:Preferred $aPathList "$::VCVER" "$anArchIter" ] |
| 903 | set aVtkLibPath [wokdep:SearchLib "vtkCommonCore-$aVtkVer" "$anArchIter" "$aPath/lib"] |
| 904 | if { "$aVtkLibPath" != "" } { |
| 905 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib" |
| 906 | } else { |
| 907 | set aPath [wokdep:SearchLib "vtkCommonCore-$aVtkVer" "$anArchIter" "$aVtkPath/lib"] |
| 908 | if { "$aPath" != "" } { |
| 909 | set aLibPath $aVtkIncPath |
| 910 | lappend ::CSF_OPT_LIB$anArchIter "$aLibPath/lib" |
| 911 | } else { |
| 912 | # The last chance: search /lib directory in all found paths |
| 913 | foreach anIt $aPathList { |
| 914 | set aVtkLibPath [wokdep:SearchLib "vtkCommonCore-$aVtkVer" "$anArchIter" "$anIt/lib"] |
| 915 | if { "$aVtkLibPath" != ""} { |
| 916 | lappend ::CSF_OPT_LIB$anArchIter "$anIt/lib" |
| 917 | break |
| 918 | } |
| 919 | } |
| 920 | if { "$aVtkLibPath" == "" } { |
| 921 | lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}vtkCommonCore-${aVtkVer}\.${::SYS_LIB_SUFFIX}' not found (VTK)" |
| 922 | if { "$::ARCH" == "$anArchIter" } { |
| 923 | set isFound "false" |
| 924 | } |
| 925 | } |
| 926 | } |
| 927 | } |
| 928 | } |
| 929 | } |
| 930 | |
| 931 | # Search binary path |
| 932 | if { "$::tcl_platform(platform)" == "windows" } { |
| 933 | foreach anArchIter {64 32} { |
| 934 | set aVtkBinPath [wokdep:SearchBin "vtkCommonCore-${aVtkVer}.dll" "$anArchIter"] |
| 935 | if { "$aVtkBinPath" == "" } { |
| 936 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{VTK}*] "$::VCVER" "$anArchIter" ] |
| 937 | set aVtkBinPath [wokdep:SearchBin "vtkCommonCore-${aVtkVer}.dll" "$anArchIter" "$aPath/bin"] |
| 938 | if { "$aVtkBinPath" != "" } { lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" |
| 939 | } else { |
| 940 | set aVtkBinPath [wokdep:SearchBin "vtkCommonCore-${aVtkVer}.dll" "$anArchIter" "$aPath/lib"] |
| 941 | if { "$aVtkBinPath" != "" } { lappend ::CSF_OPT_BIN$anArchIter "$aPath/lib" } |
| 942 | } |
| 943 | } |
| 944 | } |
| 945 | |
| 946 | # We didn't find preferred binary path => search through inc path or among all available VTK directories |
| 947 | if { "$aVtkBinPath" == "" } { |
| 948 | # Try to find in lib path |
| 949 | set aPath [wokdep:SearchBin "vtkCommonCore-${aVtkVer}.dll" "$anArchIter" "$aVtkLibPath/bin"] |
| 950 | if { "$aPath" != "" } { lappend ::CSF_OPT_BIN$anArchIter "$aVtkLibPath/bin" |
| 951 | } elseif { [wokdep:SearchBin "vtkCommonCore-${aVtkVer}.dll" "$anArchIter" "$aVtkLibPath/lib"] != "" } { |
| 952 | lappend ::CSF_OPT_BIN$anArchIter "$aVtkLibPath/lib" |
| 953 | } else { |
| 954 | lappend anErrBin$anArchIter "Error: 'vtkCommonCore-${aVtkVer}.dll' not found (VTK)" |
| 955 | set isFound "false" |
| 956 | } |
| 957 | } |
| 958 | } |
| 959 | |
| 960 | return "$isFound" |
| 961 | } |
| 962 | |
| 963 | # Search Qt4 libraries placement |
| 964 | proc wokdep:SearchQt4 {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { |
| 965 | upvar $theErrInc anErrInc |
| 966 | upvar $theErrLib32 anErrLib32 |
| 967 | upvar $theErrLib64 anErrLib64 |
| 968 | upvar $theErrBin32 anErrBin32 |
| 969 | upvar $theErrBin64 anErrBin64 |
| 970 | |
| 971 | set isFound "true" |
| 972 | set aQMsgBoxHPath [wokdep:SearchHeader "QtGui/qmessagebox.h"] |
| 973 | if { "$aQMsgBoxHPath" == "" } { |
| 974 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{qt4}*] "$::VCVER" "$::ARCH" ] |
| 975 | if { "$aPath" != "" && [file exists "$aPath/include/QtGui/qmessagebox.h"] } { |
| 976 | lappend ::CSF_OPT_INC "$aPath/include" |
| 977 | lappend ::CSF_OPT_INC "$aPath/include/Qt" |
| 978 | lappend ::CSF_OPT_INC "$aPath/include/QtGui" |
| 979 | lappend ::CSF_OPT_INC "$aPath/include/QtCore" |
| 980 | } else { |
| 981 | if { [file exists "/usr/include/qt4/QtGui/qmessagebox.h"] } { |
| 982 | lappend ::CSF_OPT_INC "/usr/include/qt4" |
| 983 | lappend ::CSF_OPT_INC "/usr/include/qt4/Qt" |
| 984 | lappend ::CSF_OPT_INC "/usr/include/qt4/QtGui" |
| 985 | lappend ::CSF_OPT_INC "/usr/include/qt4/QtCore" |
| 986 | } else { |
| 987 | lappend anErrInc "Error: 'QtGui/qmessagebox.h' not found (Qt4)" |
| 988 | set isFound "false" |
| 989 | } |
| 990 | } |
| 991 | } |
| 992 | |
| 993 | set aQtGuiLibName "QtGui" |
| 994 | if { "$::tcl_platform(platform)" == "windows" } { |
| 995 | set aQtGuiLibName "QtGui4" |
| 996 | } |
| 997 | |
| 998 | foreach anArchIter {64 32} { |
| 999 | set aQMsgBoxLibPath [wokdep:SearchLib "${aQtGuiLibName}" "$anArchIter"] |
| 1000 | if { "$aQMsgBoxLibPath" == "" } { |
| 1001 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{qt4}*] "$::VCVER" "$anArchIter" ] |
| 1002 | set aQMsgBoxLibPath [wokdep:SearchLib "${aQtGuiLibName}" "$anArchIter" "$aPath/lib"] |
| 1003 | if { "$aQMsgBoxLibPath" != "" } { |
| 1004 | lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib" |
| 1005 | } else { |
| 1006 | lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}${aQtGuiLibName}.${::SYS_LIB_SUFFIX}' not found (Qt4)" |
| 1007 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 1008 | } |
| 1009 | } |
| 1010 | if { "$::tcl_platform(platform)" == "windows" } { |
| 1011 | set aQMsgBoxDllPath [wokdep:SearchBin "QtGui4.dll" "$anArchIter"] |
| 1012 | if { "$aQMsgBoxDllPath" == "" } { |
| 1013 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{qt4}*] "$::VCVER" "$anArchIter" ] |
| 1014 | set aQMsgBoxDllPath [wokdep:SearchBin "QtGui4.dll" "$anArchIter" "$aPath/bin"] |
| 1015 | if { "$aQMsgBoxDllPath" != "" } { |
| 1016 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" |
| 1017 | } else { |
| 1018 | lappend anErrBin$anArchIter "Error: 'QtGui4.dll' not found (Qt4)" |
| 1019 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 1020 | } |
| 1021 | } |
| 1022 | } |
| 1023 | } |
| 1024 | |
| 1025 | return "$isFound" |
| 1026 | } |
| 1027 | |
| 1028 | # Search JDK placement |
| 1029 | proc wokdep:SearchJDK {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { |
| 1030 | upvar $theErrInc anErrInc |
| 1031 | upvar $theErrLib32 anErrLib32 |
| 1032 | upvar $theErrLib64 anErrLib64 |
| 1033 | upvar $theErrBin32 anErrBin32 |
| 1034 | upvar $theErrBin64 anErrBin64 |
| 1035 | |
| 1036 | set isFound "true" |
| 1037 | set aJniHPath [wokdep:SearchHeader "jni.h"] |
| 1038 | set aJniMdHPath [wokdep:SearchHeader "jni_md.h"] |
| 1039 | if { "$aJniHPath" == "" || "$aJniMdHPath" == "" } { |
| 1040 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{jdk,java}*] "$::VCVER" "$::ARCH" ] |
| 1041 | if { "$aPath" != "" && [file exists "$aPath/include/jni.h"] } { |
| 1042 | lappend ::CSF_OPT_INC "$aPath/include" |
| 1043 | if { "$::tcl_platform(platform)" == "windows" } { |
| 1044 | lappend ::CSF_OPT_INC "$aPath/include/win32" |
| 1045 | } elseif { [file exists "$aPath/include/linux"] } { |
| 1046 | lappend ::CSF_OPT_INC "$aPath/include/linux" |
| 1047 | } |
| 1048 | } else { |
| 1049 | if { [file exists "/System/Library/Frameworks/JavaVM.framework/Home/include/jni.h"] } { |
| 1050 | lappend ::CSF_OPT_INC "/System/Library/Frameworks/JavaVM.framework/Home/include" |
| 1051 | } else { |
| 1052 | lappend anErrInc "Error: 'jni.h' or 'jni_md.h' not found (JDK)" |
| 1053 | set isFound "false" |
| 1054 | } |
| 1055 | } |
| 1056 | } |
| 1057 | |
| 1058 | foreach anArchIter {64 32} { |
| 1059 | set aJavacPath [wokdep:SearchBin "javac${::SYS_EXE_SUFFIX}" "$anArchIter"] |
| 1060 | if { "$aJavacPath" == "" } { |
| 1061 | set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{jdk,java}*] "$::VCVER" "$anArchIter" ] |
| 1062 | set aJavacPath [wokdep:SearchBin "javac${::SYS_EXE_SUFFIX}" "$anArchIter" "$aPath/bin"] |
| 1063 | if { "$aJavacPath" != "" } { |
| 1064 | lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" |
| 1065 | } else { |
| 1066 | if { "$::ARCH" == "$anArchIter" && [file exists "/System/Library/Frameworks/JavaVM.framework/Home/bin/javac${::SYS_EXE_SUFFIX}"] } { |
| 1067 | lappend ::CSF_OPT_BIN$anArchIter "/System/Library/Frameworks/JavaVM.framework/Home/bin" |
| 1068 | } else { |
| 1069 | lappend anErrBin$anArchIter "Error: 'javac${::SYS_EXE_SUFFIX}' not found (JDK)" |
| 1070 | if { "$::ARCH" == "$anArchIter"} { set isFound "false" } |
| 1071 | } |
| 1072 | } |
| 1073 | } |
| 1074 | } |
| 1075 | |
| 1076 | return "$isFound" |
| 1077 | } |
| 1078 | |
| 1079 | # Search X11 libraries placement |
| 1080 | proc wokdep:SearchX11 {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { |
| 1081 | upvar $theErrInc anErrInc |
| 1082 | upvar $theErrLib32 anErrLib32 |
| 1083 | upvar $theErrLib64 anErrLib64 |
| 1084 | upvar $theErrBin32 anErrBin32 |
| 1085 | upvar $theErrBin64 anErrBin64 |
| 1086 | |
| 1087 | set isFound "true" |
| 1088 | if { "$::tcl_platform(platform)" == "windows" || ( "$::tcl_platform(os)" == "Darwin" && "$::MACOSX_USE_GLX" != "true" ) } { |
| 1089 | return "$isFound" |
| 1090 | } |
| 1091 | |
| 1092 | set aXmuLibPath [wokdep:SearchLib "Xmu" "$::ARCH"] |
| 1093 | if { "$aXmuLibPath" == "" } { |
| 1094 | set aXmuLibPath [wokdep:SearchLib "Xmu" "$::ARCH" "/usr/X11/lib"] |
| 1095 | if { "$aXmuLibPath" != "" } { |
| 1096 | #lappend ::CSF_OPT_LIB$::ARCH "/usr/X11/lib" |
| 1097 | } else { |
| 1098 | lappend anErrLib$::ARCH "Error: '${::SYS_LIB_PREFIX}Xmu.${::SYS_LIB_SUFFIX}' not found (X11)" |
| 1099 | set isFound "false" |
| 1100 | } |
| 1101 | } |
| 1102 | |
| 1103 | return "$isFound" |
| 1104 | } |
| 1105 | |
| 1106 | # Generate (override) custom environment file |
| 1107 | proc wokdep:SaveCustom {} { |
| 1108 | if { "$::tcl_platform(platform)" == "windows" } { |
| 1109 | set aCustomFilePath "./custom.bat" |
| 1110 | set aFile [open $aCustomFilePath "w"] |
| 1111 | puts $aFile "@echo off" |
| 1112 | puts $aFile "rem This environment file was generated by wok_depsgui.tcl script at [clock format [clock seconds] -format "%Y.%m.%d %H:%M"]" |
| 1113 | |
| 1114 | puts $aFile "" |
| 1115 | puts $aFile "set VCVER=$::VCVER" |
| 1116 | puts $aFile "set ARCH=$::ARCH" |
| 1117 | puts $aFile "set VCVARS=$::VCVARS" |
| 1118 | puts $aFile "set SHORTCUT_HEADERS=$::SHORTCUT_HEADERS" |
| 1119 | |
| 1120 | puts $aFile "" |
| 1121 | puts $aFile "set \"PRODUCTS_PATH=$::PRODUCTS_PATH\"" |
| 1122 | |
| 1123 | puts $aFile "" |
| 1124 | puts $aFile "rem Optional 3rd-parties switches" |
| 1125 | foreach anEnvIter $::THE_ENV_VARIABLES { |
| 1126 | set aName ${anEnvIter} |
| 1127 | set aValue [set ::${anEnvIter}] |
| 1128 | if { "$aValue" != "" } { |
| 1129 | puts $aFile "set ${aName}=$aValue" |
| 1130 | } |
| 1131 | } |
| 1132 | |
| 1133 | set aStringInc [join $::CSF_OPT_INC $::SYS_PATH_SPLITTER] |
| 1134 | puts $aFile "" |
| 1135 | puts $aFile "rem Additional headers search paths" |
| 1136 | puts $aFile "set \"CSF_OPT_INC=$aStringInc\"" |
| 1137 | |
| 1138 | set aStringLib32 [join $::CSF_OPT_LIB32 $::SYS_PATH_SPLITTER] |
| 1139 | puts $aFile "" |
| 1140 | puts $aFile "rem Additional libraries (32-bit) search paths" |
| 1141 | puts $aFile "set \"CSF_OPT_LIB32=$aStringLib32\"" |
| 1142 | |
| 1143 | set aStringLib64 [join $::CSF_OPT_LIB64 $::SYS_PATH_SPLITTER] |
| 1144 | puts $aFile "" |
| 1145 | puts $aFile "rem Additional libraries (64-bit) search paths" |
| 1146 | puts $aFile "set \"CSF_OPT_LIB64=$aStringLib64\"" |
| 1147 | |
| 1148 | set aStringBin32 [join $::CSF_OPT_BIN32 $::SYS_PATH_SPLITTER] |
| 1149 | puts $aFile "" |
| 1150 | puts $aFile "rem Additional (32-bit) search paths" |
| 1151 | puts $aFile "set \"CSF_OPT_BIN32=$aStringBin32\"" |
| 1152 | |
| 1153 | set aStringBin64 [join $::CSF_OPT_BIN64 $::SYS_PATH_SPLITTER] |
| 1154 | puts $aFile "" |
| 1155 | puts $aFile "rem Additional (64-bit) search paths" |
| 1156 | puts $aFile "set \"CSF_OPT_BIN64=$aStringBin64\"" |
| 1157 | |
| 1158 | close $aFile |
| 1159 | } else { |
| 1160 | set aCustomFilePath "./custom.sh" |
| 1161 | set aFile [open $aCustomFilePath "w"] |
| 1162 | puts $aFile "#!/bin/bash" |
| 1163 | puts $aFile "# This environment file was generated by wok_depsgui.tcl script at [clock format [clock seconds] -format "%Y.%m.%d %H:%M"]" |
| 1164 | |
| 1165 | puts $aFile "" |
| 1166 | puts $aFile "export ARCH=$::ARCH" |
| 1167 | puts $aFile "export SHORTCUT_HEADERS=$::SHORTCUT_HEADERS" |
| 1168 | |
| 1169 | puts $aFile "" |
| 1170 | puts $aFile "export PRODUCTS_PATH=\"$::PRODUCTS_PATH\"" |
| 1171 | |
| 1172 | puts $aFile "" |
| 1173 | puts $aFile "# Optional 3rd-parties switches" |
| 1174 | foreach anEnvIter $::THE_ENV_VARIABLES { |
| 1175 | set aName ${anEnvIter} |
| 1176 | set aValue [set ::${anEnvIter}] |
| 1177 | if { "$aValue" != "" } { |
| 1178 | puts $aFile "export ${aName}=${aValue}" |
| 1179 | } |
| 1180 | } |
| 1181 | |
| 1182 | set aStringInc [join $::CSF_OPT_INC $::SYS_PATH_SPLITTER] |
| 1183 | puts $aFile "" |
| 1184 | puts $aFile "# Additional headers search paths" |
| 1185 | puts $aFile "export CSF_OPT_INC=\"$aStringInc\"" |
| 1186 | |
| 1187 | set aStringLib$::ARCH [join [set ::CSF_OPT_LIB$::ARCH] $::SYS_PATH_SPLITTER] |
| 1188 | puts $aFile "" |
| 1189 | puts $aFile "# Additional libraries ($::ARCH-bit) search paths" |
| 1190 | puts $aFile "export CSF_OPT_LIB$::ARCH=\"[set aStringLib$::ARCH]\"" |
| 1191 | |
| 1192 | set aStringBin$::ARCH [join [set ::CSF_OPT_BIN$::ARCH] $::SYS_PATH_SPLITTER] |
| 1193 | puts $aFile "" |
| 1194 | puts $aFile "# Additional ($::ARCH-bit) search paths" |
| 1195 | puts $aFile "export CSF_OPT_BIN$::ARCH=\"[set aStringBin$::ARCH]\"" |
| 1196 | |
| 1197 | close $aFile |
| 1198 | } |
| 1199 | |
| 1200 | puts "Configuration saved to file '$aCustomFilePath'" |
| 1201 | } |