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

vs2017ソリューションにテストを組み込みたい #793

Closed
2 tasks
berryzplus opened this issue Feb 25, 2019 · 20 comments · Fixed by #999
Closed
2 tasks

vs2017ソリューションにテストを組み込みたい #793

berryzplus opened this issue Feb 25, 2019 · 20 comments · Fixed by #999

Comments

@berryzplus
Copy link
Contributor

berryzplus commented Feb 25, 2019

表題のとおり、sakura.slnにtests1.vsxprojを追加したいです。

visual studio 2017(15.8以降) は googletest を使ったテストを 標準で サポートしています。

Test Adapter for Google Test を使うためには、単体テストプロジェクトに googletest への依存関係を埋め込む必要があります。Visual Studioには NuGet(にゅーげっと) というパッケージ管理機構がありまして、googletestへの参照を NuGet パッケージを通して解決できるようになっています。nuget依存を記した tests1.vcxprojsakura.sln に追加すれば、googletestのビルド済みバイナリがリンクされるようになります。

追記

@m-tmatma
Copy link
Member

実験してみました?
問題なく動くのであればいいと思います。

他で使ってないかと思って検索したら以下の情報がありました。
http://nasatame.hatenablog.com/entry/2018/03/16/092507

visual studio のバージョンが違うので状況が改善されてるといいのですが。

@berryzplus
Copy link
Contributor Author

問題なく動くのであればいいと思います。

「なんか動いてるっぽい」のレベルで良ければ、既にクリアしています。
https://ci.appveyor.com/project/berryzplus/sakura/builds/22662095/job/3tq5wkleko6uaahk

個人的には、NuGet.exe(5MB)をソースツリー配下に含めている点と、/LTCG(Link Time Code Generation)の絡みで Release 版のアセンブラリスト出力を廃止せざるを得なかった点に納得がいっとらんのですが、問題なく動くといっていいレベルだと思います。

ソースツリーに5MBもの大きなファイルを仕込むことについては、比較的大きなプロジェクトでやらかしてるのを見かけたので、あまり気にしなくてよいのかも知らんです。

Release版のアセンブラリスト出力停止は、ちょっと悩んでいます。「プログラム全体の最適化」を有効にした場合、リンク時にコード生成を行ってプログラム全体が最適化されるようになります。テストプログラムとsakura.exeのソースをリンクするためにLIB.exeでスタティックライブラリを生成しているのですが、/LTCGをオンにした場合に ソースファイル名.asm が存在しているとビルドが失敗してしまうようです。やむを得ず Release版の /FAs /FAu を外しましたが「それでいいんだっけ?」が気になっています。

他で使ってないかと思って検索したら以下の情報がありました。
http://nasatame.hatenablog.com/entry/2018/03/16/092507

久しぶりに自宅 vs2017 を 日本語版で起動してみました・・・オッケーです。
vs2017 v15.9.7 + Test Adapter for Google Test v1.0 の日本語版はちゃんと動いています。
以前は英語版で起動しないと何かするたびにエラーメッセージが出ていました。

@m-tmatma
Copy link
Member

アセンブラ出力は残したいですね

@m-tmatma
Copy link
Member

nuget って最新の visual studio でも含まれてないですか?

@m-tmatma
Copy link
Member

nuget でバイナリが取得されるのですか?
それともソースですか?

@berryzplus
Copy link
Contributor Author

vs2017の一部としてインストールされてるはずなので、取得といっても実際には展開されるだけっぽいです。

取得されるのはヘッダーとスタティックライブラリとmsbuildのビルド設定です。

@berryzplus
Copy link
Contributor Author

nuget CLI(command Line Interface)は最新でも入らないです。

vs2017 IDEがnuget機能を内包してるからだと思います。CLIなくてもIDEからの復元はできます。CLIないとバッチからのビルドができないんでCLIもいるんですけど。

@m-tmatma
Copy link
Member

https://docs.microsoft.com/ja-jp/nuget/consume-packages/package-restore
msbuild だけで行けませんか?

