여러 작업 (-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
내가 정확히 질문이 무엇인지 ... 나는 철저하게 하나보다 병렬 정확성을 검증하기위한 더 좋은 방법이 있다고 생각하지 않습니다 모르겠어요 각 대상에 대한 빌드를 실행하고 작동하는지 확인하십시오. 나는 빌드를'-j1'로 제한해야한다고 생각하지 않는다. '-j1'에서 실패 할 경우,'-j'에서도 실패 할 것이므로 빌드 속도를 높일 수 있습니다. – MadScientist
더 큰 프로젝트에서는 어떻게 이런 일이 일어날까요? 실용적인 방법으로 또는 수동 호출 관점의 실행/어려움에서 시간이 지나면 실패합니까? –
'-j1' 마스크는 강제로 많은 사전 요구 사항을 강제로 생각합니다. prereqs가 나열된 순서대로 작성되었다고 가정하면'prereqA'는'prereqA'가'prereqB'에 의존하고'-j1'은 실패하지만'-jN'은 통과 할 수 있다고 선언하지 않는'target : prereqA prereqB'를 가정합니다. 그 전제 조건 ('prereqB prereqA')과'-j1'의 순서를 뒤집어 쓰는 것은 결코 실패하지 않지만'-jN'이 가능할 수도 있습니다 (그러나 확실하게 prereq 명령을 모호하게해야 할 수도 있습니다). –