[Qt-users:705] qmakeでファイル内の特定の文字列を取得する方法

Shingo Ishida hermit4loop @ gmail.com
2018年 1月 21日 (日) 12:20:07 JST


hermit4@おやつ部です。

昨日は、Qt勉強会お疲れ様でした。

勉強会の成果発表中に、yaccのソースファイルからinclude文を
抜き出して、ヘッダファイルの一覧を変数に入れたいのだけど、
システムコマンドなどを使わず、qmakeだけで完結できないで
しょうかとの質問をいただきました。

終了時刻間際でしたし、MLに流しますとしていたので、
こちらでお知らせしておきます。

qmakeの関数で、catとfindという関数があります。これらを
使うことで、ファイルから特定の文字列を取得可能です。

以下、Qt5.10のqmakeで軽く検証してみました。

-------------------------------------------------------------------
YACCSOURCES = hoge.y fuga.y

for(i, YACCSOURCES) {
    TMP = $$cat($$i,lines)
    TMP = $$find(TMP, $${LITERAL_HASH}include)
    TMP ~= s/$${LITERAL_HASH}include <(.*)>/\\1/g
    TMP ~= s/$${LITERAL_HASH}include "(.*)"/\\1/g

    INC *= $$TMP
}

message($$INC)
--------------------------------------------------------------------------

1)for関数を使い、YACSOURCESを1つづつ処理
2)cat関数をlinesモードで実行してファイルの内容を任意の変数に保持
 (ここではTMPとしました)
3)find関数で、#includeの文字列を含む値の取得
4)~= を使った値の正規表現置き換え処理で、ファイル名のみに変換
     (#includeの後のスペース数が不定ならinclude\\s+などにしたほうが良いかも)
5)*= を使って重複しないファイル名だけ任意の変数(ここではINC)に追加

なお、find関数は変数名を対象として値を検索するため、残念ながら
上記のように余計な変数を経由する必要があります。

まぁ、より柔軟に操作したいというような場合は、先に処理用のツールを
コンパイルしてそれを呼び出す等の方が楽だと思うのですけどね。

以上、ご参考までに。

P.S.
もう一件のバグの方の質問は、今夜にでも確認しますので、もう少々お待ちください。


Qt-users メーリングリストの案内