def __GenerateRootCMakeFile(self, config: Config, package: Package,
                                platformName: str,
                                template: CMakeGeneratorUtil.CodeTemplateCMake,
                                toolProjectContextsDict: Dict[
                                    ProjectId, ToolConfigProjectContext],
                                useExtendedProjectHack: bool) -> None:
        if package.Type != PackageType.TopLevel:
            return

        projectContexts = CMakeGeneratorUtil.GetProjectContexts(package)

        for projectContext in projectContexts:
            # Top level package handling
            if projectContext.ProjectId not in toolProjectContextsDict:
                raise Exception(
                    "Internal error could not locate tool project context")

            toolProjectContext = toolProjectContextsDict[
                projectContext.ProjectId]
            projectAbsolutePath = toolProjectContext.Location.ResolvedPath

            packageName = "TopLevel_{0}".format(projectContext.ProjectName)

            addSubDirectoriesDirectDependencies = self.__BuildAddSubDirectoriesForTopLevelDirectDependencies(
                config, package, projectAbsolutePath, template)
            #findExternalDependencies = self.__BuildFindExternalDependencies(config, package, template)

            aliasPackageName = CMakeGeneratorUtil.GetAliasName(
                packageName, projectContext.ProjectName)

            findDirectExternalDependencies = CMakeGeneratorUtil.BuildFindDirectExternalDependencies(
                config, package, template.PackageDependencyFindPackage)

            allPackageNames = CMakeGeneratorUtil.GetAllPackageNames(
                package,
                projectContext if not useExtendedProjectHack else None)

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

            extendedProjectParent = CMakeGeneratorUtil.GetAddExtendedPackageParent(
                config.ToolConfig, toolProjectContext,
                template.AddExtendedPackage)

            buildCMakeFile = template.Master
            buildCMakeFile = buildCMakeFile.replace(
                "##PACKAGES_FIND_DIRECT_EXTERNAL_DEPENDENCIES##",
                findDirectExternalDependencies)
            buildCMakeFile = buildCMakeFile.replace(
                "##PACKAGE_DIRECT_DEPENDENCIES_ADD_SUBDIRECTORIES##",
                addSubDirectoriesDirectDependencies)
            buildCMakeFile = buildCMakeFile.replace(
                "##ALL_PACKAGE_NAMES##", "\n  ".join(allPackageNames))
            buildCMakeFile = buildCMakeFile.replace(
                "##EXTENDED_PROJECT_PARENT##", extendedProjectParent)

            sectionDefinePathEnvAsVariables = CMakeGeneratorUtil.CreateDefineRootDirectoryEnvironmentAsVariables(
                config.ToolConfig, toolProjectContext, useExtendedProjectHack,
                template.PathEnvToVariable)
            buildCMakeFile = self.__CommonReplace(
                buildCMakeFile, projectContext, packageName, aliasPackageName,
                cacheVariants, sectionDefinePathEnvAsVariables,
                config.ToolConfig.CMakeConfiguration.MinimumVersion, template)

            dstFilename = GeneratorCMake._GetProjectPackageBuildFileName(
                toolProjectContext.Location)
            self.__SaveFile(dstFilename, buildCMakeFile)
    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")