別のマクロから引数を取ってRPMマクロを呼びたいと思います。RPM:引数を持つ別のマクロの引数を持つマクロを呼び出す
define(`path', `/mnt/$1/lib')
define(`mkd', `mkdir path($1)/stuff')
mkd(`usr')
=> mkdir /mnt/usr/lib/stuff
それともCPP
構文で:
#define path(x) /mnt/x/lib
#define mkd(x) mkdir path(x)/stuff
mkd(usr)
=> mkdir /mnt/usr/lib/stuff
RPMで明らか同等(m4
では、これは自明この(ちょうど例ではなく、私は本当に何をしたいのか)のように行われます!)壊れて次のようになります。
# THIS IS BROKEN
%define path() /mnt/%1/lib
%define mkd() mkdir %{path %1}/stuff
%mkd usr
しかし、これはないを行います作業、RPMの印刷 "エラー:マクロ展開で再帰が多すぎます。これは、再帰マクロ宣言によって引き起こされた可能性があります。次のコードで作品 『"私はそれ作った
』:。私は、この不器用なコードはこれを行うための推奨方法だろうと信じてすることはできませんしかし
%define path() /mnt/%1/lib
%define mkd() mkdir %{expand:%%{path %1}}/stuff
%mkd usr
動作するように見える別のアプローチオプションの引数を使用している:
%define path(d:) /mnt/%{-d*}/lib
%define mkd(p:) mkdir %{path -d%{-p*}}/stuff
%mkd -p usr
しかし、これは私が異なるオプション文字を使用理由だけで動作します。私は両方のマクロは「-d
」を使用している場合、それはexamplのように失敗します上記のe。オプションを使うのはここでは直感的ではないようだから、私はこの解決策が大好きではありません。
希望する効果を得るには、どのような方法が良いでしょうか?
それを%globalは、(%defineとして)解析されたときではなく、呼び出された時点で評価されるためです。基本的に%を書くときは、いつも%globalを使いたいと思っています。 – msuchy
@msuchyそれは逆です。 '%define'マクロは使用すると評価され、定義されているときは'%global'が評価されます。そのため、これはうまくいきます: 'mkd'の定義は、既に展開された' path 'で凍結されるので、引数が代入されると再帰は起こりません。 – matejcik