def __GenerateCMakeFile(self, config: Config, package: Package,
                            platformName: str,
                            template: CMakeGeneratorUtil.CodeTemplateCMake,
                            toolProjectContextsDict: Dict[
                                ProjectId, ToolConfigProjectContext],
                            useExtendedProjectHack: bool) -> None:
        if package.Type == PackageType.TopLevel:
            raise Exception("Usage error")
        #if package.IsVirtual:
        #    return
        if package.AbsolutePath is None or package.ResolvedBuildPath is None:
            raise Exception("Invalid package")

        packageName = CMakeGeneratorUtil.GetPackageName(package)

        aliasPackageName = CMakeGeneratorUtil.GetAliasName(
            packageName, package.ProjectContext.ProjectName)

        targetIncludeDirectories = CMakeGeneratorUtil.BuildTargetIncludeDirectories(
            config, package, template.PackageTargetIncludeDirectories,
            template.PackageTargetIncludeDirEntry,
            template.PackageTargetIncludeDirVirtualEntry,
            CMakeGeneratorUtil.CMakePathType.LocalRelative)

        publicIncludeFiles = self.__Join(
            package.ResolvedBuildPublicIncludeFiles)
        privateIncludeFiles = self.__Join(
            package.ResolvedBuildPrivateIncludeFiles)
        includeFiles = self.__Join(package.ResolvedBuildAllIncludeFiles)
        sourceFiles = self.__Join(package.ResolvedBuildSourceFiles)

        linkLibrariesDirectDependencies = CMakeGeneratorUtil.BuildTargetLinkLibrariesForDirectDependencies(
            config, package, template.PackageDependencyTargetLinkLibraries,
            template.PackageDependencyFindPackage)
        directDefinitions = CMakeGeneratorUtil.BuildDirectDefinitions(
            config, package,
            template.PackageDependencyTargetCompileDefinitions)
        findDirectExternalDependencies = CMakeGeneratorUtil.BuildFindDirectExternalDependencies(
            config, package, template.PackageDependencyFindPackage)
        installInstructions = CMakeGeneratorUtil.BuildInstallInstructions(
            config, package, template.PackageInstall,
            template.PackageInstallTargets, template.PackageInstallHeaders,
            template.PackageInstallContent, template.PackageInstallDLL,
            template.PackageInstallAppInfo)
        targetCompileFeatures = CMakeGeneratorUtil.BuildCompileFeatures(
            config, package, template.SnippetTargetCompileFeaturesDefault,
            template.SnippetTargetCompileFeaturesInterface)
        targetCompileOptions = CMakeGeneratorUtil.BuildCompileOptions(
            config, package, template.SnippetTargetCompileOptionsDefault)
        targetFileCopy = CMakeGeneratorUtil.BuildFileCopy(
            config, package, template.PackageTargetCopyFile,
            template.PackageTargetCopyFilePath)

        cacheVariants = CMakeGeneratorUtil.GetCacheVariants(
            package, template.SnippetCacheVariant)

        contentInBinaryDirectory = True

        packageContentBuilder = CMakeGeneratorUtil.GetContentBuilder(
            config, package, platformName, template.PackageContentBuilder,
            contentInBinaryDirectory)
        #packageContentBuilderOutputFiles = CMakeGeneratorUtil.GetContentBuilderOutputFiles(config, package, contentInBinaryDirectory)

        packageContentSection = CMakeGeneratorUtil.GetContentSection(
            config, package, platformName, template.PackageContent,
            template.PackageContentFile, contentInBinaryDirectory)
        #packageContentSectionOutputFiles = CMakeGeneratorUtil.GetContentSectionOutputFiles(config, package, contentInBinaryDirectory)

        packageContentDep = CMakeGeneratorUtil.GetContentDepSection(
            config, package, platformName, template.PackageContentDep,
            contentInBinaryDirectory)
        packageContentDepOutputFiles = CMakeGeneratorUtil.GetContentDepOutputFile(
            config, package, contentInBinaryDirectory)

        packageCompilerSpecificFileDependencies = CMakeGeneratorUtil.CompilerSpecificFileDependencies(
            config, package, template.PackageCompilerConditional,
            template.PackageTargetSourceFiles,
            template.PackageCompilerFileDict)

        packageVariantSettings = CMakeGeneratorUtil.GetVariantSettings(
            config, package, template.PackageVariantSettings,
            template.PackageDependencyTargetCompileDefinitions,
            template.PackageDependencyTargetLinkLibraries)

        buildCMakeFile = template.Master
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_INCLUDE_FILES##",
                                                includeFiles)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_PUBLIC_INCLUDE_FILES##", publicIncludeFiles)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_PRIVATE_INCLUDE_FILES##", privateIncludeFiles)
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_SOURCE_FILES##",
                                                sourceFiles)
        buildCMakeFile = buildCMakeFile.replace(
            "##TARGET_INCLUDE_DIRECTORIES##", targetIncludeDirectories)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_DIRECT_DEPENDENCIES_TARGET_LINK_LIBRARIES##",
            linkLibrariesDirectDependencies)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_DIRECT_DEPENDENCIES_TARGET_COMPILE_DEFINITIONS##",
            directDefinitions)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGES_FIND_DIRECT_EXTERNAL_DEPENDENCIES##",
            findDirectExternalDependencies)
        buildCMakeFile = buildCMakeFile.replace(
            "##SNIPPET_DEFAULT_TARGET_COMPILE_OPTIONS##", targetCompileOptions)
        buildCMakeFile = buildCMakeFile.replace(
            "##SNIPPET_DEFAULT_TARGET_COMPILE_FEATURES##",
            targetCompileFeatures)
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_COPY_FILES##",
                                                targetFileCopy)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_GENERATE_INSTALL_INSTRUCTIONS##", installInstructions)
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_CONTENTBUILDER##",
                                                packageContentBuilder)
        #buildCMakeFile = buildCMakeFile.replace("##PACKAGE_CONTENTBUILDER_OUTPUT_FILES##", packageContentBuilderOutputFiles)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_CONTENTSECTION_OUTPUT##", packageContentSection)
        #buildCMakeFile = buildCMakeFile.replace("##PACKAGE_CONTENTSECTION_OUTPUT_FILES##", packageContentSectionOutputFiles)
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_CONTENTDEP##",
                                                packageContentDep)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_CONTENTDEP_OUTPUT_FILES##",
            packageContentDepOutputFiles)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_COMPILER_SPECIFIC_FILE_DEPENDENCIES##",
            packageCompilerSpecificFileDependencies)
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_VARIANT_SETTINGS##",
                                                packageVariantSettings)

        toolProjectContext = toolProjectContextsDict[
            package.ProjectContext.ProjectId]
        sectionDefinePathEnvAsVariables = CMakeGeneratorUtil.CreateDefineRootDirectoryEnvironmentAsVariables(
            config.ToolConfig, toolProjectContext, useExtendedProjectHack,
            template.PathEnvToVariable)
        buildCMakeFile = self.__CommonReplace(
            buildCMakeFile, package.ProjectContext, packageName,
            aliasPackageName, cacheVariants, sectionDefinePathEnvAsVariables,
            config.ToolConfig.CMakeConfiguration.MinimumVersion, template)

        self.__SaveFile(GeneratorCMake._GetPackageBuildFileName(package),
                        buildCMakeFile)
        GitIgnoreHelper.SafeAddEntry(self.GitIgnoreDict, package,
                                     "CMakeLists.txt")
    def __GenerateCMakeFile(self, config: Config, package: Package,
                            platformName: str,
                            template: CMakeGeneratorUtil.CodeTemplateCMake,
                            androidProjectDir: str,
                            androidProjectCMakeDir: str) -> None:

        pathType = CMakeGeneratorUtil.CMakePathType.Relative

        packageName = CMakeGeneratorUtil.GetPackageName(package)

        # this ignore is a workaround allowing us to build using the same info as the old Android builder
        ignoreLibs = ["android_native_app_glue"]

        aliasPackageName = CMakeGeneratorUtil.GetAliasName(packageName)
        targetIncludeDirectories = CMakeGeneratorUtil.BuildTargetIncludeDirectories(
            config, package, template.PackageTargetIncludeDirectories,
            template.PackageTargetIncludeDirEntry, pathType)
        targetIncludeDirectories = targetIncludeDirectories.replace(
            Variable.RecipeVariant, "${ANDROID_ABI}")

        includeFiles = self.__ExpandPathAndJoin(
            config, package, package.ResolvedBuildAllIncludeFiles)
        sourceFiles = self.__ExpandPathAndJoin(
            config, package, package.ResolvedBuildSourceFiles)
        linkLibrariesDirectDependencies = CMakeGeneratorUtil.BuildTargetLinkLibrariesForDirectDependencies(
            config, package, template.PackageDependencyTargetLinkLibraries,
            ignoreLibs)
        directDefinitions = CMakeGeneratorUtil.BuildDirectDefinitions(
            config, package,
            template.PackageDependencyTargetCompileDefinitions)
        findDirectExternalDependencies = CMakeGeneratorUtil.BuildFindDirectExternalDependencies(
            config, package, template.PackageDependencyFindPackage)

        buildCMakeFile = template.Master

        if package.Type == PackageType.Executable:
            if package.AbsoluteContentPath is None:
                raise Exception("Invalid package")
            packageContentPath = CMakeGeneratorUtil.GetSDKBasedPathUsingCMakeVariable(
                config, package.AbsoluteContentPath)
            buildCMakeFile = buildCMakeFile.replace("##PACKAGE_CONTENT_PATH##",
                                                    packageContentPath)
            buildCMakeFile = buildCMakeFile.replace(
                "##PACKAGE_ANDROID_PROJECT_PATH##", androidProjectDir)
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_INCLUDE_FILES##",
                                                includeFiles)
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_SOURCE_FILES##",
                                                sourceFiles)
        buildCMakeFile = buildCMakeFile.replace(
            "##TARGET_INCLUDE_DIRECTORIES##", targetIncludeDirectories)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_DIRECT_DEPENDENCIES_TARGET_LINK_LIBRARIES##",
            linkLibrariesDirectDependencies)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_DIRECT_DEPENDENCIES_TARGET_COMPILE_DEFINITIONS##",
            directDefinitions)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGES_FIND_DIRECT_EXTERNAL_DEPENDENCIES##",
            findDirectExternalDependencies)
        buildCMakeFile = buildCMakeFile.replace(
            "##SNIPPET_DEFAULT_TARGET_COMPILE_OPTIONS##",
            template.SnippetDefaultTargetCompileOptions)
        buildCMakeFile = buildCMakeFile.replace(
            "##SNIPPET_DEFAULT_TARGET_COMPILE_FEATURES##",
            template.SnippetDefaultTargetCompileFeatures)
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_NAME!##",
                                                packageName.upper())
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_NAME##",
                                                packageName)
        buildCMakeFile = buildCMakeFile.replace("##ALIAS_PACKAGE_NAME##",
                                                aliasPackageName)

        if not config.DisableWrite:
            # We store all cmake build files in their own dir inside the 'android' exe-project's folder
            # to prevent collision with other more generic CMake builders
            packageCMakeDir = self.__GetPackageCMakeDir(
                androidProjectCMakeDir, package)
            IOUtil.SafeMakeDirs(packageCMakeDir)
            dstFileCMakeFile = self.__GetPackageCMakeFileName(
                androidProjectCMakeDir, package)
            IOUtil.WriteFileIfChanged(dstFileCMakeFile, buildCMakeFile)
    def __GetDstFilenameModifier(
            self, config: Config, dstPath: str, package: Package,
            appPackageTemplateInfo: AndroidGeneratorUtil.
        AppPackageTemplateInfo, template: CMakeGeneratorUtil.CodeTemplateCMake,
            androidProjectCMakeDir: str, androidABIList: List[str],
            templateFileProcessor: TemplateFileProcessor,
            cmakePackageRootVariables: str) -> Callable[[str], str]:
        androidHome = AndroidUtil.GetSDKPath()
        androidNDK = AndroidUtil.GetNDKPath()
        androidNDKForProp = self.__ToPropPath(androidNDK)
        androidHomeForProp = self.__ToPropPath(androidHome)

        androidABIList = self.__patchABIList(config, package, androidABIList)
        self.__CheckABI(package, androidABIList)

        packageVariantGradleAndroidABIList = self.__CreateGradleAndroidABIList(
            androidABIList)

        packageName = CMakeGeneratorUtil.GetPackageName(package)
        cmakePackageExeLib = CMakeGeneratorUtil.GetAliasName(packageName)
        cmakePackageFindDirectExternalDependencies = CMakeGeneratorUtil.BuildFindDirectExternalDependencies(
            config, package, template.PackageDependencyFindPackage)
        cmakePackageDirectDependenciesAndSubDirectories = self.__BuildCMakeAddSubDirectoriesForDirectDependencies(
            config, package, template, androidProjectCMakeDir)

        addCMakeLibsList = self.__AddCMakeLibs(package)

        thirdPartyLibsList = []  # type: List[str]
        for entry in addCMakeLibsList:
            for staticLib in entry.StaticLibs:
                thirdPartyLibsList.append(staticLib.Name)

        thirdPartyAddLibs = ""
        for entry in addCMakeLibsList:
            for staticLib in entry.StaticLibs:
                content = template.AddImportedLibrary
                content = content.replace("##LIBRARY_NAME##", staticLib.Name)
                content = content.replace("##LIBRARY_TYPE##", "STATIC")
                content = content.replace("##LIBRARY_PATH##", staticLib.Path)
                thirdPartyAddLibs += "\n" + content

        # thirdPartyLibs is a space seperated list of third party lib names
        thirdPartyLibs = " ".join(thirdPartyLibsList)

        templateFileProcessor.Environment.Set("##CMAKE_THIRD_PARTY_LIBS##",
                                              thirdPartyLibs)
        templateFileProcessor.Environment.Set("##CMAKE_THIRD_PARTY_ADD_LIBS##",
                                              thirdPartyAddLibs)
        templateFileProcessor.Environment.Set(
            "##CMAKE_PACKAGE_DIRECT_DEPENDENCIES_ADD_SUBDIRECTORIES##",
            cmakePackageDirectDependenciesAndSubDirectories)
        templateFileProcessor.Environment.Set(
            "##CMAKE_PACKAGE_FIND_DIRECT_EXTERNAL_DEPENDENCIES##",
            cmakePackageFindDirectExternalDependencies)
        templateFileProcessor.Environment.Set("##CMAKE_PACKAGE_EXE_LIB##",
                                              cmakePackageExeLib)
        templateFileProcessor.Environment.Set(
            "##CMAKE_DEFINE_PACKAGE_ROOT_VARIABLES##",
            cmakePackageRootVariables)

        templateFileProcessor.Environment.Set("##ENV_ANDROID_HOME_FOR_PROP##",
                                              androidHomeForProp)
        templateFileProcessor.Environment.Set("##ENV_ANDROID_NDK_FOR_PROP##",
                                              androidNDKForProp)
        templateFileProcessor.Environment.Set(
            "##FSL_PACKAGE_GLES_VERSION##",
            appPackageTemplateInfo.MinGLESVersion)
        templateFileProcessor.Environment.Set(
            "##FSL_PACKAGE_MIN_ANDROID_SDK_VERSION##",
            appPackageTemplateInfo.MinSDKVersion.VersionString)
        templateFileProcessor.Environment.Set(
            "##FSL_PACKAGE_TARGET_ANDROID_SDK_VERSION##",
            appPackageTemplateInfo.TargetSDKVersion.VersionString)
        templateFileProcessor.Environment.Set(
            "##PACKAGE_APP_PLATFORM##",
            appPackageTemplateInfo.MinSDKVersion.AppPlatform)
        templateFileProcessor.Environment.Set(
            "##PACKAGE_VARIANT_ANDROID_ABIS##",
            packageVariantGradleAndroidABIList)
        templateFileProcessor.Environment.Set(
            "##PREFIXED_PROJECT_NAME##",
            appPackageTemplateInfo.PrefixedProjectName)
        templateFileProcessor.Environment.Set(
            "##PREFIXED_PROJECT_NAME_L##",
            appPackageTemplateInfo.PrefixedProjectName.lower())

        return appPackageTemplateInfo.UpdateFileName
