def GenerateProject(config: Config, localConfig: LocalConfig, configVariant: ConfigVariant, visualStudioGUID: str, genFileOnly: bool) -> None:
    #
    packageName = configVariant.PackageName
    packageShortName = configVariant.PackageShortName
    packageTargetName = configVariant.PackageTargetName
    packageCompany = config.ToolConfig.DefaultCompany

    templateFileRecordManager = TemplateFileRecordManager(localConfig.TemplatePathProjectType)
    templateFileProcessor = TemplateFileProcessor(config, "PlatformNotDefined", genFileOnly)
    templateFileProcessor.Environment.SetPackageValues(configVariant.ProjectPath, packageName, packageShortName, configVariant.ProjectPath,
                                                       packageTargetName, None, visualStudioGUID, config.CurrentYearString, packageCompany)
    #templateFileProcessor.Environment.Set("##FEATURE_LIST##", featureList)
    templateFileProcessor.Process(config, templateFileRecordManager, configVariant.ProjectPath, None)
    def __GenerateExecutable(
            self, config: Config, package: Package, platformName: str,
            template: CMakeGeneratorUtil.CodeTemplateCMake,
            templateFileRecordManager: TemplateFileRecordManager,
            templateFileProcessor: TemplateFileProcessor,
            appPackageTemplateInfo: AndroidGeneratorUtil.
        AppPackageTemplateInfo, androidProjectDir: str,
            androidProjectCMakeDir: str, exeFileList: List[str],
            androidABIList: List[str], cmakePackageRootVariables: str) -> None:
        # copy files that need to be modified
        dstFilenameModifier = self.__GetDstFilenameModifier(
            config, androidProjectDir, package, appPackageTemplateInfo,
            template, androidProjectCMakeDir, androidABIList,
            templateFileProcessor, cmakePackageRootVariables)

        templateFileProcessor.Process(config, templateFileRecordManager,
                                      androidProjectDir, package,
                                      dstFilenameModifier)

        if not config.DisableWrite:
            # mark files as executable
            for entry in exeFileList:
                IOUtil.SetFileExecutable(IOUtil.Join(androidProjectDir, entry))

        self.__GenerateCMakeFile(config, package, platformName, template,
                                 androidProjectDir, androidProjectCMakeDir)
    def __init__(self, config: Config, packages: List[Package], platformName: str, androidABIList: List[str]) -> None:
        super().__init__()

        if config.SDKPathAndroidProjectDir is None:
            raise EnvironmentError("Android environment variable {0} not defined".format(ToolEnvironmentVariableName.FSL_GRAPHICS_SDK_ANDROID_PROJECT_DIR))

        strAppTemplatePath = "AndroidGradleCMake"
        templateFilePath = IOUtil.Join(config.SDKConfigTemplatePath, strAppTemplatePath)
        templateFileRecordManager = TemplateFileRecordManager(templateFilePath)
        templateFileProcessor = TemplateFileProcessor(config, platformName)

        strTemplatePath = IOUtil.Join(strAppTemplatePath, "CMake")
        extTemplate = CMakeGeneratorUtil.CodeTemplateCMake(config, strTemplatePath, "Ext", False, None)
        libTemplate = CMakeGeneratorUtil.CodeTemplateCMake(config, strTemplatePath, "Lib", False, None)
        exeTemplate = CMakeGeneratorUtil.CodeTemplateCMake(config, strTemplatePath, "Exe", False, None)

        templatePath = IOUtil.Join(config.SDKConfigTemplatePath, strAppTemplatePath)
        exeFileList = self.__ParseExeFileList(IOUtil.Join(templatePath, "ExeFiles.txt"))

        localSnippets = AndroidGradleCMakeSnippets(templatePath)

        cmakePackageRootVariables = self.__GenerateCmakePackageRootVariables(config, localSnippets)

        totalExeCount = 0
        for mainPackage in packages:
            if mainPackage.Type == PackageType.Executable:
                totalExeCount = totalExeCount + 1
                appPackageTemplateInfo = AndroidGeneratorUtil.AppPackageTemplateInfo(mainPackage)
                androidProjectDir = IOUtil.Join(config.SDKPathAndroidProjectDir, appPackageTemplateInfo.ProjectPathName)
                androidProjectCMakeDir = IOUtil.Join(androidProjectDir, ".FslCMake")

                for package in mainPackage.ResolvedBuildOrder:
                    if not package.ResolvedPlatformNotSupported:
                        if package.Type == PackageType.ExternalLibrary or package.Type == PackageType.HeaderLibrary:
                            self.__GenerateCMakeFile(config, package, platformName, extTemplate, androidProjectDir, androidProjectCMakeDir)
                        elif package.Type == PackageType.Library:
                            self.__GenerateCMakeFile(config, package, platformName, libTemplate, androidProjectDir, androidProjectCMakeDir)
                        elif package.Type == PackageType.Executable:
                            self.__GenerateExecutable(config, package, platformName, exeTemplate, templateFileRecordManager, templateFileProcessor,
                                                      appPackageTemplateInfo, androidProjectDir, androidProjectCMakeDir,
                                                      exeFileList, androidABIList, cmakePackageRootVariables)

        # For now we only support doing 'exe' builds using full source for everything (like the old builder)
        if totalExeCount <= 0:
            config.DoPrint("No executables provided, nothing to build.")