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. もう一件のバグの方の質問は、今夜にでも確認しますので、もう少々お待ちください。