2014-09-23 3 views
5

여러 작업 (-jN, N> 1)을 사용하여 프로젝트를 컴파일 할 때 나타나는 누락 된 종속성을 테스트하는 방법이 있습니까?Makefile에서 누락 된 종속성을 테스트하는 방법은 무엇입니까?

내가 종종 -0, -j1 또는 -jN을 사용하는 한 빌드 프로세스가 잘 작동하는 패키지가 대부분 오픈 소스입니다. N은 4 또는 8과 같이 비교적 낮은 값이지만, 더 높은 값을 사용하면 48 , 조금 드문 일이지만 의존성이 없어서 실패하기 시작합니다.

목표를 가지고 모든 종속성을 파악하고 -j1을 사용하여 종속성을 명시 적으로 빌드하려고 시도하는 bash 스크립트를 빌드하려고 시도했습니다. 종속성 자체가 없음을 검증하지 않습니다. 중소형 패키지에서 작동하지만 uClibc와 같이 더 중요한 패키지에서는 실패합니다.

일부 사람들은 코드를 읽음으로써 더 잘 이해할 수 있기 때문에 여기에서 내 스크립트를 공유하고 있습니다. 또한보다 강력한 솔루션이 존재하고 다시 공유 될 수 있기를 바랍니다.

#!/bin/bash 
TARGETS=$* 
echo "TARGETS=$TARGETS" 

for target in $TARGETS 
do 
    MAKE="make" 
    RULE=`make -j1 -n -p | grep "^$target:"` 
    if [ -z "$RULE" ]; then 
     continue 
    fi 

    NEWTARGETS=${RULE#* } 
    if [ -z "$NEWTARGETS" ]; then 
     continue 
    fi 

    if [ "${NEWTARGETS}" = "${RULE}" ]; then 
     # leaf target, we do not want to test. 
     continue 
    fi 

    echo "RULE=$RULE" 
# echo "NEWTARGETS=$NEWTARGETS" 
    $0 $NEWTARGETS 
    if [ $? -ne 0 ]; then 
     exit 1 
    fi 

    echo "Testing target $target" 
    make clean && make -j1 $target 
    if [ $? -ne 0 ]; then 
     echo "Make parallel will fail with target $target" 
     exit 1 
    fi 
done 
+2

내가 정확히 질문이 무엇인지 ... 나는 철저하게 하나보다 병렬 정확성을 검증하기위한 더 좋은 방법이 있다고 생각하지 않습니다 모르겠어요 각 대상에 대한 빌드를 실행하고 작동하는지 확인하십시오. 나는 빌드를'-j1'로 제한해야한다고 생각하지 않는다. '-j1'에서 실패 할 경우,'-j'에서도 실패 할 것이므로 빌드 속도를 높일 수 있습니다. – MadScientist

+0

더 큰 프로젝트에서는 어떻게 이런 일이 일어날까요? 실용적인 방법으로 또는 수동 호출 관점의 실행/어려움에서 시간이 지나면 실패합니까? –

+0

'-j1' 마스크는 강제로 많은 사전 요구 사항을 강제로 생각합니다. prereqs가 나열된 순서대로 작성되었다고 가정하면'prereqA'는'prereqA'가'prereqB'에 의존하고'-j1'은 실패하지만'-jN'은 통과 할 수 있다고 선언하지 않는'target : prereqA prereqB'를 가정합니다. 그 전제 조건 ('prereqB prereqA')과'-j1'의 순서를 뒤집어 쓰는 것은 결코 실패하지 않지만'-jN'이 가능할 수도 있습니다 (그러나 확실하게 prereq 명령을 모호하게해야 할 수도 있습니다). –

답변

1

나는 어떤 오픈 소스 솔루션의 인식 아니에요, 그러나 이것은 해결하기 위해 만들어졌습니다 ElectricAccelerator는, GNU의 고성능 구현을 만드는 것이 바로 문제입니다. 병렬로 빌드를 실행하고 누락 된 종속성을 동적으로 감지하여 수정하므로 빌드 출력이 순차적으로 실행 된 경우와 동일합니다. 누락 된 종속성에 대한 세부 정보가 포함 된 주석이 달린 빌드 로그를 생성 할 수 있습니다.

all: abc def 

abc: 
     echo PASS > abc 

def: 
     cat abc 

대신 gmake가의 emake 실행 이것 --emake-annodetail=history를 사용하고, 생성 된 주석 파일이 포함한다 : 특히

<job id="Jf42015c0" thread="f4bfeb40" start="5" end="6" type="rule" name="def" file="Makefile" line="6" neededby="Jf42015f8"> 
<command line="7"> 
<argv>cat abc</argv> 
<output>cat abc 
</output> 
<output src="prog">PASS 
</output> 
</command> 
<depList> 
<dep writejob="Jf4201588" file="/tmp/foo/abc"/> 
</depList> 
<timing invoked="0.356803" completed="0.362634" node="chester-1"/> 
</job> 

예를 들어, 간단한 메이크 미표시 abcdef간에 종속성이 <depList> 섹션에서는이 작업이 인 작업 (즉, def)에 따라 다릅니다 (/tmp/foo/abc 파일을 수정했기 때문).

ElectricAccelerator Huddle으로 무료로 사용해 볼 수 있습니다.

(면책 조항 : 나는 ElectricAccelerator의 건축가 해요)

+0

예, 두 번째입니다. ElectricAccelerator는 여러 대규모 기업 소프트웨어 환경에서 개인적인 경험을 쌓았습니다. 얇게 썬 빵부터 내가 제일 염려하는 것 중에 가장 좋은 것입니다. 면책 조항 : 전 직원이 아니거나 ElectricCloud에 연결되어 있지 않습니다. –

관련 문제