きっかけ
先日仕事でPythonをC++からビルドする必要があり色々問題にぶち当たっていくうちにふと疑問に思った。
「VisualStudioの親またはプロジェクトの既定値から継承」ってどこから値をとってきているのだろう?
プロジェクトの既定値というのはVisualStudio側で予め用意されている値で、プロジェクトの設定をおこなう上で便利な値の集合体というのはなんとなくわかるし特に弄ることもないのではないと思うが、継承ってどう設定すればいいんだ?というのがきっかけ。
調べていくうち継承元の値の確認方法、どのように設定されているのか等が判明したので備忘録として残しておく。
継承元の値を確認したり編集したりする
そもそも継承元の値ってどこにあってどういったものなの?というところから実際に追加や編集していく方法を書いていく。
確認手順
今回はPythonのソースコードをダウンロードしてPCBuildのソリューションファイルを開いたところから始める。(このあたりのセットアップ手順は割愛)
- ソリューションを開くといつもの画面が表示され、ウィンドウ右側にソリューションエクスプローラーが表示される。
- ソリューションエクスプロラーの中からプロジェクトを右クリックし、プロパティをクリック
- 開いたウィンドウから C/C++ > 追加のインクルードディレクトリ > 編集 > 追加のインクルードディレクトリウィンドウを開く
これまでの手順で開いた「追加のインクルードディレクトリ」ウィンドウの一番下に表示されている「継承の値」とういのが今回キモとなる項目。ほか項目でも継承元の値を参照している箇所は複数あり、Pythonをビルドするに当たって必要となる共通パラメータが設定されている。
今回Pythonプロジェクトを開いた段階で既に追加されているもので、編集や追加・削除等はできないようになっている。が、これらの値が別ライブラリを追加した際に何かしらの弊害になっていることがあったりするかもしれない。というか実際自分はあった。
継承元の値はどこに保持されているか
結論から言うと*.propファイルに記載があった。
Pythonプロジェクトの場合pyprojct.props。
前述したインクルードディレクトリで使用されていた PySourcePathほにゃらら なんかもここに記載があり、このpyproj.propsを参照して多数あるプロジェクトの設定を共通化しているようだった。
<ItemDefinitionGroup>
<ClCompile>
<!--↓ここに書かれてる-->
<AdditionalIncludeDirectories>$(PySourcePath)Include;$(PySourcePath)Include\internal;$(PySourcePath)PC;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;$(_Py3NamePreprocessorDefinition);$(_PlatformPreprocessorDefinition)$(_DebugPreprocessorDefinition)$(_PydPreprocessorDefinition)%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Optimization>MaxSpeed</Optimization>
<IntrinsicFunctions>true</IntrinsicFunctions>
<StringPooling>true</StringPooling>
ということはこのpyproject.propsを編集すればPCBuildで参照されている全プロジェクトの「継承元の値」が編集できそう。
対象プロジェクトにインポートされている*.propsファイルを編集する
- プロパティマネージャーを開く(表示 > その他ウィンドウ > プロパティマネージャー)
- プロパティシートのプロパティウィンドウを開く(プロジェクト一覧から対象のプロパティシートを右クリック > プロパティ)
- 設定したい内容を編集して適用をクリック
上記手順でインクルードディレクトリを編集してみたところ、pyproject.propsが適用されている全てのプロジェクトに無事変更が反映されていた。
まとめ
*.propsの共通項をファイル化して設定を一括反映できるのは結構便利そう。最近VisualStudio単体でがっつり使うこととかあんまり無いけどライブラリ自作する時とかに使えそうだから覚えておこう。
プロパティの継承についての詳しい情報は↓
https://learn.microsoft.com/ja-jp/cpp/build/project-property-inheritance?view=msvc-170