Makefile에서 빌드를 완료하기 전에 파일 처리를 어떻게 시작합니까?

Makefile에서 빌드를 완료하기 전에 파일 처리를 어떻게 시작합니까?

저는 make자동화된 프로젝트를 사용하여 대량의 데이터를 생성한 다음 처리하고 있는데, 레시피는 다음과 같습니다.

processed-data: data
    data-processing-program $^ > $@

data:
    output-data > $@

나름 data의 레시피가 있기 때문에다양한 다른 대상도 이를 처리합니다..

프로그램 output-data이 잠시 동안 실행됩니다. 완료되면 data-processing-program제작을 시작하고 종료합니다 processed-data.

데이터 출력 후 처리

병렬로 실행하고 data완료되기 전에 파일로 스트리밍하면 분명히 속도가 더 빨라질 것입니다.data-processing-program

동시 출력 및 처리

에서 그러한 관계를 어떻게 표현합니까 Makefile?


내가 고려한 옵션:

  • 나는 노력했다여러 레시피를 병렬로 사용 --jobs/ 실행-j하지만 make종속 항목을 실행하기 전에 레시피가 완료될 때까지 기다립니다.

  • 이 작업을 수동으로 수행하면 파이프만 작성된다는 것을 확인했습니다.

    output-data | data-processing-program > processed-data
    

    데이터가 제공되는 즉시 처리됩니다.

    data나는 그것을 모방하기 위해 레시피 를 가지고 놀았습니다.명명된 파이프파일 대신 데이터를 쓰기 위한 백그라운드 프로세스를 생성합니다. 그러나 파이프라인의 데이터는 한 번만 읽을 수 있으므로 여러 레시피를 사용하여 동일한 데이터를 처리할 수 없습니다.

답변1

다음을 사용하여 tee출력의 한 복사본을 디스크에 저장하고 다른 복사본을 디스크에 공급할 수 있습니다 data-processing-program.

output-data | tee data | data-processing-program > processed-data

data이렇게 하면 makefile의 다른 대상에 대해 올바른 타임스탬프가 있는 복사본이 남습니다.

이 파이프라인을 종속성과 연결하는 방법은 여러 가지가 있으므로 귀하에게 적합한 방법을 선택하도록 하겠습니다. (아직 문제가 발생하지 않는 한 후속 조치를 취하세요.) 예를 들어 규칙이 두 가지를 모두 생성하므로 다음과 같이 data작성할 processed-data수 있습니다.

data processed-data:
    output-data | tee data | data-processing-program > processed-data

관련 정보