qmakeを使用したコンパイラベンダー/バージョンの検索
-
03-07-2019 - |
質問
qmakeを通じてユーザーが使用するコンパイラのバージョンとベンダーを取得する方法はありますか?必要なのは、g ++ 3.xが使用されている場合はプロジェクトのターゲットのビルドを無効にし、g ++ 4.xが使用されている場合はそれらを有効にすることです。
更新:ほとんどの回答はプリプロセッサを対象としています。これは避けたいものです。特定のコンパイラバージョン用にターゲットをビルドしたくないので、ビルドシステムによってこの決定が行われるようにします。
解決
ashcatch の回答に加えて、< code> qmake を使用すると、コマンドラインを照会して、変数として応答を取得します。したがって、次のようなことができます:
linux-g++ {
system( g++ --version | grep -e "\<4.[0-9]" ) {
message( "g++ version 4.x found" )
CONFIG += g++4
}
else system( g++ --version | grep -e "\<3.[0-9]" ) {
message( "g++ version 3.x found" )
CONFIG += g++3
}
else {
error( "Unknown system/compiler configuration" )
}
}
その後、ターゲットを指定するためにそれを使用する場合、構成スコープ規則を使用できます。
SOURCES += blah blah2 blah3
g++4: SOURCES += blah4 blah5
他のヒント
Caleb Huitt-cjhuitt に基づく私の答え。しかし、彼のアプローチは私にはうまくいきません。
*-g++ {
GCC_VERSION = $system("g++ -dumpversion")
contains(GCC_VERSION, 6.[0-9]) {
message( "g++ version 6.x found" )
CONFIG += g++6
} else {
contains(GCC_VERSION, 5.[0-9]) {
message( "g++ version 5.x found" )
CONFIG += g++5
} else {
contains(GCC_VERSION, 4.[0-9]) {
message( "g++ version 4.x found" )
CONFIG += g++4
} else {
message( "Unknown GCC configuration" )
}
}
}
}
ご覧のとおり、GCCからバージョンを取得し、正規表現と比較できます。
使用方法は同じです:
SOURCES += blah blah2 blah3
g++4: SOURCES += blah4 blah5
最初に、qmakeがサポートするスコープ機能を見てみましょう:
しかし、私はそれについて読んでいる間、デフォルトでは win32
や unix
のような一般的なプラットフォーム条件を使用できるか、またはqmake仕様の名前を使用できるようです linux-g ++
。このようにVisual Studioバージョンをテストできます(異なるVisual Studioバージョンは異なるqmake仕様を使用するため)が、このようにgccバージョンをテストできるとは思いません(少なくとも方法はわかりません)。
やる
isEmpty(MGWVER) {
MGW_MAJ = $system(echo | gcc -dM -E - | fgrep __GNUC__ | cut -d\" \" -f 3)
MGW_MIN = $system(echo | gcc -dM -E - | fgrep __GNUC_MINOR__ | cut -d\" \" -f 3)
MGWVER =$MGW_MAJ$MGW_MIN
message(MGWVER $MGWVER)
}
&quot; 48&quot;を返します。 適切なブーストライブラリをリンクするために使用します:
USER_BOOST_CFG=mgw${MGWVER}-mt-s-$(BOOST_VER)
message($USER_BOOST_CFG)
LIBS *= -L$(BOOST_ROOT)/lib
LIBS *= -L$(BOOST_ROOT)/stage/lib
LIBS *= -lboost_system-$USER_BOOST_CFG
LIBS *= -lboost_filesystem-$USER_BOOST_CFG
LIBS *= -lboost_date_time-$USER_BOOST_CFG
効果的に与える: -lboost_system-mgw48-mt-s-1_54
私はmingwを使用しています。
別のアイデアは、QMAKESPEC変数を見て、そこから解析することです、ヒント:
message(QMAKESPEC $QMAKESPEC)
SPLITED=$section(QMAKESPEC, "/", 0, -3)
message(SPLITED $SPLITED)
私の回答は、ディスミンの回答に基づいています
$$ str_member
gcc | clang {
COMPILER_VERSION = $system($QMAKE_CXX " -dumpversion")
COMPILER_MAJOR_VERSION = $str_member($COMPILER_VERSION)
greaterThan(COMPILER_MAJOR_VERSION, 3): message("gcc 4 or later")
greaterThan(COMPILER_MAJOR_VERSION, 4): message("gcc 5 or later")
greaterThan(COMPILER_MAJOR_VERSION, 5): message("gcc 6 or later")
greaterThan(COMPILER_MAJOR_VERSION, 6): message("gcc 7 or later")
}
各コンパイラベンダーは、コンパイラとバージョンを識別する特定のシンボルを定義するために使用します。これらの記号を使用して確認できます。
たとえば、_MSC_VERはMicrosoft C ++コンパイラのバージョンを提供することを知っています。
私が知っているのは、Boost Librariesがこの種の機能選択と適応を使用していることです。
パス:boost / config / *、特にselect_compiler_config.hppのincludeフォルダーにあるBoost Configヘッダーを確認できます。
これらのコンパイラ固有のシンボルを使用することにより、コード構築の前処理段階で機能を選択できます。
次のマクロは、私のバージョンのgccおよびg ++で定義されています
#define __GNUC__ 4
#define __GNUC_MINOR__ 0
#define __GNUC_PATCHLEVEL__ 1
さらに、g ++が定義するもの:
#define __GNUG__ 4