web-dev-qa-db-ja.com

RのMakevarsファイルの内容を理解する(マクロ、変数、〜/ .R / Makevarsおよびpkg / src / Makevars)

独自のRパッケージをインストール/ビルドするときに、~/.R/Makevarsおよびpackage_directory/src/Makevarsで設定されたマクロ/変数の役割と関係を理解し​​ようとしています。これらのファイルが次のように見えるとします

〜/ .R/Makevars

CXX = g++
CXXSTD = -std=c++11
CXXFLAGS = -fsanitize=undefined,address -fno-omit-frame-pointer

CXX98 = g++
CXX98STD = -std=c++98

CXX11 = g++
CXX11STD = -std=c++11

CXX14 = g++
CXX14STD = -std=c++14

package_directory/src/Makevars

PKG_CPPFLAGS = -I../inst/include
CXX_STD = CXX11

私が理解しているように、CXXを使用すると、RパッケージをビルドするときにC++のコンパイラを選択できます。CXXSTDを使用すると標準が選択され、CXXFLAGSPKG_CPPFLAGSを使用すると、C++プリプロセッサにフラグが追加され、CXX_STDを使用すると、パッケージがC++ 11を使用することがわかります。

次の質問があります。

  • CXXCXX98CXX11CXX14の関係は何ですか?
  • C++ 11がすでに暗示されている場合、たとえばCXX11STD = -std=c++11の意味は何ですか? -std=c++11-std=gnu++11の選択の間ですか? -std=gnu++11は、一般的に移植性の理由で避けるべきですか?
  • CXXSTDおよびCXXFLAGSのフラグをCXXに追加するだけでなく、最初の3行をCXX = g++ -std=c++11 -fsanitize=undefined,address -fno-omit-frame-pointerに減らすことができますか。 CXXSTDおよびCXXFLAGSを明示的に指定する利点は何ですか?
  • CXX_STD = CXX11はどのように機能しますか? CXX11は、CXX11~/.R/Makevarsとどのように関連していますか?
  • CXXFLAGSPKG_CXXFLAGS(私の例には含まれていません)の関係は何ですか?

R Extensionsの記述 および R Installation and Administration に含まれる情報を知っていますが、上記に答えるために現在の理解レベルを超える情報を抽出することはできません質問。

Rcppタグを追加しているのは、これらの質問への回答がRcppのユーザーに最も関連すると思われるためですが、これはおそらくRcppに直接関係しないことを認識しています。適切であると思われる場合、タグは削除される可能性があります。

42
NoBackingDown

R拡張機能の記述:1.2.1 Makevarsの使用 で指定されているMakevarsファイルは、 Make の変形であり、つまりuniqueto R.リストした変数の多くは 暗黙の変数 と呼ばれます。意味は次のとおりです。

暗黙のルールは、慣習的なテクニックの使用方法をmakeに指示するため、使用するときに詳細に指定する必要はありません。

これらの 暗黙的な変数 は、whatコンパイラを使用する必要があり、whatオプションが使用可能であることを示します。