Ejemplo n.º 4
0
    def __GenerateCMakeFile(
            self, config: Config, package: Package, platformName: str,
            template: CMakeGeneratorUtil.CodeTemplateCMake) -> None:
        if package.IsVirtual:
            return
        if package.AbsolutePath is None or package.ResolvedBuildPath is None:
            raise Exception("Invalid package")

        packageName = CMakeGeneratorUtil.GetPackageName(package)

        addSubDirectoriesDirectDependencies = ""
        #findExternalDependencies = ""
        if package.Type == PackageType.TopLevel:
            package.AbsolutePath = config.SDKPath
            packageName = "DemoFrameworkTopLevel"
            addSubDirectoriesDirectDependencies = self.__BuildAddSubDirectoriesForDirectDependencies(
                config, package, template)
            #findExternalDependencies = self.__BuildFindExternalDependencies(config, package, template)

        aliasPackageName = CMakeGeneratorUtil.GetAliasName(packageName)

        targetIncludeDirectories = CMakeGeneratorUtil.BuildTargetIncludeDirectories(
            config, package, template.PackageTargetIncludeDirectories,
            template.PackageTargetIncludeDirEntry)

        includeFiles = self.__Join(package.ResolvedBuildAllIncludeFiles)
        sourceFiles = self.__Join(package.ResolvedBuildSourceFiles)

        linkLibrariesDirectDependencies = CMakeGeneratorUtil.BuildTargetLinkLibrariesForDirectDependencies(
            config, package, template.PackageDependencyTargetLinkLibraries)
        directDefinitions = CMakeGeneratorUtil.BuildDirectDefinitions(
            config, package,
            template.PackageDependencyTargetCompileDefinitions)
        findDirectExternalDependencies = CMakeGeneratorUtil.BuildFindDirectExternalDependencies(
            config, package, template.PackageDependencyFindPackage)

        buildCMakeFile = template.Master
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_INCLUDE_FILES##",
                                                includeFiles)
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_SOURCE_FILES##",
                                                sourceFiles)
        buildCMakeFile = buildCMakeFile.replace(
            "##TARGET_INCLUDE_DIRECTORIES##", targetIncludeDirectories)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_DIRECT_DEPENDENCIES_ADD_SUBDIRECTORIES##",
            addSubDirectoriesDirectDependencies)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_DIRECT_DEPENDENCIES_TARGET_LINK_LIBRARIES##",
            linkLibrariesDirectDependencies)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGE_DIRECT_DEPENDENCIES_TARGET_COMPILE_DEFINITIONS##",
            directDefinitions)
        buildCMakeFile = buildCMakeFile.replace(
            "##PACKAGES_FIND_DIRECT_EXTERNAL_DEPENDENCIES##",
            findDirectExternalDependencies)
        buildCMakeFile = buildCMakeFile.replace(
            "##SNIPPET_DEFAULT_TARGET_COMPILE_OPTIONS##",
            template.SnippetDefaultTargetCompileOptions)
        buildCMakeFile = buildCMakeFile.replace(
            "##SNIPPET_DEFAULT_TARGET_COMPILE_FEATURES##",
            template.SnippetDefaultTargetCompileFeatures)
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_NAME!##",
                                                packageName.upper())
        buildCMakeFile = buildCMakeFile.replace("##PACKAGE_NAME##",
                                                packageName)
        buildCMakeFile = buildCMakeFile.replace("##ALIAS_PACKAGE_NAME##",
                                                aliasPackageName)

        buildBasePath = IOUtil.Join(package.AbsolutePath,
                                    package.ResolvedBuildPath)
        if not config.DisableWrite:
            IOUtil.SafeMakeDirs(buildBasePath)
            dstFileCMakeFile = IOUtil.Join(package.AbsolutePath,
                                           "CMakeLists.txt")
            IOUtil.WriteFileIfChanged(dstFileCMakeFile, buildCMakeFile)