예제 #1
0
 def __ImportTemplates(self, packageTemplateLoader: PackageTemplateLoader,
                       templates: List[XmlGenFileImportTemplate],
                       requirements: List[XmlGenFileRequirement],
                       dependencies: List[XmlGenFileDependency],
                       externalDependencies: List[XmlGenFileExternalDependency],
                       directDefines: List[XmlGenFileDefine]) -> None:
     for template in templates:
         imported = packageTemplateLoader.Import(self.GetSubPackageSupport(), template, template.Name)
         for reqEntry in imported.DirectRequirements:
             requirements.append(reqEntry)
         for directEntry in imported.DirectDependencies:
             dependencies.append(directEntry)
         for extDepEntry in imported.ExternalDependencies:
             externalDependencies.append(extDepEntry)
         for directDefEntry in imported.DirectDefines:
             directDefines.append(directDefEntry)
예제 #2
0
    def __init__(self, config: Config, files: List[str], generator: GeneratorPluginBase, forceImportPackageNames: Optional[List[str]] = None) -> None:
        super().__init__()
        self.BasicConfig = config

        genFilename = config.GenFileName  # type: str
        packageConfigDict = config.ToolConfig.PackageConfiguration  # type: Dict[str, ToolConfigPackageConfiguration]
        packageLocations = [] if not config.Type in packageConfigDict else packageConfigDict[config.Type].Locations  # type: List[ToolConfigPackageLocation]
        factoryFunction = _CreateXmlGenFile

        templateLocationCache = self.__CacheTemplateLocations(config)
        self.PackageTemplateLoader = PackageTemplateLoader(config, templateLocationCache)
        self.PackageFinder = PackageFinder(config, generator, config.Type, packageConfigDict, genFilename, config.IsTestMode)

        inputFiles = self.PackageFinder.LocateInputFiles(files)  # type: List[PackageFile]

        config.LogPrint("- Parsing")
        try:
            config.PushIndent()

            # Preload all known package files from the cache if the package configuration requested it.
            if config.Type in packageConfigDict and packageConfigDict[config.Type].Preload:
                inputFiles = self.PackageFinder.GetKnownPackageFiles(inputFiles)

            if (generator.PlatformName == PlatformNameString.ANDROID or generator.PlatformId == PlatformNameString.ALL.lower()):
                internalNinjaToolPackageName = "Recipe.BuildTool.ninja"
                config.LogPrintVerbose(4, "Adding package {0}".format(internalNinjaToolPackageName))
                self.__AddPackageToList(inputFiles, internalNinjaToolPackageName, _ThrowToolDependencyNotFoundException)

            #if generator.IsCMake:
            #    internalCMakeToolPackageName = "Recipe.BuildTool.CMake"
            #    config.LogPrintVerbose(4, "Adding package {0}".format(internalCMakeToolPackageName))
            #    self.__AddPackageToList(inputFiles, internalCMakeToolPackageName, _ThrowToolDependencyNotFoundException)

            if forceImportPackageNames is not None:
                for packageName in forceImportPackageNames:
                    self.__AddPackageToList(inputFiles, packageName, _ThrowToolDependencyNotFoundException)

            # Ensure we load the project base package dependencies specified in the project.gen file
            inputFiles = self.__AddBasePackages(inputFiles, config.ToolConfig.ProjectInfo.Contexts)

            # sort the input files to ensure a predictable 'initial' order
            inputFiles.sort(key=lambda s: s.AbsoluteDirPath.lower())

            packageDict = {} # type: Dict[str, List[XmlGenFile]]
            genFiles = []  # type: List[XmlGenFile]
            # Load the initial package files
            self.__LoadFiles(config, inputFiles, packageDict, genFiles, config.ToolConfig.DefaultPackageLanguage, factoryFunction)


            searchForPackages = True
            newGenFiles = genFiles
            while searchForPackages:
                missingPackages = self.__DiscoverMissingPackages(config, generator, packageDict, newGenFiles)
                if len(missingPackages) > 0:
                    newFiles = self.PackageFinder.LocateMissingPackages(missingPackages)
                    newGenFiles = []
                    self.__LoadFiles(config, newFiles, packageDict, newGenFiles, config.ToolConfig.DefaultPackageLanguage, factoryFunction)
                    genFiles += newGenFiles
                else:
                    searchForPackages = False

            self.FoundInputFiles = inputFiles
            self.SourceFiles = files
            self.GenFiles = genFiles
        finally:
            config.PopIndent()
