Skip to content

Commit

Permalink
vsdownload: Add option switches for each component
Browse files Browse the repository at this point in the history
  • Loading branch information
huangqinjin committed Dec 3, 2024
1 parent debdb5a commit 6c8b8fe
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 28 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
WDK_INSTALLERS=$(./wdk-download.sh --cache /var/tmp/msvc-wine "$WDK_INSTALLER_URL")
echo Downloaded WDK installers to $WDK_INSTALLERS
./vsdownload.py --accept-license --dest $(pwd)/msvc --cache /var/tmp/msvc-wine --architecture x86 x64 arm arm64 \
--with-wdk-installers "$WDK_INSTALLERS"
--with-msbuild --with-wdk-installers "$WDK_INSTALLERS"
./install.sh $(pwd)/msvc
- name: Test using the installed tools
run: |
Expand All @@ -44,7 +44,7 @@ jobs:
- uses: actions/checkout@v4
- name: Download MSVC
run: |
./vsdownload.py --accept-license --dest $(pwd)/msvc --architecture x86 x64 arm arm64
./vsdownload.py --accept-license --dest $(pwd)/msvc --architecture x86 x64 arm arm64 --with-msbuild
./install.sh $(pwd)/msvc
- name: Test using the installed tools
run: |
Expand Down
121 changes: 95 additions & 26 deletions vsdownload.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,32 @@
import zipfile

def getArgsParser():
class OptionalBoolean(argparse.Action):
def __init__(self,
option_strings,
dest,
default=None,
help=None):

if default is not None:
default_string = "yes" if default else "no"
if help is None:
help = "default: " + default_string
else:
help += " (default: %s)" % default_string

super().__init__(
option_strings=option_strings,
dest=dest,
nargs='?',
default=default,
choices=["yes", "no"],
help=help,
metavar="yes|no")

def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values != "no")

parser = argparse.ArgumentParser(description = "Download and install Visual Studio")
parser.add_argument("--manifest", metavar="manifest", help="A predownloaded manifest file")
parser.add_argument("--save-manifest", const=True, action="store_const", help="Store the downloaded manifest to a file")
Expand All @@ -56,6 +82,11 @@ def getArgsParser():
parser.add_argument("--msvc-version", metavar="version", help="Install a specific MSVC toolchain version")
parser.add_argument("--sdk-version", metavar="version", help="Install a specific Windows SDK version")
parser.add_argument("--architecture", metavar="arch", help="Target architecture to include (x86, x64, arm, arm64), defaults to host", nargs="+")
parser.add_argument("--with-msvc", action=OptionalBoolean, help="Include MSVC build tools (default)")
parser.add_argument("--with-sdk", action=OptionalBoolean, help="Include Windows SDK (default)")
parser.add_argument("--with-atl", action=OptionalBoolean, help="Include ATL")
parser.add_argument("--with-dia", action=OptionalBoolean, help="Include DIA SDK")
parser.add_argument("--with-msbuild", action=OptionalBoolean, help="Include MSBuild")
parser.add_argument("--with-wdk-installers", metavar="dir", help="Install Windows Driver Kit using the provided MSI installers")
parser.add_argument("--host-arch", metavar="arch", choices=["x86", "x64", "arm64"], help="Specify the host architecture of packages to install")
parser.add_argument("--only-host", default=True, const=True, action="store_const", help="Only download packages that match host arch")
Expand All @@ -64,21 +95,28 @@ def getArgsParser():
def setPackageSelectionMSVC16(args, packages, userversion, sdk, toolversion, defaultPackages):
if findPackage(packages, "Microsoft.VisualStudio.Component.VC." + toolversion + ".x86.x64", warn=False):
if "x86" in args.architecture or "x64" in args.architecture:
args.package.append("Microsoft.VisualStudio.Component.VC." + toolversion + ".x86.x64")
args.package.append("Microsoft.VC." + toolversion + ".ASAN.X86")
args.package.append("Microsoft.VisualStudio.Component.VC." + toolversion + ".ATL")
if args.with_msvc:
args.package.append("Microsoft.VisualStudio.Component.VC." + toolversion + ".x86.x64")
args.package.append("Microsoft.VC." + toolversion + ".ASAN.X86")
if args.with_atl:
args.package.append("Microsoft.VisualStudio.Component.VC." + toolversion + ".ATL")
if "arm" in args.architecture:
args.package.append("Microsoft.VisualStudio.Component.VC." + toolversion + ".ARM")
args.package.append("Microsoft.VisualStudio.Component.VC." + toolversion + ".ATL.ARM")
if args.with_msvc:
args.package.append("Microsoft.VisualStudio.Component.VC." + toolversion + ".ARM")
if args.with_atl:
args.package.append("Microsoft.VisualStudio.Component.VC." + toolversion + ".ATL.ARM")
if "arm64" in args.architecture:
args.package.append("Microsoft.VisualStudio.Component.VC." + toolversion + ".ARM64")
args.package.append("Microsoft.VisualStudio.Component.VC." + toolversion + ".ATL.ARM64")
if args.with_msvc:
args.package.append("Microsoft.VisualStudio.Component.VC." + toolversion + ".ARM64")
if args.with_atl:
args.package.append("Microsoft.VisualStudio.Component.VC." + toolversion + ".ATL.ARM64")

