summaryrefslogtreecommitdiff
path: root/.github/actions/msvc-dev-cmd/README.md
blob: 79b830fa29c37d79b365ef5211ca8204e84e1c79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<a href="https://github.com/ilammy/msvc-dev-cmd"><img alt="GitHub Actions status" src="https://github.com/ilammy/msvc-dev-cmd/workflows/msvc-dev-cmd/badge.svg"></a>

# msvc-dev-cmd

[GitHub Action](https://github.com/features/actions) for configuring Developer Command Prompt for Microsoft Visual C++.

This sets up the environment for compiling C/C++ code from command line.

Supports Windows. Does nothing on Linux and macOS.

## Example usage

Basic usage for default compilation settings is like this:

```yaml
jobs:
  test:
    steps:
      - uses: actions/checkout@v2
      - uses: ilammy/msvc-dev-cmd@v1
      - name: Build something requiring CL.EXE
        run: |
          cmake -G "NMake Makefiles" .
          nmake
      # ...
```

If you want something non-default,
like using a specific version of Visual Studio,
or cross-compling for a differen target,
you will need to configure those settings via inputs:

```yaml
jobs:
  test:
    # Run a job for each of the specified target architectures:
    strategy:
      matrix:
        arch:
          - amd64
          - amd64_x86
          - amd64_arm64
    steps:
      - uses: actions/checkout@v2
      - uses: ilammy/msvc-dev-cmd@v1
        with:
          arch: ${{ matrix.arch }}
      - name: Build something requiring CL.EXE
        run: |
          cmake -G "NMake Makefiles" .
          nmake
      # ...
```

## Inputs

- `arch` – target architecture
  - native compilation:
    - `x64` (default) or its synonyms: `amd64`, `win64`, `x86_64`, `x86-64`
    - `x86` or its synonyms: `win32`
  - cross-compilation: `x86_amd64`, `x86_arm`, `x86_arm64`, `amd64_x86`, `amd64_arm`, `amd64_arm64`
- `sdk` – Windows SDK to use
  - do not specify to use the default SDK
  - or specify full Windows 10 SDK number (e.g, `10.0.10240.0`)
  - or write `8.1` to use Windows 8.1 SDK
- `toolset` – select VC++ compiler toolset version
  - do not specify to use the default toolset
  - `14.0` for VC++ 2015 Compiler Toolset
  - `14.XX` for the latest 14.XX toolset installed (e.g, `14.11`)
  - `14.XX.YYYYY` for a specific full version number (e.g, `14.11.25503`)
- `uwp` – set `true` to build for Universal Windows Platform (i.e., for Windows Store)
- `spectre` – set `true` to use Visual Studio libraries with [Spectre](https://meltdownattack.com) mitigations

## Caveats

### Name conflicts with `shell: bash`

Using `shell: bash` in Actions may shadow some of the paths added by MSVC.
In particular, `link.exe` (Microsoft C linker) is prone to be shadowed by `/usr/bin/link` (GNU filesystem link tool).

Unfortunately, this happens because GitHub Actions unconditionally *prepend* GNU paths when `shell: bash` is used,
on top of any paths set by `msvc-dev-cmd`, every time at the start of each new step.
Hence, there aren't many non-destructive options here.

If you experience compilation errors where `link` complains about unreasonable command-line arguments,
“extra operand *something-something*” – that's probably it.
Recommended workaround is to remove `/usr/bin/link` if that interferes with your builds.
If this is not acceptable, please file an issue, then we'll figure out something better.

### Reconfiguration

You can invoke `ilammy/msvc-dev-cmd` multiple times during your jobs with different inputs
to reconfigure the environment for building with different settings
(e.g., to target multiple architectures).

```yaml
jobs:
  release:
    steps:
      # ...
      - name: Configure build for amd64
        uses: ilammy/msvc-dev-cmd@v1
        with:
          arch: amd64

      - run: build # (for amd64)

      - name: Configure build for x86
        uses: ilammy/msvc-dev-cmd@v1
        with:
          arch: amd64_x86

      - run: build # (for x86)

      - name: Configure build for ARM64
        uses: ilammy/msvc-dev-cmd@v1
        with:
          arch: amd64_arm64

      - run: build # (for ARM64)

      # ...
```

This mostly works but it's not really recommended
since Developer Command Prompt was not meant for recursive reconfiguration.
That said, if it does not work for you, please file an issue.

Consider using [`strategy.matrix`](https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix)
to execute different build configuration in parallel, independent environments.

## License

MIT, see [LICENSE](LICENSE).