2010-11-20 9 views
1

변수 세트를 반복하고 현재 반복 값에 따라 한 줄씩 소스 파일을 편집 한 다음 다시 작성하고 마지막으로 호출 한 쉘 스크립트를 작성하고 있습니다. 컴파일 된 바이너리. 실행 후 이전 행이 복원됩니다. 기본적으로 나는 C++ 소스 파일에 #define 약 10 상호 배타적이, 나는 각각의 효과를 실험하고 있습니다bash 스크립트에서 make를 호출 할 수 없습니다.

#!/bin/sh 
for i in 0..4; do 
    perl -i -pe "s/.*/{SUBS[$i]}/ if $. == ${LINE[$i]}" ${SOURCE} 
    make 
    ./bin/myTool 
    perl -i -pe "s/.*/\/\/{SUBS[$i]}/ if $. == ${LINE[$i]}" ${SOURCE} 
done 

: 여기

은 조각이다. 나는 게으르므로 자동화 된 프로세스로 만들고 싶습니다. 여기에 저는 붙어 있습니다. 내가 파일 모든 perl 명령 전후 diff로 시도, 지금

`make: Nothing to be done for 'all'` 

및 파일이 이런 이유를 알아낼 수 없습니다 ... 올바른 나타나지 않습니다

는 때때로 쉘이 말한다 발생 올바른 동작을시키는 방법.

아이디어가 있으십니까?

미리 감사드립니다.

+0

고정되어 있으며 실수는 완전히 내 것이 었습니다. 나는 sleep 명령어를 추가했는데 틀린 장소에 확실히 추가했다. 그냥 루프의 시작 부분에 놓는다. (답변에 올바르게 기술되어있다.) 모든 것이 잘되었다. 감사! – Daniele

+0

스크립트의 마지막 버전 : 잠자기하는 대신,'touch -t 1010101010 $ {SOURCE} $ {OBJECT}'... 더 적은 시간 낭비했습니다! :) – Daniele

답변

2

각 반복을 구분하기 위해 make가 너무 빨리 루핑하는 것 같습니다. 루프를 만들 때 제품을 제거하거나 루프 시작 또는 끝 부분에 2 초 지연을 추가하십시오.

+0

두 가지 방법을 모두 시도했지만 제대로 작동하지 않습니다. 먼저'touch $ {SOURCE}'를'make '바로 앞에 놓았지만 눈에 띄는 변화는 없었습니다. 'make clean & make '는 효과가있는 것 같지만 매번 다시 만들어야한다고 생각하고 싶지는 않습니다. 또한'.o' 만 삭제하려고했지만 아직 뉴스가 없습니다. 'sleep 3s'는 여전히 일을하지 않을 것입니다. 마치 각 줄이 자체 스레드에서 실행되는 것처럼 보이므로 비동기 동작 (오, 나는 성공하지 못하고 '기다려야했습니다')을 시도합니다. – Daniele

1

Make는 대상 타임 스탬프가 소스 타임 스탬프보다 작은 지 여부 만 확인합니다. 그것은 업데이트해야 할 것이 무엇인지를 알 수있는 유일한 방법입니다. 따라서 루프를 반복하는 데 1 초도 채 걸리지 않으면 make가 변경된 사항을 알 수 없습니다.

Ignacio Vazquez-Abrams가 지적한대로 각 반복 상단에서 정리하거나 지연을 추가 할 수 있습니다.

관련 문제