Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

이상한 코딩 나라의 혜돌이

[Linux] make 명령어에서 clean의 dependency list에 대한 의문 본문

Study/Troubleshooting

[Linux] make 명령어에서 clean의 dependency list에 대한 의문

혜돌이 2018. 9. 13. 12:02

make 명령은 makefile에 설정된 정보를 읽어서 여러 소스 파일을 컴파일하고 링크하여 최종 실행파일을 생성한다.

이를 통해 컴파일 작업을 자동화하며, 다중 모듈 프로그램의 재사용을 유지하고, 프로그램 수정에 대한 재번역을 최소화한다.

makefile을 작성하는 규칙은 다음과 같다


targetList :    dependencyList

[tab]        commandList


targetList : 목적 파일 목록

dependencyList : 의존 파일 목록

commandList : 명령어 목록



예를 들어 아래와 같은 makefile이 있다고 가정하자.


main : main.o reverse.o

gcc -o main main.o reverse.o

main.o : main.c reverse.h

gcc -c main.c

reverse.o : reverse.c reverse.h

gcc -c reverse.c


그러면 다음과 같은 의존성 트리가 생성된다



이 의존성 트리는 프로그램 수정에 대한 재번역의 최소화를 위한 것이다.

처음에 make 명령을 실행하면 다음과 같이 명령어를 실행한다.


gcc -c main.c

gcc -c reverse.c

gcc -o main main.o reverse.o


여기서 바로 이어서 make 명령을 실행해보면


make: `main' is up to date.


이 문구와 함께 아무 일도 일어나지 않는다.

여기서 main.c만 수정해보자.


gcc -c main.c

gcc -o main main.o reverse.o


그러면 위와 같이 main.c를 자식 또는 손자(?)로 가지고 있는 타겟에 대한 명령어만 다시 실행된다.



그런데 말입니다..

테스트를 하는 도중 이상한 것을 발견했다.


test : test1.o test2.o test3.o

gcc -o test test1.o test2.o test3.o

test1.o : test1.c my.h

gcc -c test1.c

test2.o : test2.c my.h

gcc -c test2.c

test3.o : test3.c my.h

gcc -c test3.c

clean : test1.c

rm *.o


위 코드가 내가 작성한 makefile이다.

clean의 dependencyList에 이것저것 넣어 봤는데, *.c 파일을 넣으니 이상한(?) 효과가 생겨버린것..


make를 하면 일반적인 make처럼 동작한다.


➜  make

gcc -c test1.c

gcc -c test2.c

gcc -c test3.c

gcc -o test test1.o test2.o test3.o

➜  make

make: `test' is up to date.


근데 make clean을 하면?


➜   make clean

rm *.o


처음엔 제대로 된다. 두번째는?


➜  make clean

rm *.o

rm: *.o: No such file or directory

make: *** [clean] Error 1


제대로 안 된다.

근데 제대로 안 되는게 문제가 아니다 지금.


왜 실행이 되는지가 문제......!!!!


분명 위에 애들은 자기 의존성 목록에 누군가가 수정이 되지 않으면 자기 명령어가 수행이 안 됐음..

근데 왜!!!!!!!

test1.c 수정 안 했는데!!!!!!!!!!!!!!!

왜 수행이 되냔 말임 .... ㅠㅠㅠㅠㅠㅠㅠㅠ



그래서 결국 해결을 못 하고 교수님께 질문을 하러 갔다.

돌아온 대답은 넘 싱거웠다..


"

그러게 왜 그렇게 되어있지..?

근데 원래 그렇게 안 써

보통 clean 뒤에는 비워놓지..


"


이렇게 싱겁게 끝나버린 ... 나의 의문점..


대체 ... 뭘까 ....... 언젠가 알게 되면 좋겠다...




++++++


알게 되었다!


다른 교수님께서, targetList, commandList의 이름?이 다르면 항상 실행되는것 같다고 말씀해주셨다.

신기한 make의 세계 ....

Comments