다른 매크로에서 인수를 취하는 RPM 매크로를 호출하려고합니다. m4
에서이 같이 사소 할 것 (다만 예를 들어, 내가 정말하고 싶지 않은 것을) :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에서 명백한 해당 (!
# 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