[〜#〜] r [〜#〜]内では、次のデフォルトコンパイラオプションが重要です。

[〜#〜] cc [〜#〜]Cプログラムをコンパイルするためのプログラム。デフォルトは「cc」です。

[〜#〜] cxx [〜#〜]C++プログラムをコンパイルするためのプログラム。デフォルトは「g ++」です。

[〜#〜] cpp [〜#〜]Cプリプロセッサを実行するためのプログラムで、結果は標準出力に出力されます。デフォルトは「$(CC)-E」です。

[〜#〜] fc [〜#〜]FortranおよびRatforプログラムをコンパイルまたは前処理するためのプログラム。デフォルトは「f77」です。

次の一連の値の詳細whatオプションは、コンパイラで使用する必要があります。一般に、これらすべてのオプションのデフォルト値は空の文字列です。

[〜#〜] cflags [〜#〜]Cコンパイラに与える追加フラグ。

[〜#〜] cxxflags [〜#〜]C++コンパイラに与える追加フラグ。

[〜#〜] cppflags [〜#〜]Cプリプロセッサおよびそれを使用するプログラム(CおよびFortranコンパイラ)に与える追加フラグ。

[〜#〜] fflags [〜#〜]Fortranコンパイラに与える追加フラグ。

[〜#〜] ldflags [〜#〜]コンパイラがリンカー「ld」を呼び出すことになっているときにコンパイラに与える追加フラグ-L。代わりに、ライブラリ(-lfoo)をLDLIBS変数に追加する必要があります。

[〜#〜] ldlibs [〜#〜]コンパイラーがリンカー「ld」を呼び出すことになっているときにコンパイラーに指定されたライブラリーのフラグまたは名前。 LOADLIBESは、LDLIBSの非推奨の(しかし、まだサポートされている)代替です。 -Lなどの非ライブラリリンカーフラグは、LDFLAGS変数に入れる必要があります。

現在、[〜#〜] r [〜#〜]は、さまざまなC++ ISO標準の観点から「余分な」バリアントを定義しています。これらのバリアントは R管理:セクション2.7.2 C++サポート および R管理:セクションB.7コンパイルおよびロードフラグ

CXX98 CXX98STD CXX98FLAGS CXX98PICFLAGS

CXX11 CXX11STD CXX11FLAGS CXX11PICFLAGS

CXX14 CXX14STD CXX14FLAGS CXX14PICFLAGS

CXX17 CXX17STD CXX17FLAGS CXX17PICFLAGS


これを言ったので、最初の質問に取り組みましょう:

CXXと_CXX98_、_CXX11_と_CXX14_の関係は何ですか?

CXXは、使用する一般的なコンパイラオプションです。一方、[〜#〜] r [〜#〜]は、検出されたコンパイル標準に応じて使用する追加のCXXオプションを定義します。つまり、_-std=c++98_(_CXX98_言語仕様)が_CXX_STD_によって設定されている場合、_CXX98_に関連付けられたコンパイラーが使用されます。同様に、_CXX11_および_CXX14_についても、同じロジックが続きます。詳細については、「 Rcppギャラリー:C++ 11、C++ 14、およびC++ 17でのRcppの使用 」を参照してください。


たとえば、C++ 11がすでに暗示されている場合の_CXX11STD = -std=c++11_の意味は何ですか? _-std=c++11_と_-std=gnu++11_の選択の間ですか?移植性の理由から、一般的に_-std=gnu++11_を避けるべきですか?

_CXX11STD_の意味は、C++ 11コンパイルに適した言語標準を決定することです。このオプションが存在するのは、単に[〜#〜] r [〜#〜]の適切なC++ 11コンパイルオプションの選択のバージョンがコンパイラにとって正しくない場合、それを変更。これが存在する理由は、 R Installation and Administration:2.7.2 C++ Support

[脚注13] C++ 11サポートに適したフラグがないことがあります。この場合、CXX11とその対応するフラグに異なるコンパイラを選択できます。

脚注13:

これは、4.2.1などのg ++​​の以前のバージョン、およびSolarisコンパイラCCの一般的に使用されるバージョンにも当てはまります。

Gccが承認した言語標準の詳細については、 GCCマニュアル:3.4 C方言を制御するオプション を参照してください。また、パッケージで[〜#〜] r [〜#〜]とともにC++ 11を使用する方法の詳細については、 R拡張機能の記述:セクション1.2.4を参照してください。 C++ 11コードの使用

通常、この変数を明示的に設定することは避けます。この変数を明示的に設定する必要がある場合は、ほとんどのコンパイラがこの宣言をサポートしているため、_-std=c++11_を使用することをお勧めします。


CXXSTDCXXFLAGSのフラグをCXXに追加するだけでなく、最初の3行を_CXX = g++ -std=c++11 -fsanitize=undefined,address -fno-omit-frame-pointer_に減らすことができますか。 CXXSTDCXXFLAGSを明示的に指定する利点は何ですか?

出来ますか?はい。正しいですか?番号。

three変数がそれぞれ独自の目標を持っているのに、単純に1つだけ持つことができるのはなぜですか?

three可変ワークフローの利点は、異なる行にそれぞれ異なる役割を提供します。これにより、コンパイルオプションをすばやく理解できます。したがって、grokを1行で1つの変数に詰め込んだ場合(終端幅80)で比較すると、grokの方がはるかに簡単です。

例えば.

_CXX = g++ -std=c++11 -fsanitize=undefined,address -fno-omit-frame-pointer
_

_CXX = g++ 
CXX11STD = -std=c++11
CXXFLAGS = -fsanitize=undefined,address -fno-omit-frame-pointer
_

さらに、 R拡張機能の記述:セクション1.2.4 C++ 11コードの使用 に示されているように、パッケージング時に_CXX_STD_ over CXXSTDを選択する必要があります。これは単に、RがC++ xyを必要とするパッケージを登録したことを確認するためです。別の方法は、DESCRIPTIONファイルに属性_SystemRequirements: C++xy_を書き込むことです。ここで、xyは年を示します。


_CXX_STD_ = _CXX11_はどのように機能しますか?ここで_CXX11_は〜/ .R/Makevarsの_CXX11_とどのように関係していますか?

これにより、_CXX11_で設定されたC++ 11コンパイラで実行される言語のコンパイルとリンクが設定されます。 _CXX11_を指定することにより、レシピの下でファイルをコンパイルするために使用される Makeの変数 を指定しています。

_$(OBJCXX) $(ALL_CPPFLAGS) $(ALL_OBJCXXFLAGS) -c $< -o $@
_

ここで、$(OBJCXX)CXX$(ALL_CPPFLAGS)$(R_XTRA_CPPFLAGS) $(PKG_CPPFLAGS) $(CLINK_CPPFLAGS) $(CPPFLAGS)で与えられ、$(ALL_OBJCXXFLAGS)$(PKG_OBJCXXFLAGS) $(CXXPICFLAGS) $(SHLIB_CXXFLAGS) $(OBJCXXFLAGS)を持ちます。

上記は _/R/Makeconf.in_ に従います。ただし、ルーチンは _/m4/R_ の場合があります。


CXXFLAGSと_PKG_CXXFLAGS_の関係は何ですか(私の例には含まれていません)?

これらは両方とも、コンパイラのコンパイルフラグを指定します。 Makevarsに書き込まれる順序は異なります。特に、 CXXFLAGSafter_PKG_CXXFLAGS_ に配置されています。 rightmostオプションはalwaysが使用されます。したがって、CXXFLAGSは_PKG_CXXFLAGS_よりも優先されます。

R拡張機能の作成:セクション5.5共有オブジェクトの作成 に_PKG_*_オプションに関する簡単な注意事項があります。

補遺

以下は、この応答のコメントセクションで@Dominikが尋ねた質問です。


_~/.R/Makevars_で定義された変数はすべてのパッケージのインストールにグローバルに適用され、_/src/Makevars_の変数は現在のパッケージにのみ適用されるのは正しいですか?

はい。これは正確です。 _~/.R/Makevars_内の変数はすべてのパッケージに適用されますが、各パッケージに同梱されている_/src/Makevars_はそのパッケージの設定にのみ影響します。 _/src/Makevars_の値は、_~/.R/Makevars_よりも優先されます。

一部のパッケージには、Windows環境専用のMakevarsファイルを提供する_/src/Makevars.win_が付属している場合があります。


Gallery.rcpp.org/articles/simple-lambda-func-c++11に示されているように、現在、パッケージに使用されるコンパイル標準は_CXX_STD_を介してのみ設定され、_PKG_CXXFLAGS_によって設定されることはありませんか?

これら2つのフラグを使用するタイミングにはわずかな違いがあります。特に、_CXX_STD_はパッケージ環境でのみ動作します。一方、その名前に反して、_PKG_CXXFLAGS_はすべてのコンパイルオプションに影響します。したがって、上記のRcppギャラリーの投稿を引用すると、スタンドアロンスクリプトが実行されていることがわかります。正しいモードにすばやく切り替えるには、_PKG_CXXFLAGS_を設定し、not_CXX_STD_定義を必要とします。

さて、standalone useコンパイルオプションの歴史について簡単に触れてください。.._PKG_CXXFLAGS_の使用は少し古いです。実際、R 3.4で推奨されるアプローチは、環境変数_USE_CXX11 = "yes"_を設定することです。 R 3.1とR 3.3の間では、標準は環境変数_USE_CXX1X = "yes"_を設定することでした。それらのインスタンスの前は、_PKG_CXXFLAGS ="-std=c++11"_の使用が好まれていました。 (_PKG_CXXFLAGS ="-std=c++0x"_が必要なWindowsを除く。)


_CXX_STD=CXX11_を使用すると、CXXCXXSTDCXXFLAGS、および_CXX11PICFLAGS_で指定されたすべての設定を使用することになりますか?

いいえ。これは、次によって設定されたオプションを使用することを意味します。

CXX11 CXX11STD CXX11FLAGS CXX11PICFLAGS

75
coatless