@berryzplus
Copy link
Contributor Author

Msbuildに復元を指示すると「nugetパッケージを含むプロジェクトが見つからない」というエラーになります。

理屈的にはその方向で解決できる可能性もゼロじゃないと思ってます。ざっと調べた感じではIDEを立ち上げるかnuget CLIを使うかの二択っぽかったです。

@berryzplus
Copy link
Contributor Author

う~む。これが原因っぽい。

https://docs.microsoft.com/ja-jp/nuget/reference/msbuild-targets#restore-target

restore対象 worksのみPackageReference 形式を使用してプロジェクトの。 いないを使用するプロジェクトの作業、packages.configは書式指定を使用して、 nuget 復元代わりにします。

@berryzplus
Copy link
Contributor Author

できた!(nuget.exeを使わずにパッケージ復元)

https://docs.microsoft.com/ja-jp/nuget/consume-packages/package-references-in-project-files

とりあえず、nuget入れなくても MsBuild単体 でいけそうです。

もう一個の問題(/FAsu外さないとダメかも?)はまだ検証中・・・。

@berryzplus
Copy link
Contributor Author

/FAsuRelease でうまく行かない問題も解決したっぽいです。
試行過程で「警告潰ししてみる」とかやっててゴチャゴチャしてるので PR は整理できてからですが。

@berryzplus
Copy link
Contributor Author

新たに問題が発覚しました。

package取得方法 取得されるパス名 参考
PackageReference microsoft.googletest.v140.windesktop.msvcstl.static.rt-static/1.8.0 バッチ実行で動くのはコッチ
packages.config microsoft.googletest.v140.windesktop.msvcstl.static.rt-static.1.8.0 VC++ IDEのNugetパッケージ復元で動くのはコッチ

どうやって回避したものか思案中・・・。

@KENCHjp
Copy link
Member

KENCHjp commented Mar 8, 2019

どうやって回避したものか思案中・・・。

どっちやねんってツッコむに一票。

@m-tmatma
Copy link
Member

m-tmatma commented Mar 8, 2019

1.8.0 だとこれは大丈夫ですか?
#181 (comment)

@berryzplus
Copy link
Contributor Author

どうやって回避したものか思案中・・・。
どっちやねんってツッコむに一票。

VC++ でうまく動かない件については「制限事項」に入ってるので、
問い合わせしたらMSさんの「あのセリフ」をガチで聞ける気がします。
https://docs.microsoft.com/ja-jp/nuget/reference/migrate-packages-config-to-package-reference

回避策は nuget 開発プロジェクトで検討してるっぽいです。 NuGet/Home#6763

いちおう、package取込方式の新旧ハイブリッドでイケてそうなんで、appveyorのビルド確認が取れ次第PR作成の予定です。

@berryzplus
Copy link
Contributor Author

1.8.0 だとこれは大丈夫ですか?

ぼくが余計な警告出力を嫌うのは、たぶんご存じの通りです(笑

なので、「必要な対処」の一部として _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING を定義することにより、この問題を回避しています。

今回は SDLチェックも準拠モードも有効にしないので、警告を無効にしなくてもデフォルトではエラーにまではならないと思います。

@berryzplus
Copy link
Contributor Author

#796 を作成しました。

@berryzplus
Copy link
Contributor Author

新たな情報を見付けたので貼っておきます。

https://cmake.org/cmake/help/v3.12/command/target_link_libraries.html

On Visual Studio Generators for VS 2010 and above, library files ending in .targets will be treated as MSBuild targets files and imported into generated project files. This is not supported by other generators.

NuGetパッケージ経由でライブラリを取り込む場合、NuGetパッケージの持つスーパー特殊な階層構造の扱いをどうすべきか苦慮することになります。.targets を指定できるなら階層構造を意識する必要がなくなって移植がはかどりそうです。

@berryzplus
Copy link
Contributor Author

あ、ダメだ。visual studio generator 使う気ないんだった...orz

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