qmakeの高度な概念

6838 ワード

qmakeの高度な概念
これまで見たqmakeプロジェクトファイルは、いくつかのname=valueとname+=valueのリスト行だけで非常に簡単でした.qmakeは、簡単なプロジェクトファイルを使用して複数のプラットフォームにmakefileを生成するなど、より強力な機能を提供しています.
オペレータ
これまで、プロジェクトファイルで使用されていた=オペレータと+=オペレータが表示されました.ここでは、より多くの使用可能なオペレータを提供することができますが、その中のいくつかは、期待以上に変更される可能性があるため、慎重に使用する必要があります.
"="オペレータ
このオペレータは、変数に値を簡単に割り当てます.使用方法は次のとおりです.
    TARGET = myapp

TARGET変数をmyappに設定します.これにより、元のTARGETの設定が削除されます.
[+=]オペレータ
このオペレータは、変数の値のリストに値を追加します.使用方法は次のとおりです.
    DEFINES += QT_DLL

これはQT_DLLはmakefileに格納された前処理定義のリストに追加される.
「-=」オペレータ
このオペレータは、変数の値のリストから値を削除します.使用方法は次のとおりです.
    DEFINES -= QT_DLL

これにより、makefileに格納された前処理定義のリストからQT_が削除されます.DLL.
「*=」オペレータ
このオペレータは、1つの値が1つの変数の値のリストに存在しない場合にのみ、それを追加します.使用方法は次のとおりです.
    DEFINES *= QT_DLL

QT_のみDLLは、前処理定義のリストに定義されていない場合に追加されます.
「~=」オペレータ
このオペレータは、指定した値の正規表現に一致する任意の値を置き換えます.使用方法は次のとおりです.
    DEFINES ~= s/QT_[DT].+/QT

これはQTの代わりにQTを使用します.DまたはQT_T先頭の変数のQT_DまたはQT_T.
アクティブドメイン
役割ドメインはif文と似ています.条件が真の場合、役割ドメインの設定が処理されます.役割ドメインの使用方法は次のとおりです.
    win32 {
        DEFINES += QT_DLL
    }

上のコードの役割は、Windowsプラットフォームでqmakeを使用する場合、QT_DLL定義はmakefileに追加されます.Windowsプラットフォーム以外のプラットフォームでqmakeを使用すると、この定義は無視されます.qmakeを使用して、条件/タスクを1行実行することもできます.
    win32:DEFINES += QT_DLL

たとえば、Windowsプラットフォーム以外のすべてのプラットフォームで何を処理したいかを仮定します.このような否定的な効果を達成するために、役割ドメインをこのように使用したいと考えています.
    !win32 {
        DEFINES += QT_DLL
    }

CONFIG行のいずれのエントリも役割ドメインです.たとえば、次のように書きます.
    CONFIG += warn_on

「warn_on」という役割ドメインが得られます.これにより、特定の条件で必要とされるすべてのカスタム設定を失わない条件で、プロジェクト内の構成を簡単に変更できます.自分の値をCONFIG行に置く可能性があるため、makefileのために非常に強力な構成ツールを提供します.例:
    CONFIG += qt warn_on debug
    debug {
        TARGET = myappdebug
    }
    release {
        TARGET = myapp
    }

上記のコードでは、CONFIG行で設定されているものに依存する2つの役割ドメインが作成されます.この例では、デバッグはCONFIG行にあるので、TARGET変数はmyappdebugに設定されます.releaseがCONFIG行にある場合、TARGET変数はmyappに設定されます.
もちろん、いくつかの設定を処理する前に2つのものをチェックすることもできます.たとえば、プラットフォームがWindowsであり、スレッド設定が設定されているかどうかを確認したい場合は、次のように書くことができます.
    win32 {
        thread {
            DEFINES += QT_THREAD_SUPPORT
        }
    }

多くのネストされた役割ドメインを書くのを避けるために、コロンを使用して役割ドメインをネストできます.
    win32:thread {
        DEFINES += QT_THREAD_SUPPORT
    }

テストが実行されると、else/elseif操作も行うかもしれません.この場合、複雑なテストを簡単に書くことができます.これは、他の役割ドメインと組み合わせることができる特殊な「else」役割ドメインを使用する必要があります.たとえば、次のようにします.
    win32:thread {
        DEFINES += QT_THREAD_SUPPORT
    } else:debug {
        DEFINES += QT_NOTHREAD_DEBUG
    } else {
        warning("Unknown configuration")
    }

変数#ヘンスウ#
これまで出会った変数は、DEFINES、SOURCES、HEADERSなどのシステム変数です.自分の変数を作成することもできます.これにより、役割ドメインで使用することができます.名前を付けて割り当てるだけで、独自の変数を作成するのは簡単です.例:
    MY_VARIABLE = value

今、あなたは自分の変数に何をするかに制限がありません.同様に、qmakeは、1つの役割ドメインでそれらを考慮する必要がない限り、それらを無視します.
他の変数の変数名に$$を追加することで、この変数の値を現在の変数に割り当てることもできます.例:
    MY_DEFINES = $$DEFINES

