# buildされないheader fileをincludeしてもコンパイルが通るのはなぜ? 正確には「通ることがある」のはなぜ? ## 出会い [browser_navigator_browsertest_chromeos.cc](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ui/browser_navigator_browsertest_chromeos.cc;drc=e78ea4fc820f5480f9245623f72caef6d189b1bb) の中でLacros用のテストが書いてあるのにash専用のヘッダファイルをたくさんincludeしている。 よくある「実はLacrosではコンパイルされていませんでしたーw」ミスかと思いきや、実際にLacrosでも[lacros_chrome_browsertests](https://source.chromium.org/chromium/chromium/src/+/main:chrome/test/BUILD.gn;l=5662;drc=e49f0c659b2d18ee9f383ac37e508972dc91aaaa)でビルドされている。 ではash専用のヘッダファイルに見せかけて実は全部ash専用ではないのかと思ったが、そんなこともない。 例えば、このファイルで最初にincludeされている["ash/constants/ash_switches.h"](https://source.chromium.org/chromium/chromium/src/+/main:ash/constants/ash_switches.h) は[ash/constants/BUILD.gn](https://source.chromium.org/chromium/chromium/src/+/main:ash/constants/BUILD.gn;l=25;drc=c39cff7cab706b767169a5c1777eb10462ee3038)の中でbuildされており、そこにはがっちり[assert文](https://source.chromium.org/chromium/chromium/src/+/main:ash/constants/BUILD.gn;l=7;drc=c39cff7cab706b767169a5c1777eb10462ee3038)が入っている。 ``` assert(is_chromeos_ash, "Non-Chrome-OS builds must not depend on //ash") ``` やはりunrechableなheader fileを[lacros_chrome_browsertests](https://source.chromium.org/chromium/chromium/src/+/main:chrome/test/BUILD.gn;l=5662;drc=e49f0c659b2d18ee9f383ac37e508972dc91aaaa)からincludeしているようだ。 ## 存在しないファイル vs BUILD.gnにないファイル typoでChromiumの中に全く存在しないファイルを書いた場合、not foundで落ちる。 ```cpp= ../../chrome/browser/ui/browser_navigator_browsertest_chromeos.cc:32:10: fatal error: 'base/test/run_untill.h' file not found 32 | #include "base/test/run_untill.h" | ^~~~~~~~~~~~~~~~~~~~~~~~ 1 error generated. ``` しかしファイル自体は追加したがBUILD.gnに書き忘れたものだとどうなるか。 こんなファイルをhoge.hとして作ってみた。 ```cpp= #ifndef CHROME_BROWSER_UI_HOGE_H_ #define CHROME_BROWSER_UI_HOGE_H_ using namespace std; #endif // CHROME_BROWSER_UI_HOGE_H_ ``` するとこんなエラーが出てきた。 ```cpp= ../../chrome/browser/ui/hoge.h:4:17: error: using namespace directive in global context in header [-Werror,-Wheader-hygiene] 4 | using namespace std; | ^ 1 error generated. ``` なんとちゃんとコンパイラが認識していた。 include構文を解決する際にディレクトリの中にあるやつをプリプロセッサが探索するので見つかる。 なおincludeしなければhoge.hはエラーをはかない。 ## 結論 多分BUILD.gnの中でコントロールしているのは実際のccファイルからのオブジェクトファイルの生成部分で、その前段階は通常と同様ディレクトリ内を調べる感じになるので、仮にash dirの中、つまりBUILD.gnの依存関係ではunreachableなところも見つかるのでビルドできてしまうということ。 一方で、そのheader fileの中身の関数を使おうとすると実態がないためlink failureでおそらくcompileに失敗する。 ### 今日は時間がないのでちょっと雑です。間違いがあったらSorry
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up