Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Visual Studio 2022に対応する #1755

Closed
wants to merge 4 commits into from
Closed

Conversation

dep5
Copy link
Contributor

@dep5 dep5 commented Jan 4, 2022

PR の目的

Visual Studio 2022に対応します。
起動しているVisual Studioのバージョンのツールを使うようにします。

カテゴリ

  • ビルド関連
    • ビルド手順
    • ローカルビルド

PR の背景

Visual Studio 2022を使うとソリューション(プロジェクト)の再ターゲットが必要になります。
合わせて想定と違うバージョンのツールが選ばれるのにも対応しました。

PR のメリット

そのままビルドできます。
起動したバージョンのツールが選ばれます。

PR のデメリット (トレードオフとかあれば)

対応した以外のビルド方法に影響があるかもしれません。

仕様・動作説明

vcx-props/vcxcompat.propsとtools/find-tools.batに追記しました。

Visual Studio 2017とそれ以上がインストールされている環境でIDEでローカルビルドをすると
サクラエディタの初回ビルドやリビルドの時に
find-tools.batが動いて各種ツールで2017のものが設定されます。
そのままでも特に問題はないですが、調べてみました。

find-tools.batはtests/compiletests.run.cmdで呼ばれており
tests/compiletests.targetsではNUM_VSVERSIONに起動しているVisual Studioのバージョンが指定されています。
置き換えでいいかもしれませんが、ARG_VSVERSIONにも同様の指定をして、環境変数を追加しています。

tests/googletest.targetsにも同様の指定があるので対応した方がよいかも。

PR の影響範囲

対応した以外のビルド方法に影響があるかもしれません。

テスト内容

Visual Studio 2022 IDEのsakuraプロジェクトを右クリックしてビルドします。

テスト1

手順

関連 issue, PR

参考資料

@AppVeyorBot
Copy link

Build sakura 1.0.3976 completed (commit e08fb8457a by @dep5)

@@ -18,6 +18,7 @@
<SetEnv name="platform" value="$(Platform)" prefix="false" />
<SetEnv name="configuration" value="$(Configuration)" prefix="false" />
<SetEnv name="NUM_VSVERSION" value="$(VsVersion)" prefix="false" />
<SetEnv name="ARG_VSVERSION" value="$(VsVersion)" prefix="false" />

This comment was marked as duplicate.

@ghost
Copy link

ghost commented Jan 4, 2022

僕が #1752 で言及した直後にこういったものが出てくると、なんだか不安になってきます。

@dep5
Copy link
Contributor Author

dep5 commented Jan 4, 2022

#1752
の内容はCIの対応についてではないですか?
2017を残したままの環境で
ローカルで2022IDEからビルドした場合に2017のCMAKEが動いてしまうことへの対処です

設定する環境変数はNUM_VSVERSIONではなく、ARG_VSVERSIONではないかなと思います。

@ghost
Copy link

ghost commented Jan 4, 2022

#1752 の内容はCIの対応についてではないですか?

CIの話ではありますが、VS2017のビルドをCIで確認できないということは、VS2017を使い続けることが困難になるということでもあります。特定バージョンでしかビルドできないコードを弾くためにも確認できないといけません。
ということで、結局はローカルビルドにまで影響する話になるだろうと予想しています。

Copy link
Contributor

@berryzplus berryzplus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不要と思われる修正が1箇所、質問が1件あるので、コメントのみです。

vcx-props/vcxcompat.props Show resolved Hide resolved
vcx-props/vcxcompat.props Show resolved Hide resolved
:: 16 => Visual Studio 2019
:: 2017 or 15 => Visual Studio 2017
:: 2019 or 16 => Visual Studio 2019
:: 2022 or 17 => Visual Studio 2022
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここのコメント修正はどちらでもよいです。

visual studio 的に「バージョン」とは 17.0 のことで 2022 は「商標」にあたります。
ここで指定するのはバージョンなので、2桁を前にしたほうが良いように思います。(対応不要

Copy link

@ghost ghost Jan 4, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

そもそも

  ::     2017 => Visual Studio 2017
  ::     2019 => Visual Studio 2019
+ ::     2022 => Visual Studio 2022
  ::     15   => Visual Studio 2017
  ::     16   => Visual Studio 2019
+ ::     17   => Visual Studio 2022

とすればよかったような気もします。

@@ -185,6 +186,8 @@ exit /b
set CMAKE_G_PARAM=Visual Studio 15 2017
) else if "%NUM_VSVERSION%" == "16" (
set CMAKE_G_PARAM=Visual Studio 16 2019
) else if "%NUM_VSVERSION%" == "17" (
set CMAKE_G_PARAM=Visual Studio 17 2022
) else (
call :set_cmake_gparam_automatically
)
Copy link