if sdk.startswith("10.0.") and int(sdk[5:]) >= 22000:
sdkpkg = "Win11SDK_" + sdk
else:
sdkpkg = "Win10SDK_" + sdk
args.package.append(sdkpkg)
if args.with_sdk:
args.package.append(sdkpkg)
else:
# Options for toolchains for specific versions. The latest version in
# each manifest isn't available as a pinned version though, so if that
Expand All @@ -103,28 +141,44 @@ def setPackageSelection(args, packages):
else:
args.architecture = ["x86", "x64", "arm", "arm64"]

args.with_default = len(args.package) == 0

if args.msvc_version is not None:
args.with_msvc = True
if args.with_sdk is None:
args.with_sdk = True
if args.sdk_version is not None:
args.with_sdk = True

# Select default packages.
if args.with_default:
for component in ["msvc", "sdk"]:
if getattr(args, "with_" + component) is None:
setattr(args, "with_" + component, True)

# If no packages are selected, install these versionless packages, which
# gives the latest/recommended version for the current manifest.
defaultPackages = []
if "x86" in args.architecture or "x64" in args.architecture:
defaultPackages.append("Microsoft.VisualStudio.Component.VC.Tools.x86.x64")
defaultPackages.append("Microsoft.VisualCpp.ASAN.X86")
defaultPackages.append("Microsoft.VisualStudio.Component.VC.ATL")
if args.with_msvc:
defaultPackages.append("Microsoft.VisualStudio.Component.VC.Tools.x86.x64")
defaultPackages.append("Microsoft.VisualCpp.ASAN.X86")
if args.with_atl:
defaultPackages.append("Microsoft.VisualStudio.Component.VC.ATL")
if "arm" in args.architecture:
defaultPackages.append("Microsoft.VisualStudio.Component.VC.Tools.ARM")
defaultPackages.append("Microsoft.VisualStudio.Component.VC.ATL.ARM")
if args.with_msvc:
defaultPackages.append("Microsoft.VisualStudio.Component.VC.Tools.ARM")
if args.with_atl:
defaultPackages.append("Microsoft.VisualStudio.Component.VC.ATL.ARM")
if "arm64" in args.architecture:
defaultPackages.append("Microsoft.VisualStudio.Component.VC.Tools.ARM64")
defaultPackages.append("Microsoft.VisualStudio.Component.VC.ATL.ARM64")

# TODO
defaultPackages.append("Win11SDK_10.0.22621")
if args.with_msvc:
defaultPackages.append("Microsoft.VisualStudio.Component.VC.Tools.ARM64")
if args.with_atl:
defaultPackages.append("Microsoft.VisualStudio.Component.VC.ATL.ARM64")

defaultPackages.extend([
"Microsoft.VisualCpp.Servicing.Redist",
"Microsoft.Build",
"Microsoft.Build.Dependencies",
])
# TODO
if args.with_sdk:
defaultPackages.append("Win11SDK_10.0.22621")

# Note, that in the manifest for MSVC version X.Y, only version X.Y-1
# exists with a package name like "Microsoft.VisualStudio.Component.VC."
Expand Down Expand Up @@ -194,19 +248,34 @@ def setPackageSelection(args, packages):
print("Unsupported MSVC toolchain version " + args.msvc_version)
sys.exit(1)

if len(args.package) == 0:
args.package = defaultPackages
if args.msvc_version is None:
args.package.extend(defaultPackages)

if args.sdk_version != None:
if args.sdk_version != None or not args.with_sdk:
for key in packages:
if key.startswith("win10sdk") or key.startswith("win11sdk"):
if not args.with_sdk:
args.ignore.append(key)
continue
base = key[0:8]
sdkname = base + "_" + args.sdk_version
if key == sdkname:
args.package.append(key)
else:
args.ignore.append(key)

if args.with_msvc:
args.package.append("Microsoft.VisualCpp.Servicing.Redist")

if args.with_dia:
args.package.append("Microsoft.VisualCpp.DIA.SDK")
else:
args.ignore.append("Microsoft.VisualCpp.DIA.SDK".lower())

if args.with_msbuild:
args.package.append("Microsoft.Build")
args.package.append("Microsoft.Build.Dependencies")

def lowercaseIgnores(args):
ignore = []
if args.ignore != None:
Expand Down

0 comments on commit 6c8b8fe

Please sign in to comment.