문무겸비

[miniRT] Makefile, .configure, 쉡 스크립트 문법 본문

42seoul

[miniRT] Makefile, .configure, 쉡 스크립트 문법

세월의 잔잔한 느낌 2021. 2. 9. 18:14
반응형

매번 암호와 같던 Makefile과 쉡 문법을 이제는 한번 짚고 넘어가야겠다.

 

쉘 스크립트 작성 시, 가장 첫 라인에 #!/bin/bash를 쓰는 이유는, 스크립트 파일이 bash 쉘로 실행시킨다는 의미이다.

 

"for do done" trio

#!/bin/bash
for var in 1 2 3 4 5
do 
  echo var value :$var
done

결과

var value :1
var value :2
var value :3
var value :4
var value :5

python에서 봤던 for var in [~~~] 꼴이 보인다. python에서는 들여 쓰기로 실행 부분과 끝부분을 구분했는데, 쉘에서는 "do" 와 "done"으로 구분한다.

 

"if then else fi" quartet

if [ conditional expression ]
then
  list...
else
  list...
fi

기존 if 문이랑 별반 다를게 없는데, 역시, if 바로 밑에 실행 부분이 오는 게 아니라, "then"으로 구분해놨고, 끝부분도 "fi"라는 특이한 구문으로 되어있다. 처음에 이 fi를 보고 참 많이 당황스러웠다.

 

"/bin/echo  and   echo"

csh, ksh 등 많은 shell에서 built in 된 명령어를 가지고 있다. 일단 동작 결과는 '거의' 이상으로 동일하다고 한다.

차이가 없는 건 아니기 때문에 (혹은 조직 내 코딩 규정때문에) 

ECHO="/bin/echo"

이런식으로 사용하기도 한다. 어쨌든 나는 그냥 "echo"와 동치로 간주하려고 한다. 

 

echo는 도스, OS/2, 유닉스 및 유닉스 계열 운영 체제에서 문자열을 컴퓨터 터미널에 출력하는 명령어이다. 일반적으로 셸 스크립트와 배치 파일에서 화면이나 파일로 상황을 알리는 문자열을 출력할 때에 사용된다.

 

Shell script- reason for using bin/echo instead of echo?

I have a shell script from 2011, the purpose of which is to run on different unix systems. The script defines certain variables and I don't understand the logic behind it, I would like to know w...

stackoverflow.com

>와 »의 차이

Linux를 기반으로 한 환경에서

 

  • >: 명령어 뒤에 나오는 파일에 쓸 때 사용(=write or overwrite)

 

다음 아래 같이 사용하면 test.txt라는 파일이 없을 때는 생성하며 있다면 내용을 덮어쓰게 됩니다.

$ echo abcde > test.txt

 

  • >>: 명령어 뒤에 나오는 파일에 추가할 때 사용(=append)

 

다음 아래 같이 사용하면 test.txt라는 파일이 없을 때는 생성하며 있다면 test.txt 파일에 내용을 추가하게 됩니다.

$ echo abcde >> test.txt

$ echo abcde >> test.txt

 

"|" pipeline and "grep"

/bin/echo "DOCP=$conf_docp" >> test/Makefile.gen
cat test/Makefile.mk | grep -v %%%% >> test/Makefile.gen

"DOCP=$conf_docp" 를 test/Makeilfe.gen이라는 곳에 적겠다. 음 해석이 된다

 

"|" pipiline 연산자는, 왼쪽 함수(명령어)의 결과값을 오른쪽에 전달한다. 

cat은 설명하지 않겠다.  

 

cat ~ | grep -v %%%% 의 결과를 test/Makeilfe.gen이라는 곳에 적겠다. 조오금 어렵지만 정리해보겠다.

 

cat은 그냥 printf마냥 파일의 내용을 출력하는것이고 grep은 필터 역할을 한다. grep -v 라는 것은 뒤에 나오는 것을 제외하고 다 통과시키겠다는 말이다. 즉.

"%%%%"라는 text가 아마 .mk 파일에 있을테고, 그 부분은 .gen에 복사하지 않겠다는 의미가 된다.

 

 

Makefile .gen, .mk

minilibx-linux 안에는 Makefile 뿐만 아니라 Makefile.gen, Makefile.mk도 있다. 

 

INC =%%%%
HT =%%%%
DOCP =%%%%

Makefile.mk 상단부에는 위와 같이 변수가 선언되어있는데, .configure에서 위 변수들의 값을 받아와서 make를 하는 방식이다. 

 

즉 "make"-> Makefile -> .comfigure -> Makefile.mk -> Makefile.gen 으로 흐름이 이어지는데, Makeilfe.gen은 

INC=/usr/include
HT=x86_64
DOCP=do_cp

이런식으로 시스템에 따라 달라진 변수를 적용한 Makefile이 된다. 

Makefile은 그냥 .configure를 동작시키기 위한 역할일 뿐이지, 실제로 Makefile역할을 하는 파일은 .gen이다.

 

.configure는 .mk 파일을 바탕으로 아직 공란으로 남아있는 변수들을 설정하여 .gen 파일을 완전한 파일로 만들어준다.

 

.configure 마지막에는 다음과 같은 구문이 있는데,

make -f Makefile.gen all

여기서 -f 는 뒤이어 나올 파일을 Makefile 취급하겠다는 뜻이다.

반응형