@ghost ghost Jan 4, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

235行目ですが、ここに「17^」を追加する必要がある気がします。

for /f "usebackq delims=" %%d in (`"%CMD_VSWHERE%" -requires Microsoft.Component.MSBuild -property installationPath -version [15^,16^)`) do (

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👆の部分は、利用できるMsBuildのパスを列挙する部分です。
ここを修正しないとPRの目的が達成されないのではないかと思います。

vs2019のMsBuildは、vs2022を使ったビルドができる仕様なので、
結果オーライになると予想されますが、vs2022しか入れない端末でのビルドができないんじゃないかと思いました。

Copy link

@ghost ghost Jan 8, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VS2019/VS2022が混在した環境で実行し、vswhereにどんな引数が入るか確認してみました。
引数指定なしの場合

find-tools.bat
vswhere -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath -version [15,16\)
vswhere -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationVersion -latest
vswhere -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe -version [17,18\)
|- CMD_MSBUILD=C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe
|- CMAKE_G_PARAM=Visual Studio 17 2022
end

引数に「15」を与えた場合(※実行した環境にVS2017はインストールされていない)

find-tools.bat
vswhere -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath -version [15,16)`
vswhere -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationVersion -latest`
vswhere -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe -version [17,18)`
|- CMD_MSBUILD=C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe
|- CMAKE_G_PARAM=Visual Studio 17 2022
end

引数に「16」を与えた場合

find-tools.bat
vswhere -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath -version [16,17)
vswhere -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe -version [16,17)
|- CMD_MSBUILD=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe
|- CMAKE_G_PARAM=Visual Studio 16 2019
end

引数に「17」を与えた場合

find-tools.bat
vswhere -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath -version [17,18)
vswhere -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe -version [17,18)
|- CMD_MSBUILD=C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe
|- CMAKE_G_PARAM=Visual Studio 17 2022
end

探索ロジックがまずビルドツールを「指定したバージョンが利用できるか調べ、できなければ最新のものを選ぶ」ようになっており、MSBuildは「ビルドツールの探索で決定したバージョンのものを探す」ようになっているようなので、find-tools.batの実行結果からは問題なく見えています。

しかし、find_msbuild_legacyで実行されるvswhereの呼び出し箇所は、逆に「利用できる一番古いもの」という動作になりそうな気がします(上記と同じ環境で実行しました)。

> vswhere -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationVersion -latest
17.0.32014.148

> vswhere -requires Microsoft.Component.MSBuild -property installationPath -version [15,17)
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community

ビルドツールの探索と同じく、指定バージョンのものが見つからなければ利用可能な最新のものを選ぶようにして良いのではないかと思うのですが。

> vswhere -requires Microsoft.Component.MSBuild -property installationPath -latest
C:\Program Files\Microsoft Visual Studio\2022\Community

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

単独環境はこうなりました。

VS2017のみ

> vswhere -requires Microsoft.Component.MSBuild -property installationPath -version [15,16`)
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise

> vswhere -requires Microsoft.Component.MSBuild -property installationPath -version [15,17`)
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise

VS2019のみ

> vswhere -requires Microsoft.Component.MSBuild -property installationPath -version [15,16`)

> vswhere -requires Microsoft.Component.MSBuild -property installationPath -version [15,17`)
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise

VS2022のみ

> vswhere -requires Microsoft.Component.MSBuild -property installationPath -version [15,16`)