今MY_DEFINES変数には、プロジェクトファイルがこの時点でDEFINES変数の値が含まれます.これも次の文と同じです.
 
    MY_DEFINES = $${DEFINES}

2つ目の方法では、スペースを使用せずに1つの変数と他の変数を接続できます.qmakeは、1つの変数に$(VALUEを含む)を含むものを許可し、makefileに直接配置することができ、通常は環境変数である適切に拡張することができます.いずれにしても、すぐに環境変数を設定する必要がある場合は、$()メソッドを使用できます.例:
    MY_DEFINES = $$(ENV_DEFINES)

MY_が設定されますDEFINESは環境変数ENV_DEFINESは.proファイルの値に渡されます.また、置換された変数で組み込み関数を呼び出すこともできます.これらの関数(次のセクションで説明するテスト関数と混同されない)は、次のようにリストされます.
join( variablename, glue, before, after )
これはvariablenameの各値にglueを加えます.この変数の値が空でない場合、値の前に接頭辞beforeと接尾辞afterが追加されます.variablenameのみが必須フィールドであり、その他のデフォルトでは空欄です.glue、before、afterでスペースを使用する必要がある場合は、それらを提供する必要があります.
member( variablename, position )
これにより、variablenameのリスト内のposition位置の値が配置されます.variablenameが長くない場合は、空の列が返されます.variablenameは唯一必要なフィールドで、場所が指定されていない場合はリストの最初の値がデフォルトです.
find( variablename, substr )
これにより、variablename内のsubstrに一致するすべての値が配置されます.substrは正規表現であってもよく、したがって一致する.
    MY_VAR = one two three four
    MY_VAR2 = $$join(MY_VAR, " -L", -L) -Lfive
    MY_VAR3 = $$member(MY_VAR, 2) $$find(MY_VAR, t.*)

MY_VAR 2には「-LON-LTWO-LThree-Lfour-Lfive」が含まれ、MYVAR 3には「three two three」が含まれます.
system( program_and_args )
これは、プログラムが標準出力/標準エラー出力を実行する内容を返し、通常期待されているように分析します.例えば、これを使用してプラットフォームに関する情報を聞くことができます.
    UNAME = $$system(uname -s)
    contains( UNAME, [lL]inux ):message( This looks like Linux ($$UNAME) to me )

テスト関数
qmakeは簡単に実行できるが、強力なテストの内蔵関数を提供している.これらのテストは、上のように役割ドメインでも使用できます.場合によっては、そのテスト値を無視して、自分でテスト関数を使用するのが役立ちます.
contains( variablename, value )
valueがvariablenameという変数の値のリストに存在する場合、この役割ドメインの設定は処理されます.例:
    contains( CONFIG, thread ) {
        DEFINES += QT_THREAD_SUPPORT
    }

threadがCONFIG変数の値のリストに存在する場合、QT_THREAD_SUPPORTはDEFINES変数の値のリストに追加されます.
count( variablename, number )
numberがvariablenameと呼ばれる変数の値の数と一致する場合、この役割ドメインの設定は処理されます.例:
    count( DEFINES, 5 ) {
        CONFIG += debug
    }

error( string )
この関数は、指定された文字列を出力し、qmakeを終了させます.例:
    error( "An error has occured" )

「An error has occured」というテキストがコンソールに表示され、qmakeが終了します.
exists( filename )
指定したファイルが存在する場合、この役割ドメインの設定は処理されます.例:
    exists( /local/qt/qmake/main.cpp ) {
        SOURCES += main.cpp
    }

/local/qt/qmake/main.cppが存在する場合、main.cppはソースファイルリストに追加されます.
なお、プラットフォームがディレクトリの区切り記号として「/」を使用することは考慮しないでください.
include( filename )
プロジェクトファイルには、このファイル名の内容が含まれているため、指定したファイルの設定はすべて処理されます.例:
 
    include( myotherapp.pro )

myotherapp.proプロジェクトファイルの設定はすべて処理されます.
isEmpty( variablename )
これはcount(variablename,0)を使用するのと同じです.variablenameという変数に要素がない場合、この役割ドメインの設定は処理されます.例:
    isEmpty( CONFIG ) {
        CONFIG += qt warn_on debug
    }

message( string )
この関数は単純にコンソールにメッセージを出力するだけです.
    message( "This is a message" )

テキスト「This is a message」がコンソールに出力され、プロジェクトファイルの処理が続行されます.
system( command )
特定の命令が実行され、1の終了値が返されると、この役割ドメインの設定が処理されます.例:
    system( ls /bin ) {
        SOURCES += bin/main.cpp
        HEADERS += bin/main.h
    }

したがって、コマンドls/binが1を返すと、bin/main.cppがソースファイルリストに追加され、bin/main.hがヘッダファイルリストに追加されます.
infile( filename, var, val )
filenameファイル(qmakeによって自分で解析された場合)にvalの値を持つ変数varが含まれている場合、この関数は成功に戻ります.3番目のパラメータ(val)を渡さないこともできます.この場合、関数はファイルにこのような変数varが割り当てられているかどうかをテストします.