def TryGenerateBuildReport(
            log: Log, generatorName: str,
            package: Package) -> Optional[GeneratorBuildReport]:
        if package.IsVirtual:
            return None

        # Ubuntu
        # buildCommand = ['make'] + buildConfig.BuildArgs
        # Yocto
        # buildCommand = ['make', '-f', 'GNUmakefile_Yocto'] + buildConfig.BuildArgs

        if generatorName == PlatformNameString.UBUNTU:
            buildCommandArguments = []  # type: List[str]
        elif generatorName == PlatformNameString.YOCTO:
            buildCommandArguments = ['-f', 'GNUmakefile_Yocto']
        else:
            raise Exception(
                "Unknown generator name: {0}".format(generatorName))

        # Configuration (debug, release)
        buildCommandArguments.append("{0}=${{{0}}}".format(
            ToolAddedVariant.CONFIG))

        # Normal variants
        for normalVariant in package.ResolvedNormalVariantNameList:
            buildCommandArguments.append("{0}=${{{0}}}".format(normalVariant))

        buildCommand = "make"
        buildCommandReport = GeneratorCommandReport(True, buildCommand,
                                                    buildCommandArguments)
        return GeneratorBuildReport(buildCommandReport)
    def TryGenerateBuildReport(log: Log, generatorName: str, package: Package) -> Optional[GeneratorBuildReport]:
        if package.IsVirtual:
            return None
        if package.Type != PackageType.Executable:
            return GeneratorBuildReport(None)

        commandCWD = GeneratorAndroidGradleCMakeUtil.GetAndroidProjectDir(package)

        gradleBuildConfigVariable = "${{{0}}}".format(LocalMagicBuildVariants.GradleBuildConfig)
        buildCommandArguments = [gradleBuildConfigVariable]
        buildCommand = GeneratorAndroidGradleCMakeUtil.GetPlatformGradleCommand()
        buildCommand = IOUtil.Join(commandCWD, buildCommand)
        buildCommandReport = GeneratorCommandReport(False, buildCommand, buildCommandArguments, [], commandCWD)
        return GeneratorBuildReport(buildCommandReport)
    def _TryGenerateBuildReport(
            log: Log, generatorConfig: GeneratorConfig, generatorName: str,
            cmakeConfig: GeneratorCMakeConfig, package: Package,
            isMasterBuild: bool) -> Optional[GeneratorBuildReport]:
        if package.IsVirtual and not isMasterBuild:
            return None

        # preBuildCommand = ['cmake', '-G', 'Visual Studio 15 2017 Win64'] + buildConfig.BuildArgs
        # buildCommand = ['cmake', '--build', '.', '--config', 'Debug'] + buildConfig.BuildArgs

        buildCommandArguments = ['--build', '.']  # type: List[str]
        buildCommandNativeArguments = []  # type: List[str]

        # Configuration (Debug, Release) for the configurations that support build time configuration switching
        if CMakeTypes.GetGeneratorMultiConfigCapabilities(
                cmakeConfig.GeneratorName
        ) != CMakeTypes.CMakeGeneratorMultiConfigCapability.No:
            buildCommandArguments.append("--config")
            buildCommandArguments.append("${{{0}}}".format(
                LocalMagicBuildVariants.CMakeBuildConfig))

        # Do a fallback solution for a few generators that we know how work
        nativeArguments = CMakeTypes.GetNativeBuildThreadArguments(
            cmakeConfig.GeneratorName, generatorConfig.NumBuildThreads)
        if len(nativeArguments) > 0:
            buildCommandNativeArguments += nativeArguments
        elif cmakeConfig.CMakeVersion.Major >= 3 and cmakeConfig.CMakeVersion.Minor >= 12:
            # Take advantage of the "--parallel" parameter available from 3.12 when possible
            # We use this as a fallback since testing has shown that even on 3.14 the parameter
            # doesn't always provide any benefits :(
            buildCommandArguments.append("--parallel")
            buildCommandArguments.append("{0}".format(
                generatorConfig.NumBuildThreads))
        elif isMasterBuild:
            log.LogPrintWarning(
                "BuildThreads not supported for generator '{0}' please upgrade to CMake 3.12+"
                .format(cmakeConfig.GeneratorName))

        # Add extra commands based on the build type
        if generatorConfig.BuildCommand == CommandType.Clean:
            buildCommandArguments.append("--target")
            buildCommandArguments.append("clean")
        elif generatorConfig.BuildCommand == CommandType.Install:
            buildCommandArguments.append("--target")
            buildCommandArguments.append("install")

        # set the package build dir
        buildCWD = cmakeConfig.BuildDir
        if not isMasterBuild:
            buildCWD = GeneratorCMake._GetPackageBuildDir(
                generatorConfig, cmakeConfig, package)

        buildCommand = "cmake"
        buildCommandReport = GeneratorCommandReport(
            True,
            buildCommand,
            buildCommandArguments,
            buildCommandNativeArguments,
            buildCWD,
            nativeArgumentSeparator="--")
        return GeneratorBuildReport(buildCommandReport)