2017-12-20 9 views
0

bash는 스크립트의 실행 결과이다 Buildroot의 지역 변수를 정의하고 그 값에 NETMAP 패키지 빌드 디렉토리, /usr/local/buildroot/output/build/netmap-master입니다 .IT는 $(@D)로 리디렉션 할 수 있어야 BUILDDIR=$PWD 내 그렇지 않으면 객체 파일은 buildroot 루트 디렉토리로 출력됩니다. 어떻게 <code>BUILDDIR</code>라는 <code>netmap/LINUX/configure</code>의 지역 변수가있다

나는 NETMAP_CURRENT_BUILD라는 변수를 생성하고 /usr/local/buildroot/output/build/netmap-master, $(@D), 하자 다음 나는 BUILDDIR=/usr/local/buildroot/output/build/netmap-masterBUILDDIR=$PWD을 대체 싶어요. 다음과 같이 샘플 코드를 사용하여 수행 할 수 없습니다. 당신은 실제로이 필요하지 않습니다, 아래 참조

define NETMAP_BUILD_CMDS 
    NETMAP_CURRENT_DIR = $(sed -e 's/\//\\\//g' <<< "$(@D)") -- empty 
    echo "$$(sed -e 's/\//\\\//g' <<< "$(@D)")"    -- this line works fine 
... 
    sed -e 's/BUILDDIR=$$PWD/BUILDDIR=$(NETMAP_CURRENT_DIR)/g' -i $(@D)/LINUX/configure  
(double $$PWD, it has to be like this, which means string $PWD is needed rather than its value.) 
    ... 
     endef 
+0

변수에 슬래시가 포함되어 있으면 구분 기호로 슬래시를 사용하지 마십시오.나는 서브 쉘이'$ (@ D) "의 의미를 알기를 기대할 수 없다고 생각하지만 명령에서 작동한다면'...'을 실행 한 다음''sed ''를 시도하십시오 s % BUILDDIR = $$ – tripleee

+0

'$$ PWD'에 슬래쉬가 포함되어 있다면 (현재 일반적으로 그러 하듯이) 현재 접근법에서 슬래시를 이스케이프 처리해야합니다 , 너무. 위의 주석에서 슬래시를 이스케이프 할 필요가없는 구문으로 전환하는 방법도 있습니다. – tripleee

+0

답장을 보내 주셔서 감사합니다. 내 호스트 컴퓨터가 Gentoo 텍스트 모드 콘솔에 있으므로,'netmap.mk'을 붙여 넣을 수 없습니다. 죄송합니다. 서브 쉘은 실제로'netmap.mk' 내부에 있으므로,이 블록에서 쉘 스크립트를 실행할 수 있습니다. Buildroot 구문으로 인해,'$ PWD' 문자열을 내 표현식에 넣고 싶다면'$$ PWD'가되어야합니다. –

답변

0

샘플 코드 :(sed 부분) 단자 콘솔에서 괜찮 았는데. 그러나 make 변수에서 쉘 명령의 결과가 필요한 경우 $(shell ...)

이는 메이크 파일이므로 $는 쉘이 아닌 make으로 해석됩니다. 따라서 make은 변수 이름으로 을 평가하려고합니다. 물론 그 이름에는 변수가 없으므로 빈 문자열을 얻습니다.

make가 쉘 명령을 실행하고 그 결과를 make 변수에 저장하려면 $ (shell ...) 함수를 사용하십시오. 그래서 NETMAP_BUILD_CMDS의 내용이 쉘 스크립트는 사실에 때문이의 NETMAP_BUILD_CMDS의 외부 을 수행해야한다는

NETMAP_CURRENT_DIR = $(shell sed -e 's/\//\\\//g' <<< "$(@D)") 

참고 : 첫 번째 make 다음, 해당 스크립트에있는 모든 변수를 확장 쉘은 줄에 전달 한 줄씩. 쉘은 = 주위에 공백이 있으므로 위의 명령문에서 실제로 오류가 발생하므로 NETMAP_CURRENT_DIR이 명령 이름으로 해석됩니다.

당신이 쉘 변수보다는 make 변수에 결과를 저장하려면

후 가장 쉬운 해결책은 $(...) 대신 명령을 구분하는 역 따옴표를 `...`을 사용하는 것입니다

define NETMAP_BUILD_CMDS 
     NETMAP_CURRENT_DIR=`sed -e 's/\//\\\//g' <<< "$(@D)"`; \ 
     sed -e 's/BUILDDIR=$$PWD/BUILDDIR=$$NETMAP_CURRENT_DIR/g' -i $(@D)/LINUX/configure 
endef 

그러나, 당신의 당신이 전혀 필요하지 않은 경우.

우선 make에서 직접 간단한 대체를 할 수 있습니다.

sed -e '[email protected][email protected]=$(@D)@g' -i $(@D)/LINUX/configure 

마지막으로 참고 :

NETMAP_CURRENT_DIR = $(subst /,\/,$(@D)) 

더 나은, 당신은 단순히 당신의 sed 표현에 /는 다른 구분 기호를 사용하여 다음을 인용 할 필요가 없다 이런 식으로 코드를 수정 NETMAP_POST_PATCH_HOOKS에서 NETMAP_BUILD_CMDS보다 더 잘 수행됩니다. 결국 가장 좋은 해결책은 다음과 같습니다.

define NETMAP_FIX_BUILDDIR 
     sed -e '[email protected][email protected]=$(@D)@g' -i $(@D)/LINUX/configure 
endef 
NETMAP_POST_PATCH_HOOKS += NETMAP_FIX_BUILDDIR 
+0

고마워요! 사실, 대신 구성 패치를 사용했습니다. Netmap은 훌륭한 패키지이지만 configure는 크로스 컴파일과 같은 모든 목적을위한 것은 아닙니다. –

관련 문제