2016-10-28 05:00:58 +03:00
package utils
import (
2019-04-20 20:34:45 +03:00
"fmt"
2016-10-28 05:00:58 +03:00
"os"
2017-03-02 21:24:25 +03:00
"os/exec"
2016-10-28 05:00:58 +03:00
"path/filepath"
"runtime"
2017-07-13 18:04:51 +03:00
"strconv"
2016-10-28 05:00:58 +03:00
"strings"
2018-12-17 20:56:35 +03:00
"sync"
2016-10-28 05:00:58 +03:00
)
2019-04-16 19:28:55 +03:00
var (
qtVersionCache string
qtVersionCacheMutex = new ( sync . Mutex )
)
2017-08-21 20:39:31 +03:00
2016-12-30 23:40:48 +03:00
func QT_VERSION ( ) string {
2017-08-21 20:39:31 +03:00
if version , ok := os . LookupEnv ( "QT_VERSION" ) ; ok {
2016-12-30 23:40:48 +03:00
return version
}
2019-09-14 20:07:15 +03:00
switch {
case QT_MXE ( ) :
return "5.13.0"
case os . Getenv ( "QT_HOMEBREW" ) == "true" :
return "5.13.0"
case QT_MACPORTS ( ) , QT_NIX ( ) , QT_FELGO ( ) :
return "5.11.1"
case QT_MSYS2 ( ) :
return "5.12.0"
case QT_UBPORTS_VERSION ( ) == "xenial" :
return "5.9.0"
case QT_SAILFISH ( ) :
return "5.6.3"
case QT_RPI ( ) :
return "5.7.0"
case QT_PKG_CONFIG ( ) :
2019-04-16 19:28:55 +03:00
var r string
qtVersionCacheMutex . Lock ( )
if qtVersionCache == "" {
2019-05-13 21:37:59 +03:00
qtVersionCache = strings . TrimSpace ( RunCmd ( exec . Command ( "pkg-config" , "--modversion" , "Qt5Core" ) , "utils.PKG_CONFIG_modVersion" ) )
2017-08-21 20:39:31 +03:00
}
2019-04-16 19:28:55 +03:00
r = qtVersionCache
qtVersionCacheMutex . Unlock ( )
return r
2019-09-14 20:07:15 +03:00
default :
return "5.13.0"
2017-04-01 22:03:41 +03:00
}
2016-12-30 23:40:48 +03:00
}
2017-07-13 18:04:51 +03:00
func QT_VERSION_NUM ( ) int {
2017-08-21 20:39:31 +03:00
version := QT_VERSION ( )
vmaj , _ := strconv . Atoi ( string ( version [ 0 ] ) )
vmin , _ := strconv . Atoi ( strings . Replace ( version [ 1 : ] , "." , "" , - 1 ) )
return vmaj * 1e3 + vmin
2017-07-13 18:04:51 +03:00
}
2017-01-07 20:26:06 +03:00
func QT_VERSION_MAJOR ( ) string {
2017-08-21 20:39:31 +03:00
if version , ok := os . LookupEnv ( "QT_VERSION_MAJOR" ) ; ok {
2017-07-13 18:04:51 +03:00
return version
}
if QT_VERSION_NUM ( ) >= 5091 {
return QT_VERSION ( )
}
2017-01-07 20:26:06 +03:00
return strings . Join ( strings . Split ( QT_VERSION ( ) , "." ) [ : 2 ] , "." )
}
2018-07-16 19:50:11 +03:00
func QT_API ( def string ) string {
if api , ok := os . LookupEnv ( "QT_API" ) ; ok {
return api
}
return def
}
2018-12-17 03:52:29 +03:00
func QT_API_NUM ( def string ) int {
version := QT_API ( def )
vmaj , _ := strconv . Atoi ( string ( version [ 0 ] ) )
vmin , _ := strconv . Atoi ( strings . Replace ( version [ 1 : ] , "." , "" , - 1 ) )
return vmaj * 1e3 + vmin
}
2016-10-28 05:00:58 +03:00
func QT_DIR ( ) string {
2018-03-29 13:09:04 +03:00
path := qT_DIR ( )
2018-10-25 02:16:59 +03:00
if ExistsDir ( path ) {
2018-03-29 13:09:04 +03:00
return path
}
return strings . Replace ( path , QT_VERSION_MAJOR ( ) , QT_VERSION ( ) , - 1 )
}
2019-04-20 20:34:45 +03:00
var (
qtInstallPrefixCache = make ( map [ string ] string )
qtInstallPrefixCacheMutex = new ( sync . Mutex )
)
2019-04-21 02:03:23 +03:00
func QT_INSTALL_PREFIX ( target string ) ( r string ) {
2019-04-20 20:34:45 +03:00
qtInstallPrefixCacheMutex . Lock ( )
2019-04-21 02:03:23 +03:00
if _ , ok := qtInstallPrefixCache [ target ] ; ! ok {
qtInstallPrefixCache [ target ] = strings . TrimSpace ( RunCmd ( exec . Command ( ToolPath ( "qmake" , target ) , "-query" , "QT_INSTALL_PREFIX" ) , fmt . Sprintf ( "query install prefix path for %v on %v" , target , runtime . GOOS ) ) )
2019-04-20 20:34:45 +03:00
}
r = qtInstallPrefixCache [ target ]
qtInstallPrefixCacheMutex . Unlock ( )
return
}
2018-03-29 13:09:04 +03:00
func qT_DIR ( ) string {
2017-08-21 20:39:31 +03:00
if dir , ok := os . LookupEnv ( "QT_DIR" ) ; ok {
2016-10-28 05:00:58 +03:00
return filepath . Clean ( dir )
}
2018-10-14 19:50:54 +03:00
prefix := os . Getenv ( "HOME" )
2016-10-28 05:00:58 +03:00
if runtime . GOOS == "windows" {
2018-10-30 18:53:05 +03:00
prefix = windowsSystemDrive ( ) + "\\"
2017-08-31 00:04:28 +03:00
}
2018-10-14 19:50:54 +03:00
2019-04-16 19:28:55 +03:00
if QT_FELGO ( ) {
return filepath . Join ( prefix , "Felgo" )
}
2018-10-14 19:50:54 +03:00
if dir := filepath . Join ( prefix , "Qt" , "Qt" + QT_VERSION ( ) ) ; ExistsDir ( dir ) {
2017-08-31 00:04:28 +03:00
return dir
2016-10-28 05:00:58 +03:00
}
2018-10-14 19:50:54 +03:00
if dir := filepath . Join ( prefix , "Qt" + QT_VERSION ( ) ) ; ExistsDir ( dir ) {
return dir
}
return filepath . Join ( prefix , "Qt" )
2016-10-28 05:00:58 +03:00
}
2017-07-13 18:04:51 +03:00
func QT_FAT ( ) bool {
2017-08-21 20:39:31 +03:00
return os . Getenv ( "QT_FAT" ) == "true"
2017-07-13 18:04:51 +03:00
}
2016-10-28 05:00:58 +03:00
func QT_STUB ( ) bool {
2018-04-18 16:32:40 +03:00
return os . Getenv ( "QT_STUB" ) == "true" && ! QT_FAT ( )
2016-10-28 05:00:58 +03:00
}
2016-12-16 23:59:46 +03:00
2017-01-07 20:26:06 +03:00
func QT_DEBUG ( ) bool {
2017-08-21 20:39:31 +03:00
return os . Getenv ( "QT_DEBUG" ) == "true"
2017-01-07 20:26:06 +03:00
}
2019-04-20 20:34:45 +03:00
func QT_DEBUG_CPP ( ) bool {
return os . Getenv ( "QT_DEBUG_CPP" ) == "true"
}
2017-05-18 01:17:02 +03:00
func QT_DEBUG_QML ( ) bool {
2017-08-21 20:39:31 +03:00
return os . Getenv ( "QT_DEBUG_QML" ) == "true"
2017-05-18 01:17:02 +03:00
}
2018-07-15 22:40:07 +03:00
func QT_DEBUG_CONSOLE ( ) bool {
return os . Getenv ( "QT_DEBUG_CONSOLE" ) == "true"
}
2019-04-07 01:31:32 +03:00
func CheckBuildTarget ( buildTarget string , docker bool ) {
2016-12-16 23:59:46 +03:00
switch buildTarget {
2017-04-17 20:21:21 +03:00
case "android" , "android-emulator" ,
2017-03-17 23:36:32 +03:00
"ios" , "ios-simulator" ,
"sailfish" , "sailfish-emulator" , "asteroid" ,
"rpi1" , "rpi2" , "rpi3" ,
2017-07-12 00:33:08 +03:00
"windows" , "darwin" , "linux" ,
2018-06-09 03:31:50 +03:00
"homebrew" , "ubports" ,
2019-06-06 02:01:47 +03:00
"js" , "wasm" , "freebsd" : //TODO: pkg_config ?
2016-12-16 23:59:46 +03:00
default :
2017-07-12 00:33:08 +03:00
if ! strings . Contains ( buildTarget , "_" ) {
Log . Panicf ( "failed to recognize build target %v" , buildTarget )
}
2016-12-16 23:59:46 +03:00
}
2019-04-07 01:31:32 +03:00
if ! docker && buildTarget != runtime . GOOS && ! strings . Contains ( buildTarget , "_" ) {
2016-12-16 23:59:46 +03:00
switch {
2017-03-11 00:54:09 +03:00
case QT_MSYS2 ( ) :
2017-03-17 23:36:32 +03:00
Log . Fatalf ( "%v is not supported as a deploy target on %v with MSYS2 -> install the official Qt version instead and try again" , buildTarget , runtime . GOOS )
2019-04-16 19:28:55 +03:00
case QT_HOMEBREW ( ) , QT_MACPORTS ( ) , QT_NIX ( ) , QT_FELGO ( ) :
2018-10-09 19:38:22 +03:00
Log . Fatalf ( "%v is not supported as a deploy target on %v with HomeBrew/MacPorts/Nix -> install the official Qt version instead and try again" , buildTarget , runtime . GOOS )
2018-03-29 13:09:04 +03:00
case QT_PKG_CONFIG ( ) && ! QT_UBPORTS ( ) :
2017-03-17 23:36:32 +03:00
Log . Fatalf ( "%v is not supported as a deploy target on %v with PkgConfig -> install the official Qt version instead and try again" , buildTarget , runtime . GOOS )
2016-12-16 23:59:46 +03:00
}
}
}
2017-02-01 18:38:51 +03:00
2017-03-11 00:54:09 +03:00
func CI ( ) bool {
2017-08-21 20:39:31 +03:00
return os . Getenv ( "CI" ) == "true"
2017-02-01 18:38:51 +03:00
}
2017-02-27 00:03:27 +03:00
func QT_QMAKE_DIR ( ) string {
2017-08-21 20:39:31 +03:00
if dir , ok := os . LookupEnv ( "QT_QMAKE_DIR" ) ; ok {
2017-02-27 03:23:27 +03:00
return filepath . Clean ( dir )
}
return ""
2017-02-27 00:03:27 +03:00
}
2017-02-28 21:27:55 +03:00
func QT_DOCKER ( ) bool {
2017-08-21 20:39:31 +03:00
return os . Getenv ( "QT_DOCKER" ) == "true"
2017-02-28 21:27:55 +03:00
}
2017-03-02 21:24:25 +03:00
2017-07-12 00:33:08 +03:00
func QT_VAGRANT ( ) bool {
2017-08-21 20:39:31 +03:00
return os . Getenv ( "QT_VAGRANT" ) == "true"
2017-07-12 00:33:08 +03:00
}
2017-03-17 23:36:32 +03:00
//TODO: use qmake props
2019-04-21 02:03:23 +03:00
func ToolPath ( tool , target string ) string {
if dir := QT_QMAKE_DIR ( ) ; dir != "" {
return filepath . Join ( dir , tool )
2017-03-02 21:24:25 +03:00
}
2018-03-29 13:09:04 +03:00
if strings . HasPrefix ( target , "sailfish" ) && ! QT_SAILFISH ( ) {
2017-08-21 20:39:31 +03:00
target = runtime . GOOS
}
2017-03-02 21:24:25 +03:00
switch target {
case "darwin" :
2019-05-13 21:37:59 +03:00
if QT_PKG_CONFIG ( ) {
return filepath . Join ( strings . TrimSpace ( RunCmd ( exec . Command ( "pkg-config" , "--variable=host_bins" , "Qt5Core" ) , "utils.PKG_CONFIG_hostBins" ) ) , tool )
}
2018-10-09 19:38:22 +03:00
if QT_NIX ( ) {
path , _ := exec . LookPath ( tool )
path , _ = filepath . Abs ( path )
return path
}
2017-03-02 21:24:25 +03:00
return filepath . Join ( QT_DARWIN_DIR ( ) , "bin" , tool )
case "windows" :
if runtime . GOOS == target {
2017-03-11 00:54:09 +03:00
if QT_MSYS2 ( ) {
2017-04-30 01:15:23 +03:00
if QT_MSYS2_STATIC ( ) {
return filepath . Join ( QT_MSYS2_DIR ( ) , "qt5-static" , "bin" , tool )
}
2017-03-02 21:24:25 +03:00
return filepath . Join ( QT_MSYS2_DIR ( ) , "bin" , tool )
}
2019-03-30 19:41:02 +03:00
path := filepath . Join ( QT_DIR ( ) , QT_VERSION_MAJOR ( ) , MINGWDIR ( ) , "bin" , tool )
2018-10-15 01:43:19 +03:00
if ! ExistsDir ( filepath . Join ( QT_DIR ( ) , QT_VERSION_MAJOR ( ) ) ) {
2019-03-30 19:41:02 +03:00
path = filepath . Join ( QT_DIR ( ) , QT_VERSION ( ) , MINGWDIR ( ) , "bin" , tool )
2018-12-17 03:52:29 +03:00
}
if ! ExistsFile ( path + ".exe" ) {
2019-03-30 19:41:02 +03:00
path = strings . Replace ( path , MINGWDIR ( ) , "mingw53_32" , - 1 )
2018-10-15 01:43:19 +03:00
}
2018-10-15 05:26:30 +03:00
if ! ExistsFile ( path + ".exe" ) {
2018-10-15 01:43:19 +03:00
path = strings . Replace ( path , "mingw53_32" , "mingw49_32" , - 1 )
}
return path
2017-03-02 21:24:25 +03:00
}
return filepath . Join ( QT_MXE_DIR ( ) , "usr" , QT_MXE_TRIPLET ( ) , "qt5" , "bin" , tool )
2019-06-06 02:01:47 +03:00
case "linux" , "ubports" , "freebsd" :
2017-03-11 00:54:09 +03:00
if QT_PKG_CONFIG ( ) {
2019-05-13 21:37:59 +03:00
return filepath . Join ( strings . TrimSpace ( RunCmd ( exec . Command ( "pkg-config" , "--variable=host_bins" , "Qt5Core" ) , "utils.PKG_CONFIG_hostBins" ) ) , tool )
2017-03-02 21:24:25 +03:00
}
2018-10-15 01:43:19 +03:00
path := filepath . Join ( QT_DIR ( ) , QT_VERSION_MAJOR ( ) , "gcc_64" , "bin" , tool )
if ! ExistsDir ( filepath . Join ( QT_DIR ( ) , QT_VERSION_MAJOR ( ) ) ) {
2018-10-30 18:53:05 +03:00
path = filepath . Join ( QT_DIR ( ) , QT_VERSION ( ) , "gcc_64" , "bin" , tool )
2018-10-15 01:43:19 +03:00
}
return path
2017-03-02 21:24:25 +03:00
case "ios" , "ios-simulator" :
return filepath . Join ( QT_DIR ( ) , QT_VERSION_MAJOR ( ) , "ios" , "bin" , tool )
case "android" :
2019-05-13 21:37:59 +03:00
if GOARCH ( ) == "arm64" {
return filepath . Join ( QT_DIR ( ) , QT_VERSION_MAJOR ( ) , "android_arm64_v8a" , "bin" , tool )
}
2017-03-02 21:24:25 +03:00
return filepath . Join ( QT_DIR ( ) , QT_VERSION_MAJOR ( ) , "android_armv7" , "bin" , tool )
2017-04-17 20:21:21 +03:00
case "android-emulator" :
return filepath . Join ( QT_DIR ( ) , QT_VERSION_MAJOR ( ) , "android_x86" , "bin" , tool )
2018-03-29 13:09:04 +03:00
case "sailfish" , "sailfish-emulator" :
return filepath . Join ( "/srv/mer/targets/SailfishOS-" + QT_SAILFISH_VERSION ( ) + "-i486/usr/lib/qt5/bin/" , tool )
//TODO support indirect access on desktop: return filepath.Join(os.Getenv("HOME"), ".config", "SailfishOS-SDK", "mer-sdk-tools", "MerSDK", "SailfishOS-i486", tool)
2017-03-02 21:24:25 +03:00
case "asteroid" :
2017-08-21 20:39:31 +03:00
//TODO:
2017-03-02 21:24:25 +03:00
case "rp1" , "rpi2" , "rpi3" :
return filepath . Join ( QT_DIR ( ) , QT_VERSION_MAJOR ( ) , target , "bin" , tool )
2019-09-10 21:17:30 +03:00
case "wasm" , "js" :
return filepath . Join ( QT_DIR ( ) , QT_VERSION_MAJOR ( ) , "wasm_32" , "bin" , tool )
2017-03-02 21:24:25 +03:00
}
return ""
}
2017-04-11 00:38:26 +03:00
2018-10-14 19:50:54 +03:00
//TODO: detect webkit support automatically
2017-04-11 00:38:26 +03:00
func QT_WEBKIT ( ) bool {
2017-08-21 20:39:31 +03:00
return os . Getenv ( "QT_WEBKIT" ) == "true"
2017-04-11 00:38:26 +03:00
}
2018-03-19 22:54:58 +03:00
func CGO_CFLAGS_ALLOW ( ) string {
if allowed , ok := os . LookupEnv ( "CGO_CFLAGS_ALLOW" ) ; ok {
return allowed
}
return ".*"
}
func CGO_CXXFLAGS_ALLOW ( ) string {
if allowed , ok := os . LookupEnv ( "CGO_CXXFLAGS_ALLOW" ) ; ok {
return allowed
}
return ".*"
}
func CGO_LDFLAGS_ALLOW ( ) string {
if allowed , ok := os . LookupEnv ( "CGO_LDFLAGS_ALLOW" ) ; ok {
return allowed
}
return ".*"
}
2018-03-23 03:18:49 +03:00
2019-09-10 21:17:30 +03:00
func CGO_MSCFLAGS_ALLOW ( ) string {
if allowed , ok := os . LookupEnv ( "CGO_MSCFLAGS_ALLOW" ) ; ok {
return allowed
}
return ".*"
}
func CGO_MSCXXFLAGS_ALLOW ( ) string {
if allowed , ok := os . LookupEnv ( "CGO_MSCXXFLAGS_ALLOW" ) ; ok {
return allowed
}
return ".*"
}
func CGO_MSLDFLAGS_ALLOW ( ) string {
if allowed , ok := os . LookupEnv ( "CGO_MSLDFLAGS_ALLOW" ) ; ok {
return allowed
}
return ".*"
}
2018-03-23 03:18:49 +03:00
func GOARCH ( ) string {
if arch , ok := os . LookupEnv ( "GOARCH" ) ; ok {
return arch
}
return runtime . GOARCH
}
2018-04-07 22:05:41 +03:00
func QT_DYNAMIC_SETUP ( ) bool {
return os . Getenv ( "QT_DYNAMIC_SETUP" ) == "true"
}
2018-12-17 20:56:35 +03:00
func GOFLAGS ( ) string {
if flags , ok := os . LookupEnv ( "GOFLAGS" ) ; ok {
return flags
}
2019-01-18 06:38:48 +03:00
if UseGOMOD ( "" ) {
2018-12-17 20:56:35 +03:00
return "-mod=vendor"
}
return ""
}
func GOMOD ( path string ) string {
2019-05-13 21:37:59 +03:00
if useGOMODPath != "" {
return useGOMODPath
}
2018-12-17 20:56:35 +03:00
if mod , ok := os . LookupEnv ( "GOMOD" ) ; ok {
return mod
}
cmd := exec . Command ( "go" , "env" , "GOMOD" )
2019-04-21 02:03:23 +03:00
if path != "" {
cmd . Dir = path
}
2018-12-17 20:56:35 +03:00
return strings . TrimSpace ( RunCmd ( cmd , "GOMOD" ) )
}
var (
2019-04-12 03:49:39 +03:00
useGOMOD int
2019-05-13 21:37:59 +03:00
useGOMODPath string
2018-12-17 20:56:35 +03:00
useGOMODMutex = new ( sync . Mutex )
)
func UseGOMOD ( path string ) ( r bool ) {
2019-08-22 01:19:01 +03:00
if strings . Contains ( strings . Replace ( path , "\\" , "/" , - 1 ) , "src/" + PackageName ) {
2019-08-24 19:09:53 +03:00
os . Setenv ( "GO111MODULE" , "off" )
2019-06-27 23:16:04 +03:00
return
}
2019-08-22 01:19:01 +03:00
if wd , _ := os . Getwd ( ) ; path == "" && strings . Contains ( strings . Replace ( wd , "\\" , "/" , - 1 ) , "src/" + PackageName ) {
2019-06-27 23:16:04 +03:00
os . Setenv ( "GO111MODULE" , "off" )
return
}
2018-12-17 20:56:35 +03:00
useGOMODMutex . Lock ( )
2019-04-12 03:49:39 +03:00
if useGOMOD == 0 {
2019-05-13 21:37:59 +03:00
if gm := GOMOD ( path ) ; len ( gm ) != 0 {
2019-04-12 03:49:39 +03:00
useGOMOD = 1
2019-05-13 21:37:59 +03:00
useGOMODPath = gm
2019-04-12 03:49:39 +03:00
} else {
2019-04-21 02:03:23 +03:00
if path != "" {
useGOMOD = - 1
}
2019-04-12 03:49:39 +03:00
}
2018-12-17 20:56:35 +03:00
}
2019-04-12 03:49:39 +03:00
r = useGOMOD == 1
2018-12-17 20:56:35 +03:00
useGOMODMutex . Unlock ( )
return
}
2019-01-15 03:19:42 +03:00
func QT_GEN_OPENGL ( ) bool {
return os . Getenv ( "QT_GEN_OPENGL" ) == "true"
}
2019-01-18 06:38:48 +03:00
func GoList ( args ... string ) * exec . Cmd {
cmd := exec . Command ( "go" , "list" )
if UseGOMOD ( "" ) {
2019-09-04 03:09:11 +03:00
if strings . Contains ( strings . Join ( args , "|" ) , "github.com/therecipe/qt/internal" ) {
2019-01-21 21:28:43 +03:00
cmd . Args = append ( cmd . Args , "-mod=readonly" )
} else {
2019-01-18 06:38:48 +03:00
cmd . Args = append ( cmd . Args , GOFLAGS ( ) )
}
2019-05-16 06:31:11 +03:00
cmd . Dir = filepath . Dir ( GOMOD ( "" ) )
2019-01-18 06:38:48 +03:00
}
2019-05-01 03:39:02 +03:00
for i := len ( args ) - 1 ; i >= 0 ; i -- {
a := args [ i ]
if strings . HasPrefix ( a , "-" ) {
args = append ( args [ : i ] , args [ i + 1 : ] ... )
2019-09-04 03:09:11 +03:00
if GOVERSION_NUM ( ) > 110 {
2019-05-08 02:03:25 +03:00
cmd . Args = append ( cmd . Args , a )
}
2019-05-01 03:39:02 +03:00
}
}
2019-01-18 06:38:48 +03:00
cmd . Args = append ( cmd . Args , "-e" , "-f" )
cmd . Args = append ( cmd . Args , args ... )
2019-01-22 00:14:26 +03:00
cmd . Env = append ( os . Environ ( ) , [ ] string { "CGO_ENABLED=0" } ... )
2019-01-18 06:38:48 +03:00
return cmd
}
2019-04-07 01:31:32 +03:00
2019-04-12 03:49:39 +03:00
var (
goListCache = make ( map [ string ] string )
goListCacheMutex = new ( sync . Mutex )
)
func GoListOptional ( args ... string ) ( r string ) {
goListCacheMutex . Lock ( )
if _ , ok := goListCache [ strings . Join ( args , "|" ) ] ; ! ok {
2019-04-28 03:44:55 +03:00
goListCache [ strings . Join ( args , "|" ) ] = RunCmdOptional ( GoList ( args [ : len ( args ) - 1 ] ... ) , args [ len ( args ) - 1 ] )
2019-04-12 03:49:39 +03:00
}
r = goListCache [ strings . Join ( args , "|" ) ]
goListCacheMutex . Unlock ( )
return r
}
2019-04-07 01:31:32 +03:00
func QT_STATIC ( ) bool {
return os . Getenv ( "QT_STATIC" ) == "true"
}
2019-04-20 20:34:45 +03:00
func QT_NOT_CACHED ( ) bool {
return os . Getenv ( "QT_NOT_CACHED" ) == "true"
}
2019-06-02 00:45:14 +03:00
var (
goVersionCache string
goVersionCacheMutex = new ( sync . Mutex )
)
func GOVERSION ( ) ( r string ) {
2019-09-10 21:17:30 +03:00
if v , ok := os . LookupEnv ( "GOVERSION" ) ; ok {
return v
}
if QT_MSVC ( ) {
return "go1.10"
}
2019-06-02 00:45:14 +03:00
goVersionCacheMutex . Lock ( )
2019-09-14 20:07:15 +03:00
var version string
2019-06-02 00:45:14 +03:00
if goVersionCache == "" {
2019-09-14 20:07:15 +03:00
version = RunCmd ( exec . Command ( "go" , "version" ) , "get go version" )
goVersionCache = strings . Split ( version , " " ) [ 2 ]
2019-06-02 00:45:14 +03:00
}
2019-09-14 20:07:15 +03:00
if strings . Contains ( version , "devel" ) {
if strings . Contains ( version , "+6741b7009d" ) { //go build that supports the msvc
2019-09-12 20:23:17 +03:00
goVersionCache = "go1.10"
} else {
goVersionCache = "go1.13"
}
Log . Warnln ( "go dev build detected; setting GOVERSION to:" , goVersionCache )
}
2019-06-02 00:45:14 +03:00
r = goVersionCache
goVersionCacheMutex . Unlock ( )
return r
}
2019-09-04 03:09:11 +03:00
func GOVERSION_NUM ( ) int {
version := strings . TrimPrefix ( GOVERSION ( ) , "go" )
vmaj , _ := strconv . Atoi ( string ( version [ 0 ] ) )
vmin , _ := strconv . Atoi ( strings . Replace ( version [ 1 : ] , "." , "" , - 1 ) )
if strings . Count ( version , "." ) == 2 {
vmin , _ = strconv . Atoi ( strings . Split ( version [ 1 : ] , "." ) [ 1 ] )
}
return vmaj * 1e2 + vmin
}