Windows11 に Swift をインストールする“やさしい”手順

[windows10 の場合は こちら。](#windows10-の場合のコマンド)

<br>

https://www.swift.org/install/windows/

↑公式サイトから Windows版 Swiftインストーラ`swift-5.10.1-RELEASE-windows10.exe`をダウンロードしてインストールしたが、コンパイルできなかった。

```terminal
> swift .\hello.swift
<module-includes>:1:10: note: in file included from <module-includes>:1:
#include "AssertionReporting.h"
         ^
C:\Users\USERNAME\AppData\Local\Programs\Swift\Platforms\5.10.1\Windows.platform\Developer\SDKs\Windows.sdk\usr\lib\swift\shims/AssertionReporting.h:16:10: note: in file included from C:\Users\USERNAME\AppData\Local\Programs\Swift\Platforms\5.10.1\Windows.platform\Developer\SDKs\Windows.sdk\usr\lib\swift\shims/AssertionReporting.h:16:
#include "SwiftStdint.h"
         ^
C:\Users\USERNAME\AppData\Local\Programs\Swift\Platforms\5.10.1\Windows.platform\Developer\SDKs\Windows.sdk\usr\lib\swift\shims/SwiftStdint.h:28:10: error: 'stdint.h' file not found
#include <stdint.h>
         ^
<unknown>:0: error: could not build C module 'SwiftShims'
```

Swift 5.9.2、Swift 5.8.1 の旧バージョンをインストールしてみたが、同じ現象でした。


> 数年前に当時のSwiftをインストールしたときは、こんなことにはならず すんなりコンパイルできたのに。。。

どうやら、Visual Studio Communityをダウンロードして、MSVC等のデスクトップ開発環境のインストールが前提となったようだ。

公式のドキュメントに書いてありました。
[You will need to install Visual Studio with the following components.](https://www.swift.org/install/windows/traditional/)

ですが、Windows11から[`Windows Package Manager`を使ったインストール方法](https://www.swift.org/install/windows/winget/)があり、こちらの方がずっと簡単にインストールできたので、ここに手順のみまとめておきます。

# <i>Windows Package Manager</i> を使ったインストール方法

手順は3つ。

## 手順 1

[Windows11の開発者モードをONにする。](https://pc-karuma.net/enable-developer-mode-windows-11/)

設定 → システム → 開発者向け → 開発者モード → 「オン」にする 


## 手順 2

次のコマンドで Visual Studio の必要なコンポーネントをインストールする。

```terminal
> winget install --id Microsoft.VisualStudio.2022.Community --exact --force --custom "--add Microsoft.VisualStudio.Component.Windows11SDK.22000 --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64"
```

Visual Studioのインストーラが起動し、必要なコンポーネントのダウンロードとインストールが自動的に走る。
自分のPCだと、30分ほどかかりました。


## 手順 3

次のコマンドで Swift（及びツールチェーン）をダウンロード＆インストールする。

```terminal
> winget install --id Swift.Toolchain -e
```

当然、最新バージョンがインストールされます。

# Windows10 の場合のコマンド

Windows10 においても、`winget`をインストールすれば、同様の手順で可能ですが、まったく同じコマンドではエラーとなったので、Windows10 の場合のコマンドを書いておきます。

```terminal:手順2
> winget install --id Microsoft.VisualStudio.2022.Community --exact --force --custom "--add Microsoft.VisualStudio.Component.Windows10SDK.17763 --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64" --source winget
```

```terminal:手順3
> winget install --id Swift.Toolchain -e --source winget
```


# 確認

以上で、インストールできたので、実際に確認します。

```terminal
> swift --version
Swift version 5.10.1 (swift-5.10.1-RELEASE)
Target: x86_64-unknown-windows-msvc
```

```terminal:エラーになる??
> swift hello.swift
<unknown>:0: error: could not load the swift standard library
```

```terminal:コンパイル＆ exe実行できた
> swiftc hello.swift
   ライブラリ hello.lib とオブジェクト hello.exp を作成中
> .\hello.exe
Hello! Swift!
```

```terminal:ビルドは問題ない
> mkdir MyCLI
> cd MyCLI
> swift package init --type executable
Creating executable package: MyCLI
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources\main.swift

> swift run MyCLI
Building for debugging...
[8/8] Linking .\.build\x86_64-unknown-windows-msvc\debug\MyCLI.exe
Build complete! (5.35s)
Hello, world!
```

Replも確認しておきます。


```terminal:エラーになりませんが、printが出力されません??
> swift repl
Welcome to Swift version 5.10.1 (swift-5.10.1-RELEASE).
Type :help for assistance.
1> print("hello")
2> :quit
```

公式手順通りにインストールできたのですが、何かおかしいです。
今後、原因究明して記事をアップデートします。

# 原因究明履歴

## 2024.6.22追記

`swift -print-target-info`で出てきた以下の内容。

```terminal
> swift -print-target-info
Swift version 5.10.1 (swift-5.10.1-RELEASE)
Target: x86_64-unknown-windows-msvc
C:\Users\USERNAME\AppData\Local\Programs\Swift\Toolchains\5.10.1+Asserts\usr\bin\swift-frontend.exe -frontend -print-target-info -target x86_64-unknown-windows-msvc
{
  "compilerVersion": "Swift version 5.10.1 (swift-5.10.1-RELEASE)",
  "target": {
    "triple": "x86_64-unknown-windows-msvc",
    "unversionedTriple": "x86_64-unknown-windows-msvc",
    "moduleTriple": "x86_64-unknown-windows-msvc",
    "compatibilityLibraries": [ ],
    "librariesRequireRPath": false
  },
  "paths": {
    "runtimeLibraryPaths": [
      "C:\\Users\\USERNAME\\AppData\\Local\\Programs\\Swift\\Toolchains\\5.10.1+Asserts\\usr\\lib\\swift\\windows"
    ],
    "runtimeLibraryImportPaths": [
      "C:\\Users\\USERNAME\\AppData\\Local\\Programs\\Swift\\Toolchains\\5.10.1+Asserts\\usr\\lib\\swift\\windows",
      "C:\\Users\\USERNAME\\AppData\\Local\\Programs\\Swift\\Toolchains\\5.10.1+Asserts\\usr\\lib\\swift\\windows\\x86_64"
    ],
    "runtimeResourcePath": "C:\\Users\\USERNAME\\AppData\\Local\\Programs\\Swift\\Toolchains\\5.10.1+Asserts\\usr\\lib\\swift"
  }
}
```

一つ上の階層の`swift`までは存在するが、↓このフォルダが存在しない。
`C:\Users\USERNAME\AppData\Local\Programs\Swift\Toolchains\5.10.1+Asserts\usr\lib\swift\windows`

これが関係しているかも？と考え、空の`windows`フォルダを作ってみたが、結果は変わらない。

`error: could not load the swift standard library`
せめて、そのライブラリ名が判明すれば何とかなるようにも思うが、未だ原因不明だ。

ちなみに、Macで同じコマンドを実行した結果は、以下の内容。

```terminal
$ swift -print-target-info
Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)
Target: arm64-apple-macosx14.0
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-frontend -frontend -print-target-info -target arm64-apple-macosx14.0
{
  "compilerVersion": "Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)",
  "target": {
    "triple": "arm64-apple-macosx14.0",
    "unversionedTriple": "arm64-apple-macosx",
    "moduleTriple": "arm64-apple-macos",
    "compatibilityLibraries": [ ],
    "librariesRequireRPath": false
  },
  "paths": {
    "runtimeLibraryPaths": [
      "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx",
      "/usr/lib/swift"
    ],
    "runtimeLibraryImportPaths": [
      "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx"
    ],
    "runtimeResourcePath": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift"
  }
}

$ ls /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx
Cxx.swiftmodule					libswiftCompatibility51.a
CxxStdlib.swiftmodule				libswiftCompatibility56.a
layouts-x86_64.yaml				libswiftCompatibilityConcurrency.a
lib_InternalSwiftScan.dylib			libswiftCompatibilityDynamicReplacements.a
libcxxshim.h					libswiftCompatibilityPacks.a
libcxxshim.modulemap				libswiftCxx.a
libcxxstdlibshim.h				libswiftCxxStdlib.a
libswiftCompatibility50.a			prebuilt-modules
```

Macがグローバルインストールに対し、Windows11ではユーザインストールになっている点が違う。インストール時にインストール先は聞かれなかった。影響は分からない。

## 2024.6.26追記


`winget`でグローバルインストールを指定するオプションを見つけたので、そのオプションでインストールしてみた。

```terminal
> winget install --scope machine --id Swift.Toolchain -e
```

その結果、`swift -print-target-info`で出てくる内容も変化した。確かにパスがグローバルになった。

```terminal
> swift -print-target-info
{
  "compilerVersion": "Swift version 5.9.2 (swift-5.9.2-RELEASE)",
  "target": {
    "triple": "x86_64-unknown-windows-msvc",
    "unversionedTriple": "x86_64-unknown-windows-msvc",
    "moduleTriple": "x86_64-unknown-windows-msvc",
    "compatibilityLibraries": [ ],
    "librariesRequireRPath": false
  },
  "paths": {
    "runtimeLibraryPaths": [
      "C:\\Library\\Developer\\Toolchains\\unknown-Asserts-development.xctoolchain\\usr\\lib\\swift\\windows"
    ],
    "runtimeLibraryImportPaths": [
      "C:\\Library\\Developer\\Toolchains\\unknown-Asserts-development.xctoolchain\\usr\\lib\\swift\\windows",
      "C:\\Library\\Developer\\Toolchains\\unknown-Asserts-development.xctoolchain\\usr\\lib\\swift\\windows\\x86_64"
    ],
    "runtimeResourcePath": "C:\\Library\\Developer\\Toolchains\\unknown-Asserts-development.xctoolchain\\usr\\lib\\swift"
  }
}

> ls "C:\\Library\\Developer\\Toolchains\\unknown-Asserts-development.xctoolchain\\usr\\lib\\swift\\windows"
Get-ChildItem: Cannot find path 'C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\lib\swift\windows' because it does not exist.
```

しかし、`C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\lib\swift\windows`のパスが存在しないことは、変わらず同じ。

なぜか、バージョンがダウンした。

```terminal
> swift --version
Swift version 5.9.2 (swift-5.9.2-RELEASE)
Target: x86_64-unknown-windows-msvc
```

しかし、`swift hello.swift`の結果はエラーのまま。。。

```terminal
> swift hello.swift
<unknown>:0: error: could not load the swift standard library
```