예제 #3
0
    def __init__(self,
                 config: Config,
                 files: List[str],
                 platform: GeneratorPluginBase,
                 forceImportPackageNames: Optional[List[str]] = None) -> None:
        super(PackageLoader, self).__init__()
        self.BasicConfig = config

        genFilename = config.GenFileName  # type: str
        packageConfigDict = config.ToolConfig.PackageConfiguration  # type: Dict[str, ToolConfigPackageConfiguration]
        packageLocations = [] if not config.Type in packageConfigDict else packageConfigDict[
            config.Type].Locations  # type: List[ToolConfigPackageLocation]
        factoryFunction = _CreateXmlGenFile

        templateLocationCache = self.__CacheTemplateLocations(config)
        self.PackageTemplateLoader = PackageTemplateLoader(
            config, templateLocationCache)
        self.PackageFinder = PackageFinder(config, platform, config.Type,
                                           packageConfigDict, genFilename,
                                           config.IsTestMode)

        inputFiles = self.PackageFinder.LocateInputFiles(
            files)  # type: List[PackageFile]

        config.LogPrint("- Parsing")
        try:
            config.PushIndent()

            # Preload all known package files from the cache if the package configuration requested it.
            if config.Type in packageConfigDict and packageConfigDict[
                    config.Type].Preload:
                inputFiles = self.PackageFinder.GetKnownPackageFiles(
                    inputFiles)

            internalNinjaToolPackageName = "Recipe.BuildTool.ninja"
            if platform.Name == PlatformNameString.ANDROID and not self.__ContainsPackage(
                    inputFiles, internalNinjaToolPackageName):
                packageFile = self.PackageFinder.TryLocateMissingPackagesByName(
                    internalNinjaToolPackageName)
                if packageFile is None:
                    raise ToolDependencyNotFoundException(
                        internalNinjaToolPackageName)
                if packageFile not in inputFiles:
                    # prevent file duplicatin (FIX: this is a workaround due to 'initial' packages not being in the lookup cache)
                    if not self.__ContainsName(inputFiles,
                                               internalNinjaToolPackageName):
                        inputFiles.append(packageFile)
                #files.append(packageFile.AbsoluteFilePath)

            if forceImportPackageNames is not None:
                for packageName in forceImportPackageNames:
                    packageFile = self.PackageFinder.TryLocateMissingPackagesByName(
                        packageName)
                    if packageFile is None:
                        raise ToolDependencyNotFoundException(packageName)
                    if packageFile not in inputFiles:
                        # prevent file duplicatin (FIX: this is a workaround due to 'initial' packages not being in the lookup cache)
                        if not self.__ContainsName(inputFiles, packageName):
                            inputFiles.append(packageFile)
                            #files.append(packageFile.AbsoluteFilePath)

            # sort the input files to ensure a predictable 'initial' order
            inputFiles.sort(key=lambda s: s.AbsoluteDirPath.lower())

            packageDict = {}  # type: Dict[str, List[XmlGenFile]]
            genFiles = []  # type: List[XmlGenFile]
            # Load the initial package files
            self.__LoadFiles(config, inputFiles, packageDict, genFiles,
                             config.ToolConfig.DefaultPackageLanguage,
                             factoryFunction)

            searchForPackages = True
            newGenFiles = genFiles
            while searchForPackages:
                missingPackages = self.__DiscoverMissingPackages(
                    config, platform, packageDict, newGenFiles)
                if len(missingPackages) > 0:
                    newFiles = self.PackageFinder.LocateMissingPackages(
                        missingPackages)
                    newGenFiles = []
                    self.__LoadFiles(config, newFiles, packageDict,
                                     newGenFiles,
                                     config.ToolConfig.DefaultPackageLanguage,
                                     factoryFunction)
                    genFiles += newGenFiles
                else:
                    searchForPackages = False

            self.FoundInputFiles = inputFiles
            self.SourceFiles = files
            self.GenFiles = genFiles
        finally:
            config.PopIndent()