LCTHW-Excercise 2:Python 만들기
파이썬에서는 그저 python을 치고 내가 실행하고자 하는 코드를 넣으면, 파이썬 인터프리터가 필요한 라이브러리 등도 임포트해서 실행해줍니다. 하지만 C는.. 완전히 다르죠. C 프로그램을 실행하려면 소스를 컴파일을 해서, 하나의 바이너리로 만들어야만 합니다. 무척.. 고통스러운 과정이지만 지난 시간에 이미 make를 활용해서 해봤었죠!
이번 시간에는, C를 배우는 데 있어 GNU make를 어떻게 사용할 것인지 다룰겁니다. 남은 시간에는 당신만의 파이썬을 만들면 됩니다. 파이썬이 해주는 것 처럼, 빌드도 해주고 테스트도 돌려주고 필요한 모든 것들을 준비해주는 것이죠.
단지.. Makefile을 이용해서 당신의 C프로그램이 실행되는 데 필요한 모든 귀찮은 것들을 어떻게 대신할 수 있는지 보여드릴게요. 실제로 해보진 않겠지만, 잠시 아가Makefile을 사용하다 보면 'master make'도 보시게 될겁니다.
우선 첫 걸음은, 이미 어떻게 빌드할 것인지 알고 있는 프로그램을 make로 빌드해 보는 겁니다. Make는 이미 여러가지 파일들을 어떻게 빌드할 것인지에 대해 수십년간 공부해왔습니다. 당신은 아마 이전에 이 예제를 해봤을 거에요:
$ make ex1 # or this one too $ CFLAGS="-Wall" make ex1
첫 번째 라인에서 우리는 "ex1이라는 파일을 만들고 싶어"라고 Make에게 알려줍니다. 그러고 나면 Make는 이렇게 하겠죠.
없다면, 좋아. ex1으로 시작하는 파일은?!
오오 ex1.c 발견. 그럼 우리 .c파일 빌드할수 있나?
ㅇㅇ. cc ex1.c 0o ex1으로 빌드 가능함
아까 봤던 command에서 두번째 라인은 make에게 "modifiers"를 알려주는 역할을 합니다. 혹시 Unix shell에 익숙하지 않다면 이걸 아예 환경변수(environment variables)로 만들어서 실행하는 프로그램들이 사용할 수 있게 할 수도 있습니다. 어떤 shell을 사용하느냐에 따라 다르겠지만, 보통 export CFLAGS="-Wall"로 환경변수 설정이 될겁니다. 반대로 프로그램 실행 시에만 해당 modifiers를 넣어주고자 한다면, 실행하고자 하는 명령어 앞에 붙여주기만 하면 됩니다.
우리는 CFLAGS="-Wall" make ex1으로 make가 .c를 빌드하기 위해 사용하는 cc에게 -Wall옵션을 넘겨주었습니다. 이 옵션은 모든 warning을 볼 수 있게 해줍니다.
가볍게 make 커맨드만 사용할 수도 있지만 Makefile을 만들어서 make에 대해 좀 더 알아보도록 하죠. 아래 내용이 들어간 파일부터 만들어봅시다.
CFLAGS=-Wall -g clean: rm -f ex1
이걸 현재 디렉토리에 Makefile이라는 이름으로 저장해보죠. Make는 Makefile이라고 불리는 파일을 알아서 찾아서 실행시킵니다. 그리고..TAB키만 사용하세요. 그냥 공백은 안됩니다.
위의 Makefile에서 우린 몇가지를 생각해볼 수 있습니다. 먼저 CFLAGS를 설정했기 때문에 다시 설정해주지 않아도 됩니다. 그리고 -g 옵션을 활용해서 디버깅 가능하게도 했죠. 그리고 clean이라는 섹션을 만들어서 우리의 작은 프로젝트를 어떻게 clean할 것인지 알려주었습니다.
반드시 ex1.c가 있는 디렉토리에 만들고 다음을 실행해봅시다.
만약 제대로 동작한다면 다음과 같은 결과가 보일 겁니다.
$ make clean rm -f ex1 $ make ex1 cc -Wall -g ex1.c -o ex1 ex1.c: In function 'main': ex1.c:3: warning: implicit declaration of function 'puts' $
여기서 make clean 명령어는 우리가 clean 섹션에 적어둔 명령어를 실행합니다. Makefile을 다시 열어보면, 해당 섹션에 제가 실행하고싶은 쉘 커맨드들이 나열되어 있는 것을 볼 수 있습니다. make는 쿨한 자동화 도구에요. 실행시키고 싶은 것들, 다 넣어보세요.
만약에 ex1.c 을 고쳐서 #include <stdio.h> 를 추가했다면 출력 화면에 warning은 없을 겁니다. (만약 있다면 그건 그냥 진짜 에러일겁니다.) 위의 결과는 수정하지 않은 화면이니 참고하세요.
그리고.. ex1이라고 Makefile에 명시하지 않았다는 사실을 기억하세요. 그래도 make는 우리가 원했던 설정대로 빌드해줍니다.
자, 이제 시작하기엔 충분한 것 같군요. 그래도 몇가지 break을 통해서 make file에 어떤 일이 생기는지 알아봅시다. rm -f ex1의 인덴트를 없애볼까요?(맨 앞으로 당겨보죠) 그러면 어떻게 되나요? make clean을 실행하면 아마 이렇게 보일겁니다.
$ make clean Makefile:4: *** missing separator. Stop.
indent에 유의하세요. 만약 이상한 에러를 만난다면 정말 'tab'만 사용했는지 다시 한 번 확인해보세요.
all 섹션을 만들어 봅시다.: make를 활용하면 ex1 타겟은 그저 ex1만 만들겠죠.
man make를 읽고 어떻게 활용할 수 있는지 더 찾아봅시다.
man cc를 읽고 -Wall과 -g 플래그가 어떤 의미인지 찾아봅시다.
Makefiles를 찾아보고 어떻게 업그레이드 할 수 있을지 생각해봅시다.
다른 C프로젝트에서 Makefile을 찾고 이것이 어떤 일을 하는지 이해해봅시다.