exit $$0 의 의미가 무엇인가요?(Makefile에서 shall script)

kjw7945의 이미지

다음과 같은 파일 내용이 있습니다.
파일은 Makefile입니다..

DIR = memo calendar main
OBJECTS = memo.o calendar.o main.o
TARGETS = diary

CFLAGS = -W -Wall -O2 -g

all : objs
    $(CC) $(CFLAGS) -o $(TARGETS) $(OBJECTS)

objs :
    @for dir in $(DIR); do make -C $$dir || exit $$?; done

clean :
    @for dir in $(DIR); do \
    make -C $$dir clean; \
    done
    rm -rf $(OBJECTS) $(TARGETS)

exit $$?가 없으면 작동이 안되는데요...
exit $$?의 의미가 무엇인지 잘 모르겠습니다...

어째서 exit가 없으면 작동이 안되는지요...
또 이상한건 exit $? 라고 작동이 됩니다...
$$?와 $?의 차이는 없는지요..? (쉘스크립트이기 때문에
두개 붙여야 되는걸로 알고 있습니다만..)

$$?의 의미는 쉘에게 프로그램이 반환하는 값으로 알고
있는데 달라를 하나만 써도 되고..
그것을 왜 exit하는지 그 의미가 무엇인지.....
잘 모르겠습니다..ㅠㅠ

kerz의 이미지

Makefile은 해석기가 make입니다.

make 문법에서 $(이름) 은 매크로를 치환하는 기능을 가지고있습니다. 그리고 $$ 는 $ 자체를 뜻합니다.

@for dir in $(DIR); do make -C $$dir || exit $$?; done

의 코드를 make가 먼저 해석하면

@for dir in memo calendar main; do make -C $dir || exit $?; done

이 되고.. 이제 이것을 쉘이 해석을 할것입니다.

보기 쉽게 정리하면..

for dir in "memo calendar main" 
do 
	make -C $dir || exit $? 
done

루프를 돌면서.. make -C $dir을 수행하고 참이 아니면 exit $? 를 수행하게 됩니다.

여기서의 $? 는 말씀하신것 처럼 '프로그램이 반환하는 값' 이 맞습니다. 일반적으로 0 이면 잘 수행 된 것입니다.

makc -C $dir 이 실패하면서 나온 반환값을 반환값으로 하면서 종료를 하는것 입니다.

그리고 한가지 참조하실것은 make에서의 $? 과 쉘스크립트에서의 $?는 의미가 다릅니다.

make에서 $?는 현재의 타겟 보다 최근에 갱신된 파일명을 뜻합니다.

여기서는 $$? 로 사용해서.. 쉘스크립트에서의 $? 로 사용되었습니다.

그럼.. 도움이 되었기를...

-----
늘 여유가 함께하길..

익명 사용자의 이미지

우선 답변 감사드립니다. 그런데 한가지 궁금한 점이 있는데요.

make -C $dir 이 실패하면서 나온 반환값을 반환값으로 하면서 종료를 하는것 입니다 꼭 반환값을 반환값으로 하면서 종료할 이유가 있나요

make clean부분을 보면 그곳에는 exit를 쓰지 않았는데도
잘 작동이 되는 반면에

objs 부분에는 exit를 써야만 Makefile이 잘 작동이 되거든요..

따라서 왜 꼭 써야 하는지가 잘 모르겠네요.....

익명 사용자의 이미지

그리고... || 부분은 참이 아니면 exit가 실행된다고 하셨는데

제가보기에는 or 같은데요.. not아니라요..

그런데 이부분이

이상하거든요.. 제가 || 의 기호의 의미를

잘못 해석하고 있는건가요?

doldori의 이미지

글쓴이 wrote:
make clean부분을 보면 그곳에는 exit를 쓰지 않았는데도
잘 작동이 되는 반면에

objs 부분에는 exit를 써야만 Makefile이 잘 작동이 되거든요..

따라서 왜 꼭 써야 하는지가 잘 모르겠네요.....


중간에 컴파일 에러가 난다든지 하는 이유로 make가 실패하면 다른 디렉토리로
옮겨가서 더 진행해봤자 의미가 없으니까 exit 하는 거죠. clean의 경우는
obj나 실행 파일을 지우는 거니까 상관없고요.
doldori의 이미지

글쓴이 wrote:
그리고... || 부분은 참이 아니면 exit가 실행된다고 하셨는데

제가보기에는 or 같은데요.. not아니라요..

그런데 이부분이

이상하거든요.. 제가 || 의 기호의 의미를

잘못 해석하고 있는건가요?


잘못 해석한 것은 아닙니다만 완전히 해석한 것도 아닙니다.
&&(and)나 ||(or)의 short circuit 메커니즘을 이용한 것이죠.
A || B 는 if (!A) B
A && B 는 if (A) B
와 같은 뜻입니다.
익명 사용자의 이미지

답변 정말 감사드립니다.

이제 감이 오네요..

이제 제게 남은건 short circuit mechanism을

공부하는 것이군요..감사합니다.

jeweljar의 이미지

short circuit 메커니즘:
* A || B 일때, A가 참이면 B는 evaluation할 필요가 없다.
* A && B 일때, A가 거짓이면 B는 evaluation할 필요가 없다.

따라서, short circuit 메커니즘을 적용하면
* A || B는 "if (!A) B;"
* A && B는 "if (A) B;"
와 같은 의미를 갖는다.