여러 프로세스의 파이프 입력

여러 프로세스의 파이프 입력

일부 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)

-j1GNU Parallel이 작업을 직렬로 실행하도록 강제합니다(실행 중인 명령이 주어지면 아마도 원하는 것일 것입니다 make).

관련 정보