4

module.modulemapファイルには、次のようになります。module.modulemapで環境変数またはティルダを使用できますか?

module CompanyInternalSDK { 
    header "~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h" 
    export * 
} 

しかし、私はこのエラーを取得:

/Users/username/Path/To/Project/CompanyInternalSDK/module.modulemap:2:12: error: header '~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h' not found 
    header "~/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h" 
     ^

私はチルダせずに、絶対パスを使用するときにはうまくコンパイルが、これは配布されますので、このようにすべての開発者に、私はチルダを使いたい。 これを正しく動作させる方法はありますか?


どちらか私はまたheader文字列で環境変数を使用しようとしましたが、それはうまくいきませんでした:

module CompanyInternalSDK { 
    header "${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h" 
    export * 
} 
/Users/username/Path/To/Project/CompanyInternalSDK/module.modulemap:2:12: error: header '${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h' not found 
    header "${HOME}/Company/CompanyInternalSDK.framework/Headers/CompanyInternalSDK.h" 
     ^
+1

シェル拡張文字であるティルドを使用する代わりに、環境変数$ {HOME}を使用してみてください。コンパイル時に環境変数の拡張も適用されるのかどうかはわかりませんが。 –

+0

@ScottThompson私はそれを試して、それは動作しませんでした –

+0

ベン、あなたのモジュールマップファイルの 'header" CompanyInternalSDK.h "'を試してみましたか? –

答えて

3

いいえ、modulemap構文はチルダや環境を展開しません変数。最終的には、あなたが与えたパスはstatになります。そこにファイルがなければ、それは不平を言うでしょう。

  • Here'sここで、モジュールマップファイルのレキシング中にヘッダーファイルのルックアップが開始されます。
  • 最終的にパスをSourceManagerのFileManagerに渡して、Fileオブジェクトを生成します。フレームワークのHeaders/パブリックヘッダフォルダ内のヘッダには、hereとなります。
  • getFile最終的には、キャッシュルックアップを行うgetStatValueが呼び出されます。
  • FileSystemStatCache::getは、最終的にLLVMのファイルシステム抽象化の根拠になります。sys::fs::statusが呼び出され、POSIX statのように動作することが記録されています。
  • POSIX statは、そのままのパス、チルダまたは環境変数の拡張で動作します。これらの一般的な可用性は、シェルがあなたを助けるためであり、システムレベルでほとんど自動的に行われるものではありません。

ただし、モジュールマップでを使用するのは標準です。レクサーはこれを尊重し、すべてのモジュールマップドキュメントでこれを実証します。あなたのモジュールマップファイルがライブラリと一緒に配置され、その横にインストールされる一般的なケースでは、パスを適切に解決するだけで十分です。

関連する問題