def configureOptions(self, defines=""): """returns default configure options""" options = BuildSystemBase.configureOptions(self) if OsUtils.isWin(): options += " -j" + os.getenv("NUMBER_OF_PROCESSORS") options += " --build-dir=" + self.buildDir() else: # TODO: real value options += " install --prefix=%s" % self.buildDir() options += " -j10" options += ( " --build-type=minimal" # " --debug-configuration" " threading=multi") if not self.subinfo.options.buildStatic: options += (" link=shared" " runtime-link=shared") else: options += (" link=static" " runtime-link=shared") if CraftCore.compiler.isX64(): options += " address-model=64 architecture=x86" else: options += " address-model=32 architecture=x86" if self.buildType() == "Debug": options += " variant=debug" else: options += " variant=release" options += " toolset=" if CraftCore.compiler.isClang(): options += "clang" if CraftCore.compiler.isGCC(): options += " threadapi=pthread" elif CraftCore.compiler.isMinGW(): options += "gcc" elif CraftCore.compiler.isMSVC(): platform = str(CraftCore.compiler.getMsvcPlatformToolset()) if CraftVersion(self.buildTarget) < CraftVersion( "1_65_1") and CraftCore.compiler.isMSVC2017(): options += f"msvc-{platform[:2]}.0" else: options += f"msvc-{platform[:2]}.{platform[2:]}" elif CraftCore.compiler.isIntel(): options += "intel" options += " -sINTEL_PATH=\"%s\"" % os.path.join( os.getenv("INTELDIR"), "bin", os.getenv("TARGET_ARCH")) options += " -sINTEL_BASE_MSVC_TOOLSET=vc-%s" % ({ "vs2008": "9_0", "vs2010": "10_0", "vs2012": "11_0" }[os.getenv("INTEL_VSSHELL")]) options += " -sINTEL_VERSION=%s" % os.getenv("PRODUCT_NAME")[-2:] craftUserConfig = os.path.join(CraftStandardDirs.craftRoot(), "etc", "craft-boost-config.jam") if os.path.exists(craftUserConfig): options += " --user-config=" + os.path.join(craftUserConfig) return options
def __readDependenciesForChildren(self, deps: [(str, str)]) -> []: children = [] if deps: for packaheName, requiredVersion in deps: if (packaheName, self.depenendencyType ) not in CraftDependencyPackage._packageCache: package = CraftPackageObject.get(packaheName) if not package: raise BlueprintException( f"Failed to resolve {packaheName} as a dependency of {self}", self) if requiredVersion and requiredVersion != None and CraftVersion( package.version) < CraftVersion(requiredVersion): raise BlueprintException( f"{self} requries {package} version {requiredVersion!r} but {package.version!r} is installed", self) p = CraftDependencyPackage(package) CraftCore.log.debug(f"adding package {packaheName}") CraftDependencyPackage._packageCache[( packaheName, self.depenendencyType)] = p p.depenendencyType = self.depenendencyType else: p = CraftDependencyPackage._packageCache[( packaheName, self.depenendencyType)] children.append(p) return children
def packageIsOutdated(package): installed = InstallDB.installdb.getInstalledPackages(package) if not installed: return True for pack in installed: version = pack.getVersion() if not version: continue return CraftVersion(package.version) > CraftVersion(version)
def configureOptions(self, defines=""): """returns default configure options""" options = BuildSystemBase.configureOptions(self) options += f" -j{multiprocessing.cpu_count()}" options += " --build-dir=" + self.buildDir() options += (" --build-type=minimal" # " --debug-configuration" " threading=multi" ) options += f" include=\"{CraftCore.standardDirs.craftRoot()}/include\" " options += f" library-path=\"{CraftCore.standardDirs.craftRoot()}/lib\" " if CraftCore.debug.verbose() >= 1: options += " --dx13" if not self.subinfo.options.buildStatic: options += (" link=shared" " runtime-link=shared") else: options += (" link=static" " runtime-link=shared") if CraftCore.compiler.isX64(): options += " address-model=64 architecture=x86" else: options += " address-model=32 architecture=x86" if self.buildType() == "Debug": options += " variant=debug" else: options += " variant=release" options += " toolset=" if CraftCore.compiler.isClang(): options += "clang" if CraftCore.compiler.isGCC(): options += " threadapi=pthread" elif CraftCore.compiler.isGCC(): options += "gcc" elif CraftCore.compiler.isMSVC(): platform = str(CraftCore.compiler.getMsvcPlatformToolset()) if CraftVersion(self.buildTarget) < CraftVersion("1_65_1") and CraftCore.compiler.isMSVC2017(): # pretend to be 2015 options += f"msvc-{platform[:2]}.0" elif CraftVersion(self.buildTarget) < CraftVersion("1.70.0") and CraftCore.compiler.isMSVC2019(): # pretend to be 2017 options += f"msvc-{platform[:2]}.1" else: options += f"msvc-{platform[:2]}.{platform[2:]}" elif CraftCore.compiler.isIntel(): options += "intel" options += " -sINTEL_PATH=\"%s\"" % os.path.join(os.getenv("INTELDIR"), "bin", os.getenv("TARGET_ARCH")) options += " -sINTEL_BASE_MSVC_TOOLSET=vc-%s" % ( {"vs2008": "9_0", "vs2010": "10_0", "vs2012": "11_0"}[os.getenv("INTEL_VSSHELL")]) options += " -sINTEL_VERSION=%s" % os.getenv("PRODUCT_NAME")[-2:] options += self.craftUserConfig() return options
def preArchive(self): if CraftVersion(self.buildTarget) > CraftVersion("5.3.0"): installColorSchemesScript = os.path.join( self.sourceDir(), 'release-scripts/install_colorschemes.py') CraftCore.log.info(f"Executing: {installColorSchemesScript}") subprocess.check_call([ sys.executable, installColorSchemesScript, os.path.join(self.archiveDir(), "bin/data") ]) return super().preArchive()
def configureOptions(self, defines=""): """returns default configure options""" options = BuildSystemBase.configureOptions(self) options += [ f"-j{multiprocessing.cpu_count()}", f"--build-dir={self.buildDir()}", "--build-type=minimal", # " --debug-configuration" "threading=multi", f"include=\"{CraftCore.standardDirs.craftRoot()}/include\"", f"library-path=\"{CraftCore.standardDirs.craftRoot()}/lib\"" ] if CraftCore.debug.verbose() >= 1: options += ["--dx13"] if not self.subinfo.options.buildStatic: options += ["link=shared", "runtime-link=shared"] else: options += ["link=static", "runtime-link=shared"] if CraftCore.compiler.isX64(): options += ["address-model=64", "architecture=x86"] else: options += ["address-model=32", "architecture=x86"] if self.buildType() == "Debug": options += ["variant=debug"] else: options += ["variant=release"] toolset = "toolset=" if CraftCore.compiler.isClang(): toolset += "clang" if CraftCore.compiler.isGCC(): toolset += " threadapi=pthread" elif CraftCore.compiler.isGCC(): toolset += "gcc" elif CraftCore.compiler.isMSVC(): platform = str(CraftCore.compiler.getMsvcPlatformToolset()) if CraftVersion(self.buildTarget) < CraftVersion( "1_65_1") and CraftCore.compiler.isMSVC2017(): # pretend to be 2015 toolset += f"msvc-{platform[:2]}.0" elif CraftVersion(self.buildTarget) < CraftVersion( "1.70.0") and CraftCore.compiler.isMSVC2019(): # pretend to be 2017 toolset += f"msvc-{platform[:2]}.1" else: toolset += f"msvc-{platform[:2]}.{platform[2:]}" options += [toolset] options += self.craftUserConfig() return options
def setDependencies(self): self.buildDependencies["virtual/base"] = "default" self.buildDependencies["frameworks/extra-cmake-modules"] = "default" self.buildDependencies["dev-util/7zip"] = "default" self.runtimeDependencies["libs/qt5/qtbase"] = "default" self.runtimeDependencies["libs/qt5/qtdeclarative"] = "default" self.runtimeDependencies["frameworks/tier1/breeze-icons"] = "default" self.runtimeDependencies["frameworks/tier1/karchive"] = "default" self.runtimeDependencies["frameworks/tier1/kconfig"] = "default" self.runtimeDependencies["frameworks/tier1/kguiaddons"] = "default" self.runtimeDependencies["frameworks/tier1/ki18n"] = "default" self.runtimeDependencies["frameworks/tier3/kiconthemes"] = "default" self.runtimeDependencies["frameworks/tier3/kinit"] = "default" self.runtimeDependencies["frameworks/tier1/kitemmodels"] = "default" self.runtimeDependencies["frameworks/tier1/kitemviews"] = "default" self.runtimeDependencies["frameworks/tier2/kjobwidgets"] = "default" self.runtimeDependencies["frameworks/tier3/kcmutils"] = "default" self.runtimeDependencies["frameworks/tier3/knewstuff"] = "default" self.runtimeDependencies["frameworks/tier3/knotifyconfig"] = "default" self.runtimeDependencies["frameworks/tier3/kparts"] = "default" self.runtimeDependencies["frameworks/tier3/kservice"] = "default" self.runtimeDependencies["frameworks/tier1/sonnet"] = "default" self.runtimeDependencies["frameworks/tier3/ktexteditor"] = "default" self.runtimeDependencies["frameworks/tier1/threadweaver"] = "default" self.runtimeDependencies["frameworks/tier1/kwindowsystem"] = "default" self.runtimeDependencies["frameworks/tier3/kxmlgui"] = "default" self.runtimeDependencies["kde/kdesdk/libkomparediff2"] = "default" self.runtimeDependencies["data/hicolor-icon-theme"] = "default" self.runtimeDependencies["win32libs/llvm-meta/clang"] = "default" # handle kdevplatform merge into kdevelop.git if self.buildTarget != "master" and CraftVersion( self.buildTarget) < CraftVersion("5.2"): self.runtimeDependencies[ "extragear/kdevelop/kdevplatform"] = "default" else: self.runtimeDependencies["libs/qt5/qtquickcontrols"] = "default" self.runtimeDependencies["libs/qt5/qtwebengine"] = "default" self.runtimeDependencies["kdesupport/grantlee"] = "default" if self.options.features.fullplasma: self.runtimeDependencies["frameworks/tier3/krunner"] = "default" self.runtimeDependencies[ "frameworks/tier3/plasma-framework"] = "default" if self.options.features.fullkdevelop: self.runtimeDependencies[ "extragear/kdevelop/kdev-python"] = "default" self.runtimeDependencies["extragear/kdevelop/kdev-php"] = "default" self.runtimeDependencies["extragear/kdevelop-pg-qt"] = "default" # Install extra plugins shipped by Kate self.runtimeDependencies["kde/applications/kate"] = "default"
def platform(self): if not self._platform: if OsUtils.isWin(): if craftCompiler.isMSVC(): if self.qtVer < CraftVersion("5.8"): if craftCompiler.isMSVC2017(): _compiler = "msvc2015" else: _compiler = craftCompiler.abi.split("_")[0] else: _compiler = "msvc" if craftCompiler.isClang(): self._platform = f"win32-clang-{_compiler}" else: self._platform = f"win32-{_compiler}" elif craftCompiler.isMinGW(): self._platform = "win32-g++" elif craftCompiler.isIntel(): self._platform = "win32-icc" else: craftDebug.log.critical(f"QMakeBuildSystem: unsupported compiler platform {craftCompiler}") elif OsUtils.isUnix(): if OsUtils.isMac(): osPart = "macx" elif OsUtils.isFreeBSD(): osPart = "freebsd" else: osPart = "linux" if craftCompiler.isClang(): compilerPart = "clang" else: compilerPart = "g++" self._platform = osPart + "-" + compilerPart return self._platform
def __isInstalled(self): """ check if nsis (Nullsoft scriptable install system) is installed somewhere """ self.nsisExe = CraftCore.cache.findApplication("makensis") if not self.nsisExe: return False return CraftCore.cache.getVersion( self.nsisExe, versionCommand="/VERSION") >= CraftVersion("3.03")
def __init__(self, app, version, classA, classB=VirtualPackageBase, pattern=None, versionCommand=None): appVersion = utils.utilsCache.getVersion(app, pattern, versionCommand) newer = appVersion and appVersion >= CraftVersion(version) self.skipCondition = not newer or not craftSettings.getboolean( "CraftDebug", "AllowToSkipPackages", True) self.checkVersion = version MaybeVirtualPackageBase.__init__(self, condition=self.skipCondition, classA=classA, classB=classB) if not self.skipCondition: # override the install method def install(): craftDebug.log.info( f"Skipping installation of {self} as the installed version is >= {self.checkVersion}" ) return self.baseClass.install(self) def sourceRevision(): return "system-installation: " + utils.utilsCache.findApplication( app) def version(self): return str(appVersion) setattr(self, "install", install) setattr(self, "sourceRevision", sourceRevision) setattr(self.__class__, "version", property(version))
def getVersion(self, app, pattern=None, versionCommand=None) -> CraftVersion: app = self.findApplication(app) if not app: return None if app in self._versionCache: return self._versionCache[app] if not pattern: pattern = re.compile(r"(\d+\.\d+(?:\.\d+)?)") if not versionCommand: versionCommand = "--version" if not isinstance(pattern, CraftCache.RE_TYPE): raise Exception( "getVersion can only handle a compiled regular expression as pattern" ) _, output = self.getCommandOutput(app, versionCommand) if not output: return None match = pattern.search(output) if not match: CraftCore.log.warning( f"Could not detect pattern: {pattern.pattern} in {output}") return None appVersion = CraftVersion(match.group(1)) self._versionCache[app] = appVersion CraftCore.log.debug(f"getVersion: {app}[{appVersion}]") return appVersion
def setDefaults(self, defines: dict) -> dict: defines = super().setDefaults(defines) version = str( CraftVersion(defines.get("version", self.version)).strictVersion) # we require a version of the format 1.2.3.4 count = version.count(".") if count < 4: version = f"{version}{'.0' * (3-count)}" defines["version"] = version defines.setdefault( "name", f"{defines['company']}{defines['display_name']}".replace(" ", "")) defines.setdefault( "setupname", os.path.join( self.packageDestinationDir(), self.binaryArchiveName(fileType="appx", includeRevision=True))) defines.setdefault("craft_id", self.package.path.replace("/", ".")) self._setupFileTypes(defines) # compat with nsis if "shortcuts" in self.defines: defines.setdefault("executable", self.defines["shortcuts"][0]["target"]) return defines
def __readDependenciesForChildren(self, deps: [(str, str)]) -> []: children = [] if deps: for packaheName, requiredVersion in deps: if (packaheName, self.depenendencyType ) not in CraftDependencyPackage._packageCache: package = CraftPackageObject.get(packaheName) if not package: raise BlueprintException( f"Failed to resolve {packaheName} as a dependency of {self}", self) if isinstance(requiredVersion, tuple): requiredVersion, type = requiredVersion if type == DependencyRequirementType.Required: if not bool(package.categoryInfo.compiler & CraftCore.compiler.compiler): raise BlueprintException( f"{self} requries {package}, but it is not supported on {CraftCore.compiler.compiler}", self) if not bool(package.categoryInfo.platforms & CraftCore.compiler.platform): raise BlueprintException( f"{self} requries {package}, but it is not supported on {CraftCore.compiler.platform}", self) if package.isIgnored() or isinstance( package.instance, VirtualPackageBase.VirtualPackageBase): raise BlueprintException( f"{self} requries {package}, but it is ignored", self) if requiredVersion and requiredVersion != None and CraftVersion( package.version) < CraftVersion(requiredVersion): raise BlueprintException( f"{self} requries {package} version {requiredVersion!r} but {package.version!r} is installed", self) p = CraftDependencyPackage(package) CraftCore.log.debug(f"adding package {packaheName}") CraftDependencyPackage._packageCache[( packaheName, self.depenendencyType)] = p p.depenendencyType = self.depenendencyType else: p = CraftDependencyPackage._packageCache[( packaheName, self.depenendencyType)] children.append(p) return children
def packageIsOutdated(package): installed = CraftCore.installdb.getInstalledPackages(package) if not installed: return True for pack in installed: version = pack.getVersion() if not version: continue if CraftCore.settings.getboolean("ContinuousIntegration", "Enabled", False): # automatically downgreade in ci mode return package.version != version else: cacheVersion = pack.getCacheVersion() if cacheVersion and cacheVersion != CraftBase.CraftBase.cacheVersion( ): # can only happen for packages installed from cache return True return CraftVersion(package.version) > CraftVersion(version)
def __init__(self, package): self.path = package.path self.webpage = package.subinfo.webpage self.description = package.subinfo.description self.tags = package.subinfo.tags versions = list(package.subinfo.svnTargets.keys()) + list( package.subinfo.targets.keys()) versions.sort(key=lambda x: CraftVersion(x)) self.availableVersions = ", ".join(versions)
def __init__(self, package): self.path = package.path self.name = package.name info = MetaInfo(package) self.displayName = info.displayName self.webpage = info.webpage self.description = info.description self.tags = info.tags versions = info.versions versions.sort(key=lambda x: CraftVersion(x)) self.availableVersions = ", ".join(versions)
def __init__(self, app, version, classA, classB=VirtualPackageBase, pattern=None, versionCommand=None): app = CraftCore.cache.findApplication(app) newer = False if app and not app.startswith(CraftCore.standardDirs.craftRoot()): appVersion = CraftCore.cache.getVersion(app, pattern, versionCommand) newer = appVersion and appVersion >= CraftVersion(version) self.skipCondition = not newer or not CraftCore.settings.getboolean( "CraftDebug", "AllowToSkipPackages", True) self.checkVersion = version MaybeVirtualPackageBase.__init__(self, condition=self.skipCondition, classA=classA, classB=classB) if not self.skipCondition: # override the install method def install(): CraftCore.log.info( f"Skipping installation of {self} as the installed version of {app} {appVersion} >= {self.checkVersion}" ) return self.baseClass.install(self) def sourceRevision(): return f"system-installation: {app}" def version(self): return str(appVersion) setattr(self, "install", install) setattr(self, "sourceRevision", sourceRevision) setattr(self.__class__, "version", property(version))
def setDefaults(self, defines: dict) -> dict: defines = super().setDefaults(defines) version = str( CraftVersion(defines.get("version", self.version)).strictVersion) # we require a version of the format 1.2.3.4 count = version.count(".") if count < 4: version = f"{version}{'.0' * (3-count)}" defines["version"] = version defines.setdefault( "name", f"{defines['company']}{defines['display_name']}".replace(" ", "")) defines["setupname"] = str( Path(defines["setupname"]).with_suffix(".appx")) defines.setdefault("craft_id", self.package.path.replace("/", ".")) self._setupFileTypes(defines) # compat with nsis if "shortcuts" in self.defines: defines.setdefault("executable", self.defines["shortcuts"][0]["target"]) return defines
def _setDefaults(self, defines: dict) -> dict: defines = dict(defines) if "version" not in defines: version = str(CraftVersion(self.version).strictVersion) # we require a version of the format 1.2.3.4 count = version.count(".") if count < 4: version = f"{version}{'.0' * (3-count)}" defines.setdefault("version", version) defines.setdefault("architecture", CraftCore.compiler.architecture) defines.setdefault("company", "KDE e.V.") defines.setdefault("display_name", self.subinfo.displayName) defines.setdefault( "name", f"{defines['company']}{defines['display_name']}".replace(" ", "")) defines.setdefault("craft_id", self.package.path.replace("/", ".")) defines.setdefault("description", self.subinfo.description) defines.setdefault( "icon_png", os.path.join(CraftCore.standardDirs.craftBin(), "data", "icons", "craftyBENDER.png")) defines.setdefault("icon_png_44", defines["icon_png"]) defines.setdefault( "setupname", os.path.join( self.packageDestinationDir(), self.binaryArchiveName(fileType="appx", includeRevision=True))) self._setupFileTypes(defines) # compat with nsis if "shortcuts" in self.defines: defines.setdefault("executable", self.defines["shortcuts"][0]["target"]) return defines
def environment(self): if not self._environment: mergeroot = self.toNativePath(CraftCore.standardDirs.craftRoot()) ldflags = f" -L{mergeroot}/lib " cflags = f" -I{mergeroot}/include " if CraftCore.compiler.isMacOS: # Only look for includes/libraries in the XCode SDK on MacOS to avoid errors with # libraries installed by homebrew (causes errors e.g. with iconv since headers will be # found in /usr/local/include first but libraries are searched for in /usr/lib before # /usr/local/lib. See https://langui.sh/2015/07/24/osx-clang-include-lib-search-paths/ # Ensure that /usr/include comes before /usr/local/include in the header search path to avoid # pulling in headers from /usr/local/include (e.g. installed by homebrew) that will cause # linker errors later. sdkPath = CraftCore.cache.getCommandOutput( "xcrun", "--show-sdk-path")[1].strip() deploymentFlag = f"-mmacosx-version-min={os.environ['MACOSX_DEPLOYMENT_TARGET']}" cflags = f" -isysroot {sdkPath} {deploymentFlag} {cflags} -isystem /usr/include" ldflags = f" -isysroot {sdkPath} {deploymentFlag} {ldflags}" # TODO: well that sounded like a good idea, but is broken with recent xcode # when fixed we probably should also set that flag for the rest too? # See https://github.com/Homebrew/homebrew-core/issues/2674 for the -no_weak_imports flag #ldflags = f" -Wl,-no_weak_imports {ldflags}" if CraftCore.compiler.isMSVC(): # based on Windows-MSVC.cmake if self.buildType == "Release": cflags += " -MD -O2 -Ob2 -DNDEBUG " elif self.buildType == "RelWithDebInfo": cflags += " -MD -Zi -O2 -Ob1 -DNDEBUG " ldflags += " -debug " elif self.buildType == "Debug": cflags += " -MDd -Zi -Ob0 -Od " ldflags += " -debug -pdbtype:sept " else: if self.buildType == "Release": cflags += " -O3 -DNDEBUG " if self.buildType == "RelWithDebInfo": cflags += " -O2 -g -DNDEBUG " elif self.buildType == "Debug": cflags += " -O0 -g3 " if OsUtils.isWin(): def convertPath(path: str): return ":".join([ str(self.toNativePath(p)) for p in path.split(os.path.pathsep) ]) path = "/usr/local/bin:/usr/bin:/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl" if CraftCore.compiler.isMinGW(): gcc = shutil.which("gcc") if gcc: path = f"{self.toNativePath(os.path.dirname(gcc))}:{path}" elif CraftCore.compiler.isMSVC(): path = f"{self.toNativePath(os.path.dirname(shutil.which('cl')))}:{path}" self._environment[ "PATH"] = f"{path}:{convertPath(os.environ['PATH'])}" self._environment["PKG_CONFIG_PATH"] = convertPath( os.environ["PKG_CONFIG_PATH"]) if "make" in self._environment: del self._environment["make"] # MSYSTEM is used by uname if CraftCore.compiler.isMinGW(): self._environment[ "MSYSTEM"] = f"MINGW{CraftCore.compiler.bits}_CRAFT" elif CraftCore.compiler.isMSVC(): self._environment[ "MSYSTEM"] = f"MSYS{CraftCore.compiler.bits}_CRAFT" if self.useMSVCCompatEnv and CraftCore.compiler.isMSVC(): automake = [] for d in os.scandir( os.path.join(os.path.dirname(self._findBash()), "..", "share")): if d.name.startswith("automake"): automake += [(d.name.rsplit("-")[1], os.path.realpath(d.path))] automake.sort(key=lambda x: CraftVersion(x[0])) latestAutomake = automake[-1][1] if False: cl = "clang-cl" else: cl = "cl" clWrapper = self.toNativePath( os.path.join(latestAutomake, "compile")) self._environment[ "AR"] = f"{self.toNativePath(os.path.join(latestAutomake, 'ar-lib'))} lib" self._environment["LD"] = "link -nologo" self._environment["CC"] = f"{clWrapper} {cl} -nologo" self._environment["CXX"] = self._environment["CC"] self._environment["CPP"] = f"{cl} -nologo -EP" self._environment["CXXCPP"] = self._environment["CPP"] self._environment["NM"] = "dumpbin -symbols" self._environment[ "RC"] = f"windres -O COFF --target={'pe-i386' if CraftCore.compiler.isX86() else 'pe-x86-64'} --preprocessor='cl -nologo -EP -DRC_INVOKED -DWINAPI_FAMILY=0'" self._environment["STRIP"] = ":" self._environment["RANLIB"] = ":" self._environment["F77"] = "no" self._environment["FC"] = "no" cflags += ( " -GR -W3 -EHsc" # dynamic and exceptions enabled " -D_USE_MATH_DEFINES -DWIN32_LEAN_AND_MEAN -DNOMINMAX -D_CRT_SECURE_NO_WARNINGS" " -wd4005" # don't warn on redefine " -wd4996" # The POSIX name for this item is deprecated. ) if CraftCore.compiler.getMsvcPlatformToolset() > 120: cflags += " -FS" if CraftCore.compiler.isAndroid: toolchainPath = os.path.join( CraftCore.standardDirs.tmpDir(), f"android-{CraftCore.compiler.architecture}-toolchain") utils.system([ "python3", os.path.join(os.environ.get("ANDROID_NDK_ROOT"), "build/tools/make_standalone_toolchain.py"), "--install-dir", toolchainPath, "--arch", CraftCore.compiler.architecture, "--api", CraftCore.compiler.androidApiLevel() ]) self._environment["PATH"] = os.path.join( toolchainPath, "bin") + ":" + os.environ["PATH"] self._environment["AR"] = "ar" self._environment["AS"] = "clang" self._environment["CC"] = "clang" self._environment["CXX"] = "clang++" self._environment["LD"] = "ld" self._environment["STRIP"] = "strip" self._environment["RANLIB"] = "ranlib" self._environment["CFLAGS"] = os.environ.get("CFLAGS", "").replace( "$", "$$") + cflags self._environment["CXXFLAGS"] = os.environ.get( "CXXFLAGS", "").replace("$", "$$") + cflags self._environment["LDFLAGS"] = os.environ.get( "LDFLAGS", "").replace("$", "$$") + ldflags return self._environment
def environment(self): if not self._environment: mergeroot = self.toNativePath(CraftStandardDirs.craftRoot()) ldflags = f" -L{mergeroot}/lib " cflags = f" -I{mergeroot}/include " if CraftCore.compiler.isMacOS: # Only look for includes/libraries in the XCode SDK on MacOS to avoid errors with # libraries installed by homebrew (causes errors e.g. with iconv since headers will be # found in /usr/local/include first but libraries are searched for in /usr/lib before # /usr/local/lib. See https://langui.sh/2015/07/24/osx-clang-include-lib-search-paths/ if CraftCore.compiler.macUseSDK: sdkPath = CraftCore.cache.getCommandOutput( "xcrun", "--show-sdk-path")[1].strip() deploymentFlag = "-mmacosx-version-min=" + CraftCore.compiler.macOSDeploymentTarget cflags = f" -isysroot {sdkPath} {deploymentFlag}" + cflags # See https://github.com/Homebrew/homebrew-core/issues/2674 for the -no_weak_imports flag ldflags = f" -isysroot {sdkPath} {deploymentFlag} -Wl,-no_weak_imports" + ldflags # Note: MACOSX_DEPLOYMENT_TARGET is set in utils.system() so doesn't need to be set here else: # Ensure that /usr/include comes before /usr/local/include in the header search path to avoid # pulling in headers from /usr/local/include (e.g. installed by homebrew) that will cause # linker errors later. cflags = " -isystem /usr/include " + cflags if CraftCore.compiler.isMSVC(): # based on Windows-MSVC.cmake if self.buildType == "Release": cflags += " -MD -O2 -Ob2 -DNDEBUG " elif self.buildType == "RelWithDebInfo": cflags += " -MD -Zi -O2 -Ob1 -DNDEBUG " ldflags += " -debug " elif self.buildType == "Debug": cflags += " -MDd -Zi -Ob0 -Od " ldflags += " -debug -pdbtype:sept " else: if self.buildType == "Release": cflags += " -O3 -DNDEBUG " if self.buildType == "RelWithDebInfo": cflags += " -O2 -g -DNDEBUG " elif self.buildType == "Debug": cflags += " -O0 -g3 " if OsDetection.isWin(): path = "/usr/local/bin:/usr/bin:/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl" if CraftCore.compiler.isMinGW(): gcc = shutil.which("gcc") if gcc: path = f"{self.toNativePath(os.path.dirname(gcc))}:{path}" for p in os.environ["PATH"].split(";"): path += f":{self.toNativePath(p)}" self._environment["PATH"] = path if "make" in self._environment: del self._environment["make"] # MSYSTEM is used by uname if CraftCore.compiler.isMinGW(): self._environment[ "MSYSTEM"] = f"MINGW{CraftCore.compiler.bits}_CRAFT" elif CraftCore.compiler.isMSVC(): self._environment[ "MSYSTEM"] = f"MSYS{CraftCore.compiler.bits}_CRAFT" if self.useMSVCCompatEnv and CraftCore.compiler.isMSVC(): automake = [] for d in os.scandir( os.path.join(os.path.dirname(self._findBash()), "..", "share")): if d.name.startswith("automake"): automake += [(d.name.rsplit("-")[1], os.path.realpath(d.path))] automake.sort(key=lambda x: CraftVersion(x[0])) latestAutomake = automake[-1][1] if False: cl = "clang-cl" else: cl = "cl" clWrapper = self.toNativePath( os.path.join(latestAutomake, "compile")) self._environment["LD"] = "link -nologo" self._environment["CC"] = f"{clWrapper} {cl} -nologo" self._environment["CXX"] = self._environment["CC"] self._environment["CPP"] = f"{cl} -nologo -EP" self._environment["CXXCPP"] = self._environment["CPP"] self._environment["NM"] = "dumpbin -symbols" self._environment[ "RC"] = f"windres -O COFF --target={'pe-i386' if CraftCore.compiler.isX86() else 'pe-x86-64'} --preprocessor='cl -nologo -EP -DRC_INVOKED -DWINAPI_FAMILY=0'" self._environment["STRIP"] = ":" self._environment["RANLIB"] = ":" self._environment["F77"] = "no" self._environment["FC"] = "no" cflags += ( " -GR -W3 -EHsc" # dynamic and exceptions enabled " -D_USE_MATH_DEFINES -DWIN32_LEAN_AND_MEAN -DNOMINMAX -D_CRT_SECURE_NO_WARNINGS" " -wd4005" # don't warn on redefine " -wd4996" # The POSIX name for this item is deprecated. ) if CraftCore.compiler.getMsvcPlatformToolset() > 120: cflags += " -FS" self._environment["PKG_CONFIG_PATH"] = self.toNativePath( os.path.join(CraftStandardDirs.craftRoot(), "lib", "pkgconfig")) self._environment["CFLAGS"] = os.environ.get("CFLAGS", "").replace( "$", "$$") + cflags self._environment["CXXFLAGS"] = os.environ.get( "CXXFLAGS", "").replace("$", "$$") + cflags self._environment["LDFLAGS"] = os.environ.get( "LDFLAGS", "").replace("$", "$$") + ldflags return self._environment
def opensslUseLegacyBuildSystem(self): return CraftVersion(self.buildTarget) < CraftVersion("1.1")
def setDefaults(self, defines : dict) -> dict: defines = super().setDefaults(defines) defines.setdefault("additional_xmlns", "") version = [int(x) for x in CraftVersion(defines.get("version", self.version)).normalizedVersion.versionstr.split(".")] # we require a version of the format 1.2.3.4 version += [0] * (4-len(version)) version[1] = version[1] * 100 + version[2] if self.buildNumber(): version[2] = self.buildNumber() else: version[2] = 0 # part 4 must be 0 for the store # we ignore the patch level, build number ensures increasing version numbers version[3] = 0 defines["version"] = ".".join([str(x) for x in version]) defines.setdefault("name", f"{defines['company']}{defines['display_name']}".replace(" ", "")) utils.createDir(self.artifactsDir()) defines["setupname"] = self.artifactsDir() / os.path.basename(f"{defines['setupname']}.appx") defines.setdefault("craft_id", self.package.path.replace("/", ".")) self._setupFileTypes(defines) if "dev-utils/snoretoast" in CraftDependencyPackage(self.package).getDependencies(DependencyType.Runtime): # versions < 0.9 did not print the clsi, use the one from 0.8 clsid = "eb1fdd5b-8f70-4b5a-b230-998a2dc19303" result = subprocess.run(["snoretoast.exe", "-v"], capture_output=True, encoding="UTF-8") if result.returncode == 0: clsidPattern = re.compile(r"\{(.*?)\}") clsids = clsidPattern.findall(result.stderr) if clsids: clsid = clsids[0] defines["SNORETOAST_CALLBACK_GUID"] = clsid defines["extensions"] += AppxPackager.SnoreToast if "startup_task" in defines: defines["extensions"] += AppxPackager.StartUp if "alias" in defines: if not defines["alias"].endswith(CraftCore.compiler.executableSuffix): defines["alias"] += CraftCore.compiler.executableSuffix defines["extensions"] += AppxPackager.Aliases defines["additional_xmlns"] += """xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"\n""" defines.setdefault("alias_executable", self.defines["executable"] if "executable" in self.defines else self.defines["shortcuts"][0]["target"]) extensions = defines["extensions"] if extensions: defines["extensions"] = f"<Extensions>{extensions}</Extensions>" defines.setdefault("additional_capabilities", "") defines.setdefault("capabilities", AppxPackager.Capabilities) capabilities = defines["capabilities"] if capabilities: defines["capabilities"] = f"<Capabilities>{capabilities}</Capabilities>" defines.setdefault("desktop_extensions", "") desktop_extensions = defines["desktop_extensions"] if desktop_extensions: defines["desktop_extensions"] = f"<Extensions>{desktop_extensions}</Extensions>" defines.setdefault("xml_namespaces", AppxPackager.XMLNamespaces) xml_namespaces = defines["xml_namespaces"] if xml_namespaces: defines["xml_namespaces"] = f"{xml_namespaces}" # compat with nsis if "shortcuts" in self.defines: defines.setdefault("executable", self.defines["shortcuts"][0]["target"]) return defines
def qtVer(self): if not self._qtVer: self._qtVer = CraftVersion( self.__qtBase.subinfo.buildTarget if self.__qtBase.subinfo.buildTarget != "dev" else "5.9999") return self._qtVer
def qtVer(self): if not self._qtVer: self._qtVer = CraftVersion( CraftPackageObject.get("libs/qt5/qtbase").subinfo.buildTarget) return self._qtVer
def qtVer(self): if not self._qtVer: self._qtVer = CraftVersion(CraftPackageObject.get("libs/qt5/qtbase").version) return self._qtVer
def setDefaults(self, defines: dict) -> dict: defines = super().setDefaults(defines) defines.setdefault("additional_xmlns", "") version = [ int(x) for x in CraftVersion(defines.get("version", self.version)). normalizedVersion.versionstr.split(".") ] # we require a version of the format 1.2.3.4 # part 4 must be 0 for the store version += [0] * (4 - len(version)) version[1] = version[1] * 100 + version[2] if self.buildNumber(): version[2] = self.buildNumber() else: version[2] = 0 defines["version"] = ".".join([str(x) for x in version]) defines.setdefault( "name", f"{defines['company']}{defines['display_name']}".replace(" ", "")) utils.createDir(self.artifactsDir()) defines["setupname"] = self.artifactsDir() / os.path.basename( f"{defines['setupname']}.appx") defines.setdefault("craft_id", self.package.path.replace("/", ".")) self._setupFileTypes(defines) if (Path(self.archiveDir()) / "bin/snoretoast.exe").exists(): defines["extensions"] += AppxPackager.SnoreToast if "startup_task" in defines: defines["extensions"] += AppxPackager.StartUp if "alias" in defines: if not defines["alias"].endswith( CraftCore.compiler.executableSuffix): defines["alias"] += CraftCore.compiler.executableSuffix defines["extensions"] += AppxPackager.Aliases defines[ "additional_xmlns"] += """xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"\n""" extensions = defines["extensions"] if extensions: defines["extensions"] = f"<Extensions>{extensions}</Extensions>" defines.setdefault("additional_capabilities", "") defines.setdefault("capabilities", AppxPackager.Capabilities) capabilities = defines["capabilities"] if capabilities: defines[ "capabilities"] = f"<Capabilities>{capabilities}</Capabilities>" defines.setdefault("xml_namespaces", AppxPackager.XMLNamespaces) xml_namespaces = defines["xml_namespaces"] if xml_namespaces: defines["xml_namespaces"] = f"{xml_namespaces}" # compat with nsis if "shortcuts" in self.defines: defines.setdefault("executable", self.defines["shortcuts"][0]["target"]) return defines