일부 make 명령을 자동화하려고 합니다. 대상 외에도 make에 전달된 변수도 있습니다( #ifdef
코드의 a 집합에 해당).
make 명령은 다음과 같습니다.
make <target> <MYCDEF=val>
val
여러 값을 취할 수 있습니다.MYCDEF_VAL1,MYCDEF_VAL2...).
target
다음과 같이 여러 값을 취하는 것도 가능합니다.안드로이드 팔,windows_x86,linux_x64등.
이것MYCDEF_VALn에서 찾을 수 있습니다config.h
어디서 확인하지?
#elif (defined MYCDEF_VALn)
이렇게 하면 모든 것을 얻을 수 있어요MYCDEF값 사용gawk -f script1 config.h
스크립트 1:
{
if(/defined.*MYCDEF_/)
{
k=index($0, "MYCDEF_");
print substr($0, k, index($0, ")")-k) #all lines of type defined(MYC_DEF_VALn)
}
}
내가 읽을 수 있는 모든 목표를 얻으려면Makefile
사용gawk -F: -f script2 Makefile
스크립트 2:
{if(/^[A-Za-z0-9_]+:$/) print $1}
모두를 위해 만들어졌습니다.MYCDEF_하나의 vals 대상을 사용하여 첫 번째 스크립트의 출력을 파이프할 수 있습니다(다음을 사용).config.h
):
gawk -f script1 config.h | xargs -I {} -n 1 make -kj windows_x86 MYCDEF={}
마찬가지로 1을 가진 모든 대상에 대해MYCDEF_val, Makefile을 사용하여 두 번째 스크립트에서 파이프할 수 있습니다.
gawk -f script2 Makefile| xargs -I {} -n 1 make -kj {} MYCDEF=MYCDEF_VAL1
이제 우리는 다음 값을 모두 사용하여 빌드하려고 합니다.MYCDEF_모든 목표를 위해. 이는 for 루프를 사용하여 수행할 수 있습니다.
for i in $(gawk -f script2 Makefile)
do
gawk -f script1 config.h | xargs -I {} -n 1 make -kj $i MYCDEF={}
done
이에 대한 단일 라이너가 있습니까?
답변1
GNU 병렬 처리 사용:
parallel -j1 make -kj {1} MYCDEF={2} :::: <(gawk -f script2 Makefile) <(gawk -f script1 config.h)
-j1
GNU Parallel이 작업을 직렬로 실행하도록 강제합니다(실행 중인 명령이 주어지면 아마도 원하는 것일 것입니다 make
).