2017-03-15 1 views
0

다른 매크로에서 인수를 취하는 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. 옵션을 사용하는 것이 비 직관적 인 것처럼 보이기 때문에 나는이 솔루션을 많이 좋아하지 않습니다.

원하는 효과를 얻는 데 바람직한 방법은 무엇입니까?

답변

1

더 멋진 해결책을 찾았습니다. 그것이 작동하는 이유를 이해하지 않고, 나는 그것이 일반적으로 적용 할 수 있는지 확실하지 않다 : 그것은 mkd%global로 정의하는 경우에만 작동

%define path() /mnt/%1/lib 
%global mkd() mkdir %{path %%1}/stuff 
%mkd usr 
=> mkdir /mnt/usr/lib/stuff 

. path%define 또는 %global으로 정의 할 수 있습니다. 또한 인용 된 백분율 문자를 노드로 묶으십시오.

+1

그것을 % global은 구문 분석 될 때 (% define으로)가 아니라 호출 될 때 평가되기 때문에 작동합니다. 기본적으로 %를 쓸 때마다 보통 % global을 사용하려고합니다. – msuchy

+0

@msuchy 그 반대의 경우입니다. '% define' 매크로는 사용될 때 평가되고'% global'이 정의되면 평가됩니다. 그것이 작동하는 이유입니다.'mkd'의 정의는'path'가 이미 확장되어 고정되어 있으므로 인수가 대체 될 때 재귀가 발생하지 않습니다. – matejcik

1

재귀 매크로의 RPM 처리가 중단되었습니다. 내가 알 수있는 한 "권장되는"방법은 없습니다. 이것은 단순히 작동하지 않으며 나열된 해결 방법은 얻을 수있는만큼 가까운 것입니다.

(RPM 자체에서 일부 포함) RPM 매크로 세트 내에서 이것은 일반적으로 조건 인수를 통해 해결됩니다. 제공된 경우 -p 옵션을 사용하고 그렇지 않은 경우 %1을 사용하십시오.

%define path(p:) /mnt/%{-p:%{-p*}}%{!-p:%1}/lib 
%define mkd(d:) mkdir %{path -p %1}/stuff 
echo "making path at %{path hello}" 
%{mkd hello} 

또한 "비 기능"정의를 사용할 수 있습니다 - 이것은 %define/%global 경우에 무슨 일이 일어나고 있는지의 일종이다.

%define _path /mnt/%1/lib 
# note no parentheses at end of `_path` 
%define path() %_path 
%define mkd() mkdir %{_path}/stuff 

이 방법은 %_path 매크로는 path()mkd() 정의에 인라인 않고 재귀가 발생하지 않습니다.

당신이 경로를 %2을 사용하기를 원한다면이 작동하지 않을 것입니다,하지만 다른 이름이기 때문에, 당신은 그것을 옛날 방식을 사용할 수 있습니다 ......... O_O

%define maketwo() mkdir %1; mkdir %{path %2}/stuff 
관련 문제