> vswhere -requires Microsoft.Component.MSBuild -property installationPath -version [15,17`)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

vswhere -versionを使って抽出するには

VS2017のみ
vswhere -requires Microsoft.Component.MSBuild -property installationPath -version [15,16)
VS2019のみ
vswhere -requires Microsoft.Component.MSBuild -property installationPath -version [16,17)
VS2022のみ
vswhere -requires Microsoft.Component.MSBuild -property installationPath -version [17,18)
VS2017とVS2019
vswhere -requires Microsoft.Component.MSBuild -property installationPath -version [15,17)

となります。
1つだけ指定のメジャーバージョンを見つけるにはこう書くようです。

vswhere -version [x,x+1)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:find_msbuild_legacyについてですが
改めて見直してみたところ、将来のVisual Studioのバージョンで
Msbuild.exeのパスが変更された場合などを想定しているように思います

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

find_msbuild_legacyまで到達するシチュエーションが本当にありうるかは不明です。
.vsconfigに書いたコンポーネントのインストールが済んでいることを前提とすれば到達しなさそう。
だとしたら変更しなくても支障ないかも。

@berryzplus
Copy link
Contributor

@kazasaku さん

僕が #1752 で言及した直後にこういったものが出てくると、なんだか不安になってきます。

コメントの意図が分からないです。

「こういったもの」がこのPRを指すのは自明ですが、
このPRを「どういったPR」と評価しているかが謎です。
後に続く「不安」から、プラスには捉えてはないんですかね。。。

個人的には「あきらかにアカンやつ」とは思っていないです。
vs2022を使いたい人は使えばいいと思います。
「まだ早い」が良識だと思いますが。

@dep5
Copy link
Contributor Author

dep5 commented Jan 5, 2022

指摘ありがとうございます。

わたしも最初そのように変更していたのですが
vswhere -version [15,16)
とすると「15.0.0...以上」「16.0.0...未満」という意味になるようです
つまり、15系のみを指定しています
Examples · microsoft/vswhere Wiki · GitHub

:find_msbuild で CMD_MSBUILD が設定されない場合に
:find_msbuild_legacy が呼ばれ、15系があれば15のMsbuildを使うという意味のようです

今までARG_VSVERSIONが無かったので :find_msbuild_legacy が呼ばれていました
(#1755 (comment))
ARG_VSVERSIONがあれば :find_msbuild で CMD_MSBUILD が設定されます。

サクラエディタがいつまで対応するかは置いておいて、
Visual Studio 2017のサポートは2027年まであるようなので
(コメントなのに)最終的に8行になってしまうことと
2017と17で間違えそうになったのでまとめてしまいました。
:msbuild での流れを見ると2017,2019... のほうが先に来るのが自然かと思いましたがどうでしょうか?

Visual Studio 2019のみ、2022のみの環境で動くのかは気になっています。
どなたかビルドできるかテストしてもらえませんか?

tests/compiletests.targetsで NUM_VSVERSION を残すべきか
tests/googletest.targetsをどうすべきかについてはいかがでしょうか?

@ghost
Copy link

ghost commented Jan 5, 2022

@kazasaku さん

僕が #1752 で言及した直後にこういったものが出てくると、なんだか不安になってきます。

コメントの意図が分からないです。

「こういったもの」がこのPRを指すのは自明ですが、
このPRを「どういったPR」と評価しているかが謎です。
後に続く「不安」から、プラスには捉えてはないんですかね。。。

個人的には「あきらかにアカンやつ」とは思っていないです。
vs2022を使いたい人は使えばいいと思います。
「まだ早い」が良識だと思いますが。

自分の中では「CIも対応したみたいだし、そろそろ検討を始めませんか」と言う段階なので、いきなり対応開始するためのPRが出されたのは「明らかに早すぎる」と感じています。
早すぎるうえに部分的な対応しかできない(ヘルプファイルのビルドが考慮されていない)PRだったので、初見での評価はよろしくないです。

どうしてもVS2022を使いたいんだとかであれば別ですが。

@ghost
Copy link

ghost commented Jan 5, 2022

tests/compiletests.targetsで NUM_VSVERSION を残すべきか
tests/googletest.targetsをどうすべきかについてはいかがでしょうか?

それらtargetsファイルの変更は要らないと言っています。

@ghost
Copy link

ghost commented Jan 5, 2022

それらtargetsファイルの変更は要らないと言っています。

find-tools.batの処理はsetlocalコマンドとendlocalコマンドで囲われています。
このため、setlocalを呼んでからendlocalを呼ぶまでの間に設定した環境変数はローカル変数として扱われます。
endlocalより後で設定した環境変数はグローバル変数になりますが、find-tools.batendlocalの後ろにあるコードは次の部分だけです。

&& set "CMD_GIT=%CMD_GIT%" ^
&& set "CMD_7Z=%CMD_7Z%" ^
&& set "CMD_HHC=%CMD_HHC%" ^
&& set "CMD_ISCC=%CMD_ISCC%" ^
&& set "CMD_CPPCHECK=%CMD_CPPCHECK%" ^
&& set "CMD_DOXYGEN=%CMD_DOXYGEN%" ^
&& set "CMD_VSWHERE=%CMD_VSWHERE%" ^
&& set "CMD_MSBUILD=%CMD_MSBUILD%" ^
&& set "CMD_CMAKE=%CMD_CMAKE%" ^
&& set "CMD_NINJA=%CMD_NINJA%" ^
&& set "CMD_LEPROC=%CMD_LEPROC%" ^
&& set "CMD_PYTHON=%CMD_PYTHON%" ^
&& set "NUM_VSVERSION=%NUM_VSVERSION%" ^
&& set "CMAKE_G_PARAM=%CMAKE_G_PARAM%" ^
&& echo end
set FIND_TOOLS_CALLED=1
exit /b

ここでNUM_VSVERSIONに選択されたVSのメジャーバージョンが設定され、その値を後からtargetsファイルなどが利用します。
ARG_VSVERSIONは、find-tools.batを呼び出す前にあらかじめユーザーが設定したとかでなければ定義されないはずです。

@dep5
Copy link
Contributor Author

dep5 commented Jan 8, 2022

kazasakuさん

その部分の前に

if not defined CMD_MSBUILD call :msbuild 2> nul

が呼ばれています。
setlocalコマンドとendlocalコマンドで囲われた箇所です
:msbuildでは
NUM_VSVERSIONARG_VSVERSIONの値で上書きされています。
ARG_VSVERSIONを指定しない場合、15が設定されます

つぎに:msbuildの中で:check_installed_vsversionが呼ばれ
例えば、Visual Studio 2019のみをインストールした環境では15.0のVisual Studioがないので
:check_installed_vsversionの中で :check_latest_installed_vsversionが呼ばれ
最終的にNUM_VSVERSIONに一番新しいVisual Studioが設定されます。

わたしの直面したのは15.0と17.0の組み合わせですが、
15.0、16.0、17.0のうち一つだけインストールしていると(当然)それが選ばれ、
15.0と16.0、15.0と17.0、15.0と16.0と17.0という組み合わせなら15.0が選ばれ、
16.0と17.0という組み合わせなら17.0が選ばれるように思います。
15.0が入ってない環境でARG_VSVERSIONを設定せずにリビルドした場合、
今までわずかながら無駄なvswhereの呼び出しが入っていた、ということになると思います。

コマンドラインでのビルドについて考えてみます。CIもこれでしてるのでしょうか?

if not defined CMD_MSBUILD call %~dp0tools\find-tools.bat

まずこれが呼ばれるようなので、どのバージョンが選ばれるかは上と同じだと思います。

@dep5
Copy link
Contributor Author

dep5 commented Jan 8, 2022

find-tools.batでVSVERSIONを受け入れるのはARG_VSVERSIONだけなのに、
targetsファイルで指定しているのは NUM_VSVERSIONなので
問題が起きているのではないでしょうか?

targetsが意図しているのがfind-tools.batにVSVERSIONを渡すことなら
find-tools.batをNUM_VSVERSIONを受け入れるように編集するか
targetsでARG_VSVERSIONを設定するように追加or変更する必要があります。
今回は後者を選びました。

どうしてもVS2022を使いたいんだとかであれば別ですが。

そう言われれば、その通りです。
PRの説明にもある通り困っているので、投稿しています。
ぜひよろしくお願いします

@berryzplus
Copy link
Contributor

実現したことが明確で変更理由に筋が通っているなら導入して問題ない内容だと思っています。

・vs2022でもビルドできるようにしたい
・compiletest.targetsのバグ(?)を直したい
・find-tools.batのバグを直したい

find-tools.batには一貫性のないロジックがあると思うんですが、
それを不具合として修正したいというならそれもアリだと思います。

バッチでも関数でも同じですが、呼出の引数は最小限とするのが望ましいので、
既にある引数と同じ意味の引数を追加する変更は「筋が通らない」ように思います。

@ghost
Copy link

ghost commented Jan 8, 2022

find-tools.batでVSVERSIONを受け入れるのはARG_VSVERSIONだけなのに、
targetsファイルで指定しているのは NUM_VSVERSIONなので
問題が起きているのではないでしょうか?

繰り返しになりますが、ARG_VSVERSIONNUM_VSVERSIONと持っている値の意味が違っています。
NUM_VSVERSIONはVisual Studioのバージョン番号を保持するのに対して、ARG_VSVERSIONは製品名や英単語が入ります。

想定している使い方 ARG_VSVERSION NUM_VSVERSION
find-tools.bat (未定義) 利用できる最新のVSバージョン(例: 16)
15 または 利用できる最新のVSバージョン(例: 16)
find-tools.bat clear (未定義) 現在の値を初期化
find-tools.bat latest latest 利用できる最新のVSバージョン(例: 16)
find-tools.bat 2015 2015 15
find-tools.bat 2019 2019 16
find-tools.bat 2022 2022 17
find-tools.bat 15 15 15
find-tools.bat 16 16 16
find-tools.bat 17 17 17

ユーザー側の指定の揺れを吸収しつつ値を検証し、正しい値をNUM_VSVERSIONとして設定する仕組みです。
VSのバージョン番号が必要な場面でARG_VSVERSIONを参照した結果が「latest」だったときはどうすればいいんですかね。

僕の結論:find-tools.batと各環境変数の使い方は今のままで正しい。

@dep5
Copy link
Contributor Author

dep5 commented Jan 8, 2022

一貫性のあるロジック、ですかね?
私にはとてもよく考えられてるように思います。

find-tools.batを触らないことにしたのでそれ以外を編集することにします。

https://github.com/dep5/sakura/blob/0dd4391776be5530ef4d0a66e8279ace744d3dd6/tests/compiletests.run.cmd#L8

ここ以外に出てこないので一時的なテストコードと考えて削除しています。

@sonarcloud
Copy link

sonarcloud bot commented Jan 8, 2022

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

No Coverage information No Coverage information
No Duplication information No Duplication information

<SetEnv name="NUM_VSVERSION" value="$(VsVersion)" prefix="false" />
<SetEnv name="ARG_VSVERSION" value="$(VsVersion)" prefix="false" />
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(再掲)不要な対応です。

Copy link

@ghost ghost Jan 8, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不満はたくさん残りますが、これらを撤回していただければいったんapproveすることにします。
…が、事前検討の不足などから混乱を招いているように感じますので、今後はいきなりPRを出したりせずissueを立ててください。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このファイルが実行されるのは、常にvisual studioの「中」です。
ここから呼ばれたバッチでは「呼出元と同じバージョンのvisual studio」を使います。
ユーザーの利便性のための「2022」に対応する必要はないので「追加不要」ということになります。

@AppVeyorBot
Copy link

Build sakura 1.0.3979 failed (commit 41b6dda8ad by @dep5)

@ghost
Copy link

ghost commented Jan 8, 2022

2022の導入には反対しませんが、この形で対応しても2022でビルドできることは検証できませんのでご注意ください。
(過去に2017ではビルドできるが2019ではできない、といった事例がありました。)

今月中ごろを目標にいったんCI対応の実験PRを出す予定ではいますのでよろしくお願いします。

@@ -37,7 +37,7 @@
</PropertyGroup>
<SetEnv name="platform" value="$(Platform)" prefix="false" />
<SetEnv name="configuration" value="$(Configuration)" prefix="false" />
<SetEnv name="NUM_VSVERSION" value="$(VsVersion)" prefix="false" />
<SetEnv name="ARG_VSVERSION" value="$(VsVersion)" prefix="false" />
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

同上。

@ghost
Copy link

ghost commented Jan 8, 2022

・compiletest.targetsのバグ(?)を直したい
・find-tools.batのバグを直したい

僕は「そんなバグは存在しない」という認識です。

@AppVeyorBot
Copy link

Build sakura 1.0.3979 failed (commit 0cd30f73eb by @dep5)

@dep5
Copy link
Contributor Author

dep5 commented Jan 8, 2022

kazasaku さん

set ARG_VSVERSION=latest
build-all.bat Win32 Release
コマンドラインでこう打つと、まずbuild-sln.bat の中で
tests\compiletests.targets よりも先にfind-tools.batが呼ばれます。
ここではlatestが渡り最新のバージョンで各種変数が設定されます

つぎに
tests\compiletests.targets が呼ばれ、ARG_VSVERSIONが数字で設定され直すと思います。
各種変数が設定済みなので、find-tools.batは動きません。

しかし、ARG_VSVERSIONがlatestから実際のバージョンに変わってしまっていますね。
わたしは、それで問題ないと判断しました。

<ARG_VSVERSION Condition="'$(ARG_VSVERSION)' == ''">
	<SetEnv name="ARG_VSVERSION" value="$(VsVersion)" prefix="false" />
</ARG_VSVERSION>

まだテストしてませんが、このような指定にする必要があるかもしれないです。

kazasakuさんはVS2019/VS2022が混在した環境をお持ちなんですよね?
tests\compiletests.targetsの

    <SetEnv name="NUM_VSVERSION" value="$(VsVersion)" prefix="false" />

の行を

    <SetEnv name="NUM_VSVERSION" value="16" prefix="false" />
    <SetEnv name="NUM_VSVERSION" value="17" prefix="false" />
    <SetEnv name="ARG_VSVERSION" value="16" prefix="false" />
    <SetEnv name="ARG_VSVERSION" value="17" prefix="false" />

と書き換えながらテストしてみてもらえませんか?
うまくいかなかったら、IDE上でやってみてください。
NUM_VSVERSIONではビルドツールが変化せず
ARG_VSVERSIONなら指定したバージョンになると思うのですが・・・

表にしてくださった
想定している使い方 ARG_VSVERSION NUM_VSVERSION
find-tools.bat (未定義) 利用できる最新のVSバージョン(例: 16)
ですが、正しくは
find-tools.bat (未定義) 15が入っていれば15、15が無ければ利用できる最新のVSバージョン(例: 16)
となります(表が書けなくてすいません)
これに対応するための変更です
IDEではコマンドラインのように気軽に環境変数が設定できませんので。

@berryzplus
Copy link
Contributor

結論として不具合修正でなくなるなら、
PR本文の「不具合修正」を外してほしいです。

@AppVeyorBot
Copy link

Build sakura 1.0.3982 completed (commit 0cd30f73eb by @dep5)

Copy link
Contributor

@berryzplus berryzplus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

現状では対応してないvs2022に対応させたいのか、
既存バッチの不具合(?)を修正したいのかが分からないです。

ざっとみた感じ、修正内容が誤っているように見えています。

正しいと思われる修正を用意したほうがよいでしょうか?

@@ -5,8 +5,6 @@ set SOURCE_DIR=%~dp0compiletests
:: find generic tools
if not defined CMD_VSWHERE call %~dp0..\tools\find-tools.bat

set /a NUM_VSVERSION_NEXT=NUM_VSVERSION + 1

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これを削ってよいのか疑問です。

本来 [16,17) のように使うための変数と考えられるので、
変数が利用されていないとすれば、find-tools.batが壊れていると思います。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

調査結果: この一文は要りません。

PRの趣旨とは無関係なので、対応からは外すのがベターと思います。
コミットが分かれているならPRに混ぜてもよいはと思います。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NUM_VSVERSION_NEXTはソースをGrepしてみたところ、find-tools.bat内とここでだけ使用されています。
find-tools.batのあとで使われているのでテストコードのように思えるのですが、どうでしょうか?
コミットは分けたほうがよいですね・・・

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

find-tools.batのNUM_VSVERSION_NEXTはendlocalより前にあるので外には出てこないはずです。
find-tools.batから制御が戻った時にはもうなくなっています。

つまりこのコードは要りません。
…が、VS2022対応とは無関係な変更になります。

tests/compiletests.targets Outdated Show resolved Hide resolved
@berryzplus
Copy link
Contributor

試してみましたところ、find-tools.batに不具合があるように見えます。

vs2017、vs2019、vs2022がインストールされた端末で、
以下を入力した場合はvs2019のMsBuildが選択される想定ですが、vs2017のものが選択されています。

find-tools.bat clear
set NUM_VSVERSION=16
find-tools.bat

先にこの不具合を修正したほうがわかりやすいのではないかと思います。

@berryzplus
Copy link
Contributor

find-tools.batの不具合修正をしてみました。
https://github.com/berryzplus/sakura/tree/feature/fix_find-tools_bat

やりとりするのが面倒くさいのでPRは出しません。
流用してもいいし、スルーして進めるのも自由です。

@dep5
Copy link
Contributor Author

dep5 commented Jan 9, 2022

berryzplus さん

set NUM_VSVERSION=16

ARG_VSVERSIONを使う必要があります
ARG_VSVERSIONを設定しないと
find-tools.batの中で、まずNUM_VSVERSION=15となります。

PR本文の「不具合修正」を外してほしいです。

不具合とはプログラム本体の動作のことなのですか?
だとしたら間違えました。

vcx-props/vcxcompat.props を修正しないとVS2022を使うことができません。
これは同意いただけてると思います。

調べた結果、問題の原因はARG_VSVERSIONとNUM_VSVERSIONの混用にあると思います
NUM_VSVERSIONは「find-tools.bat内でのみ」使われている変数で
外からは設定できません。
NUM_VSVERSION は「直接指定できません」

find-tools.batの挙動をNUM_VSVERSIONも指定できるように変更する場合、
ARG_VSVERSIONとNUM_VSVERSIONのどちらを優先すべきかという問題もあります。

どちらでも設定できるとなったら、どちらで設定するのが正解ですか?
一方ARG_VSVERSIONは15,16,17といったバージョンでも問題なく受け入れます。

わたしはfind-tools.batに渡すにはARG_VSVERSIONに一本化すべきと思います。

NUM_VSVERSIONでソースをGrepすると使用されているのは
find-tools.bat以外では
compiletests.targets
compiletests.run.cmd
googletest.targets
の3つのみで、該当の部分は

ビルドのサブプロセスから参照できるように環境変数を追加
  (システムの環境変数には影響しないので、新しい環境変数ブロックが作られていると考えられます。)

なので、コマンドラインで
set ARG_VSVERSION=latest
ビルド後に%ARG_VSVERSION%でチェックしてみてもlatestのままでした。

@berryzplus
Copy link
Contributor

ARG_VSVERSIONを設定しないと
find-tools.batの中で、まずNUM_VSVERSION=15となります。

自分はそれを「find-tools.bat の不具合である」と解釈しました。

PR本文の「不具合修正」を外してほしいです。

不具合とはプログラム本体の動作のことなのですか?

違います。バッチの不具合も「不具合修正」としてよいと思います。
「find-tools.batに不具合はない」という話が出ていたので書いたコメントです。

vcx-props/vcxcompat.props を修正しないとVS2022を使うことができません。

「vs2022を使えるようにする」が目的なら、その修正は必須です。
自分が提示したのは「find-tools.batの不具合を修正する」なので、その修正は含めない形としました。

NUM_VSVERSIONは「find-tools.bat内でのみ」使われている変数で
外からは設定できません。

ARG_VSVERSION はバッチに与える引数なので、厳密には環境変数じゃありません。
NUM_VSVERSION は環境変数なので、setコマンドなどを使って呼び出し前に定義できます。ゆえに「外から設定できません」は認識違いだと思います。

ARG_VSVERSION = find-tools.batに与えた第1引数の値が "clear" でない場合に、ローカルな環境変数として定義されるものです。(外部から指定できますが、名前付き引数として指定できるわけじゃないです。)
NUM_VSVERSIONを間接的に指定するためのものです。
バージョン番号しか受け付けないNUM_VSVERSIONだけだと使い勝手がわるかろう、という経緯で用意されたものです。

わたしはfind-tools.batに渡すにはARG_VSVERSIONに一本化すべきと思います。

NUM_VSVERSIONとは異なり、ARG_VSVERSIONはバッチ引数に付けるローカルな名前なので、
find-tools.batの外部で利用すべきではないように思います。

まぁ結局、vs2022を使えるようにしたいのか、compiletest.targetsのバグ(?)を直したいのかどっちやねん?という感じになります。こういう言い方をしたらあかんのかも知れませんが。

@berryzplus
Copy link
Contributor

書き洩らし。

なので、コマンドラインで
set ARG_VSVERSION=latest
ビルド後に%ARG_VSVERSION%でチェックしてみてもlatestのままでした。

ARG_VSVERSIONはNUM_VSVERSIONを指定するためのものなので、
設定したlatestに対応する値をNUM_VSVERSIONに設定して終わりだと思います。
その点(=ARG_VSVERSIONがlatestに相当するバージョン番号に変更されない)については不具合じゃないように思います。

@dep5
Copy link
Contributor Author

dep5 commented Jan 9, 2022

VS2017と2022の入った環境で
コマンドラインでのビルドもテストしてみました。
環境変数をリセットするために毎回新しいコマンドプロンプトを立ち上げる必要があります。
作業フォルダbuildの削除も必要かもしれません。

または
.....\tools\find-tools.bat clear
set ARG_VSVERSION=
をテスト前に毎回実行します。

compiletests.run.cmdに
echo test=%test1%
echo ARG_VSVERSION=%ARG_VSVERSION%
と追記し、
ビルド後に次のチェックもしました。
echo CMD_ARG_VSVERSION=%ARG_VSVERSION%

compiletests.targetsの
<SetEnv name="NUM_VSVERSION" value="$(VsVersion)" prefix="false" />
の部分を以下のように書き換えながらチェックします

<SetEnv name="test1" value="$(ARG_VSVERSION)" prefix="false" />
<SetEnv name="ARG_VSVERSION" value="$(VsVersion)" prefix="false" />

結果:
test=latest
ARG_VSVERSION=17
CMD_ARG_VSVERSION=latest

<SetEnv name="test1" value="$(ARG_VSVERSION)" prefix="false" />
<SetEnv name="ARG_VSVERSION" value="$(VsVersion)" prefix="false" Condition=" '$(ARG_VSVERSION)' == '' " />

結果:
test=latest
ARG_VSVERSION=latest
CMD_ARG_VSVERSION=latest

以上から、コマンドプロンプトで環境変数ARG_VSVERSIONを設定したあと、
compiletests.run.cmdで一度書き換えられるが、compiletests.run.cmdが終わったら
もとの値に戻っているので、それ以降のコードには影響がないようです
しかし、念のため、ARG_VSVERSIONに何か設定されていないか調べることにしました。
空の場合のみ、設定します。
ARG_VSVERSIONに値が設定されていれば変更することはありません。

@AppVeyorBot
Copy link

Build sakura 1.0.3984 failed (commit 0a87166fdd by @dep5)

@dep5
Copy link
Contributor Author

dep5 commented Jan 9, 2022

パッチありがとうございます。
berryzplus さんの変更はARG_VSVERSIONを優先するようですね。

リンクがうまくできなくてすいませんが
build.mdの97行目

set ARG_VSVERSION=16

tools\find-tools.mdの44行目

環境変数 ARG_VSVERSION の値でビルドに使用するバージョンを切り替えられる。

などをご覧ください

ARG_VSVERSIONは引数以外の使い方もできますし、それを想定しています。

NUM_VSVERSION は環境変数なので

$(VisualStudioVersion)と間違えてませんか?

https://github.com/sakura-editor/sakura/blob/25281cdf5d5be0174ca4be0923cbee717dc77ba5/tests/compiletests.targets#L16
$(VsVersion)は$(VisualStudioVersion)を整数に切り詰めてつくったこの場限りのプロパティです。

kazasakuさんもおっしゃったように
tools\find-tools.bat 内で最終的にNUM_VSVERSIONも環境変数として設定されてはいますが、ソースGrepではここ以外で呼び出されないように思うのですが?(つまりfind-tools.bat でしか利用していない)

これを対応しないと、VS2022のCMAKEが使えないのでVS2022対応の一環と思っています。

@ghost
Copy link

ghost commented Jan 9, 2022

ARG_VSVERSIONを設定しないと
find-tools.batの中で、まずNUM_VSVERSION=15となります。

自分はそれを「find-tools.bat の不具合である」と解釈しました。

「引数指定がない場合に無条件でVS2017を仮選択する」のはおかしいということかな?
どのみちこの動作もVS2017対応を廃止すると合理性がなくなるので変えてもよいかもしれませんね。

find-tools.bat の話はVS2022対応とは関係ない話だと思うので、issueとして切り出しておきます。

@ghost
Copy link

ghost commented Jan 9, 2022

kazasakuさんもおっしゃったように
tools\find-tools.bat 内で最終的にNUM_VSVERSIONも環境変数として設定されてはいますが、ソースGrepではここ以外で呼び出されないように思うのですが?(つまりfind-tools.bat でしか利用していない)

そう言った覚えはないです😢

  • NUM_VSVERSION は(現状では)find-tools.batで設定される環境変数です
  • NUM_VSVERSION_NEXT はfind-tools.batの中でのみ使われる一時変数です

@ghost
Copy link

ghost commented Jan 9, 2022

find-tools.bat の話はVS2022対応とは関係ない話だと思うので、issueとして切り出しておきます。

find-tools.batに関する疑問などをまとめ、 #1759 として投稿しました。

@dep5
Copy link
Contributor Author

dep5 commented Jan 9, 2022

kazasakuさん

kazasakuさんもおっしゃったように
tools\find-tools.bat 内で最終的にNUM_VSVERSIONも環境変数として設定されてはいます

で切れていました。すいません

#1755 (comment)
に貼ってもらったコードについてでした。
たまたまではなく動作テスト用のコピーのように思いますが
消えるなら問題ないですね。

@berryzplus
Copy link
Contributor

指摘していただいた部分だと思うのですが、ドキュメントが変な感じですね。

環境変数 ```ARG_VSVERSION``` の値でビルドに使用するバージョンを切り替えられる。

ドキュメントに「環境変数」と書くとグローバルな環境変数と混同してしまうのでよくないと思います。
実態としては、「find-tools.batの実行引数に特定の値を指定するとビルドに使用するバージョンを指定できます。」です。
構造として「環境変数」として利用することも可能と思いますが、そうだとすると変数名がおかしい気がします。

) else if "%~1" neq "" (
set "ARG_VSVERSION=%~1"
)

バッチファイルの記法で %~1 は「最初の引数から引用符を取り除いた文字列」を意味します。
shiftコマンドとか、知らないことにしたほうが説明しやすい概念もあったりなかったり。。。

@dep5
Copy link
Contributor Author

dep5 commented Jan 9, 2022

mdのファイルはリンクできないのかと思ったのですが、できるのですね。

グローバルな環境変数とはコントロールパネルで設定する項目のことですか?
setで設定できるのは環境変数だと思います。
set (環境変数)
システム環境変数やユーザー環境変数ではなくプロセス限定の環境変数ですね。

@berryzplus
Copy link
Contributor

mdのファイルはリンクできないのかと思ったのですが、できるのですね。

表示したプレビューページの上の方に <> マークがあるのでクリックすると普通のソースコード表示になります。
で、いつものように行番号をクリックして Copy permalink したあと、
https://github.com/sakura-editor/sakura/blob/25281cdf5d5be0174ca4be0923cbee717dc77ba5/tools/find-tools.md?plain=1#L5のようなURLから?plain=1を削除したら貼れました

@dep5
Copy link
Contributor Author

dep5 commented Jan 10, 2022

sakura/build.md

Lines 1 to 2 in 138ec8e

# ビルド方法

できました。?も消すのですね。ありがとうございます

@berryzplus
Copy link
Contributor

force-pushしてしまったのですが、こんな感じになりました。
https://github.com/berryzplus/sakura/commits/feature/fix_find-tools_bat

vs2022対応とは無関係なコミットを7つも積んでいます。
個々のコミットがPRに相当する変更内容なので、想定通り「ボチボチ大変」っぽいです。

@dep5
Copy link
Contributor Author

dep5 commented Jan 10, 2022

<PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '16.0'">v142</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '17.0'">v143</PlatformToolset>

1行にまとめられるんですね。とてもいいです。
わたしはVS2022が使えればよいのでおまかせしてよいですかね?

ということでクローズします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants