master
JoYo 2021-02-18 13:39:35 -05:00
commit 8320dfbb2a
9 changed files with 194 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
.vscode/
*.exe
*.chman

16
Dockerfile Normal file
View File

@ -0,0 +1,16 @@
# escape=`
FROM mcr.microsoft.com/windows/servercore:2004
ADD https://aka.ms/vs/16/release/channel C:\docker\visualstudio.release.chman
ADD https://aka.ms/vs/16/release/vs_buildtools.exe C:\docker\vs_buildtools.exe
COPY vs16.config C:\docker\.vsconfig
RUN C:\docker\vs_buildtools.exe --quiet --wait --norestart --nocache `
--channelUri C:\docker\visualstudio.release.chman `
--installChannelUri C:\docker\visualstudio.release.chman `
--config "C:\docker\.vsconfig" `
--installPath C:\msvc
VOLUME C:\source\
WORKDIR C:\source\
CMD ["powershell", "-NoExit", "-Command", "Import-Module C:\\msvc\\Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll;", "Enter-VsDevShell -Verbose -VsInstallPath C:\\msvc\\ -DevCmdArguments -arch=amd64"]

82
README.mdown Normal file
View File

@ -0,0 +1,82 @@
# Visual Studio Build Tools Container
This project builds a minimal (ish) Docker container for the Visual Studio build tools (MSVC).
A second image is constructed for Windows XP Visual Studio build tools (v141_xp).
Powershell scripts are included to try and recreate these build environments directly on a Windows 10 workstation.
# Requirements
A Windows 10 workstation or VM with minimum 8 GB of memory is required.
The more concurrent containers you have running, the more memory and CPU cores is required.
**Each container requires one core and approximately 4 GB of memory.**
0. Download and install [Docker for Windows](https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe).
- Select "Switch to Windows Containers" when prompted.
# Build Image
Prior to running a container the Docker image will need to be built.
This step is automated but time consuming.
It only needs to be built once.
0. Open powershell and navigate to this project.
0. Run docker compose with the configuration provided by this project in `docker-compose.yaml`
```bash
docker-compose build
```
This will install both the Windows v142 and Windows XP v141_xp build chains into their respective containers.
Reference these containers later with the names:
- win_build
- winxp_build
# Run Containers
It is recommend that a docker compose file is used to run these containers as paths on Windows can be a bit tricky.
Make sure to use forward slashes in paths used within docker compose files.
Below is an example `docker-compose.yaml` file used to build a project configured with cmake.
```yaml
version: '3'
services:
win64_build_release:
image: win_build
volumes:
- .:C:/source/
command: msbuild .
```
- `volumes:` are mounted within the Docker container.
- `C:/source/` is assumed to be the project being build with MSVC.
- `command:` passes arguments to `Microsoft.VisualStudio.DevShell` unless entrypoint is otherwise defined.
To build a Windows XP project use the `image: winxp_build` container image.
# Build Your Windows Project
The above `docker-compose.yaml` file should be stored within your project and will reference the built Docker images by name, not by path.
Once this file is created within your project run the following command to begin the build process.
```bash
docker-compose up
```
# Optional Workstation Scripts
We have done our best to provide powershell scripts that should reproduce these build environments on a Windows 10 workstation.
They can be ran but should be evaluated as there is no error checking.
- [win_build_tools_install.ps1](win_build_tools_install.ps1)
- [winxp_build_tools_install.ps1](winxp_build_tools_install.ps1)

19
docker-compose.yaml Normal file
View File

@ -0,0 +1,19 @@
version: '3'
services:
win_build:
image: win_build
build:
context: .
volumes:
- .:C:/source/
command: msbuild .
winxp_build:
image: winxp_build
build:
context: .
dockerfile: winxp.Dockerfile
volumes:
- .:C:/source/
command: msbuild .

7
vs15.config Normal file
View File

@ -0,0 +1,7 @@
{
"version": "1.0",
"components": [
"Microsoft.VisualStudio.Workload.VCTools",
"Microsoft.VisualStudio.ComponentGroup.NativeDesktop.WinXP"
]
}

9
vs16.config Normal file
View File

@ -0,0 +1,9 @@
{
"version": "1.0",
"components": [
"Microsoft.VisualStudio.Workload.VCTools",
"Microsoft.VisualStudio.Component.NuGet",
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
"Microsoft.VisualStudio.Component.Windows10SDK.18362"
]
}

View File

@ -0,0 +1,21 @@
param([parameter()][string] $msvc="C:\msvc")
new-item -path $msvc -type directory -force
new-item -path "temp" -type directory -force
invoke-webrequest https://aka.ms/vs/16/release/channel -outfile temp\visualstudio.release.chman
invoke-webrequest https://aka.ms/vs/16/release/vs_buildtools.exe -outfile temp\vs_buildtools.exe
$arguments = @(
"--quiet", "--wait", "--norestart", "--nocache",
"--channeluri", ($pwd.path + "\temp\visualstudio.release.chman"),
"--installchanneluri", ($pwd.path + "\temp\visualstudio.release.chman"),
"--config", ($pwd.path + "\vs16.config"),
"--installpath", "$msvc"
)
$proc = Start-Process -FilePath "temp\vs_buildtools.exe" -ArgumentList $arguments
$proc.WaitForExit()
Remove-Item "temp" -Recurse
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";$msvc", "Machine")

16
winxp.Dockerfile Normal file
View File

@ -0,0 +1,16 @@
# escape=`
FROM mcr.microsoft.com/windows/servercore:2004
ADD https://aka.ms/vs/15/release/channel C:\docker\visualstudio.release.chman
ADD https://aka.ms/vs/15/release/vs_buildtools.exe C:\docker\vs_buildtools.exe
COPY vs15.config C:\docker\.vsconfig
RUN C:\docker\vs_buildtools.exe --quiet --wait --norestart --nocache `
--channelUri C:\docker\visualstudio.release.chman `
--installChannelUri C:\docker\visualstudio.release.chman `
--config "C:\docker\.vsconfig" `
--installPath C:\msvc
VOLUME C:\source\
WORKDIR C:\source\
CMD ["powershell", "-NoExit", "-Command", "Import-Module C:\\msvc\\Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll;", "Enter-VsDevShell -Verbose -VsInstallPath C:\\msvc\\ -DevCmdArguments -arch=amd64"]

View File

@ -0,0 +1,21 @@
param([parameter()][string] $msvc="C:\msvc")
new-item -path $msvc -type directory -force
new-item -path "temp" -type directory -force
invoke-webrequest https://aka.ms/vs/15/release/channel -outfile temp\visualstudio.release.chman
invoke-webrequest https://aka.ms/vs/15/release/vs_buildtools.exe -outfile temp\vs_buildtools.exe
$arguments = @(
"--quiet", "--wait", "--norestart", "--nocache",
"--channeluri", ($pwd.path + "\temp\visualstudio.release.chman"),
"--installchanneluri", ($pwd.path + "\temp\visualstudio.release.chman"),
"--config", ($pwd.path + "\vs15.config"),
"--installpath", "$msvc"
)
$proc = Start-Process -FilePath "temp\vs_buildtools.exe" -ArgumentList $arguments
$proc.WaitForExit()
Remove-Item "temp" -Recurse
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";$msvc", "Machine")