Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
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)
Esempio n. 4
0
    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
Esempio n. 5
0
 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()
Esempio n. 6
0
    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
Esempio n. 7
0
    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"
Esempio n. 8
0
    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")
Esempio n. 10
0
    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))
Esempio n. 11
0
 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
Esempio n. 12
0
    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
Esempio n. 13
0
    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
Esempio n. 14
0
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)
Esempio n. 15
0
    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)
Esempio n. 16
0
    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)
Esempio n. 17
0
    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))
Esempio n. 18
0
    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
Esempio n. 19
0
    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
Esempio n. 20
0
    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
Esempio n. 21
0
    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
Esempio n. 22
0
 def opensslUseLegacyBuildSystem(self):
     return CraftVersion(self.buildTarget) < CraftVersion("1.1")
Esempio n. 23
0
    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
Esempio n. 24
0
 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
Esempio n. 25
0
 def qtVer(self):
     if not self._qtVer:
         self._qtVer = CraftVersion(
             CraftPackageObject.get("libs/qt5/qtbase").subinfo.buildTarget)
     return self._qtVer
Esempio n. 26
0
 def qtVer(self):
     if not self._qtVer:
         self._qtVer = CraftVersion(CraftPackageObject.get("libs/qt5/qtbase").version)
     return self._qtVer
Esempio n. 27
0
    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