DEV SUPPORT:MAKE

구차니의 잡동사니 위키
이동: 둘러보기, 찾기

목차

manual


필요파일

make는 Makefile이나 makefile 파일을 필요로 하며

특정 파일을 이용하여 빌드하기 위해서는 -f 옵션을 주어 파일명을 명시하면 된다.

+-f file, --file=file, --makefile=FILE
Use file as a makefile.

문법

makefile에서의 명령 단위는 rule로 아래의 규칙을 따른다.

target : dependacy
    commnad

실제 예제

include config.mk
clean:
 rm -rf obj

all:
default:
 gcc hello.c -o obj


make 다음에 주어지는 명령어(target)는 Makefile 내에서 :를 통해 나타내며

다음 문장들(command/명령어)은 탭이나 스페이스로 하나씩 들어가 있어야 한다.

가장 상단의 target이 make명령을 인자 없이 주었을때 실행하게 되며, 위의 예제에서는 make만 실행하면 make clean이 수행된다.

@으로 시작되는 줄은 콘솔로 stderr만 출력되며 stdout은 콘솔로 출력되지 않는다. (silent mode)

변수는 하나의 값이 아닌 목록(리스트)을 가질 수 있다.

OBJS = a.o b.o

변수명:.o=.c 를 통해 목록 각각에 대해 문자열 치환이 가능하다

SRC = $(OBJ:.o=.c)

wildcard 함수를 통해 *.c 파일을 찾아서 넣어 줄수도있다.

SRC = $(wildcard *.c)
OBJ = $(SRC:.c=.o)

sort 함수를 통해 중복된 파일을 제거하는 용도로 사용될수도 있다.

매크로

  • $* 확장자가 없는 현재의 목표 파일(Target)
  • $@ 현재의 목표 파일(Target)
  • $< 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일 이름
  • $? 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일이름

병렬처리

병렬처리로 컴파일하기 위해서는

-j [jobs], --jobs[=jobs]
Specifies the number of jobs (commands) to run simultaneously. If there is more than one -j option, the last one is effective.
If the -j option is given without an argument, make will not limit the number of jobs that can run simultaneously.

-l [load], --load-average[=load]
Specifies that no new jobs (commands) should be started if there are others jobs running and the load average is at least load (a floating-point number). With no argument, removes a previous load limit.

-j 옵션을 주면된다.

단, 일반적인 시스템에서는 물리 코어 하나당 2~3 정도의 배율로 듀얼 코어라면 4정도를 쿼드코어라면 8 정도를 주는것이 적당하며

-j 옵션만 줄경우 최대 파일 open 갯수를 초과하여 에러가 날수도 있으며

과도한 File I/O로 인해 오히려 느려지거나, 다른 사람의 작업을 심각하게 영향을 줄 수 있으니 주의해야 한다.

그렇기에 -l 옵션을 통해 cpu 점유율에 따라 병렬 갯수를 자동으로 설정하는 것도 좋은 방법이다.


그리고 병렬빌드 시에는 makefile에서 의존성을 제대로 처리해주지 못할 경우 빌드에 필요한 다른 파일이 컴파일 되지 않아 빌드가 중단되고

두세번 make를 시도하여 되는 경우가 있으니 의존성을 해결하여 makefile을 생성해야 한다.


병렬빌드용 makefile

makefile에서 make 대신 $(MAKE) -C 를 사용하면 된다.

셸 확장을 통한 컬러링

/bin/sh로 되어 있으면 잘 되지 않으며 /bin/bash로 실행하면 문제 없이 색상이 지정된다.

$ cat test.sh
#!/bin/bash
echo -e '\E[47;34m'"\033[1mTest\033[0m"
# 흰바탕에 검은 글씨로 Test라고 출력됨

TIP

  • 가끔 원인 불명의 어셈블리 링크 에러가 발생하면 make clean 하고 다시 컴파일 한다.(오브젝트 파일이 섞이면서 발생하기도 함)
  • make -f makefile.linux 식으로 Makefile 혹은 makefile이 없더라도 특정 파일로 make 할 수 있다.
  • 변경된 시간 기준으로 필요한 파일만 컴파일 하기 때문에 서버 및 파일의 시간이 민감하게 반응한다.
  • MAKE[1]: WARNING: CLOCK SKEW DETECTED. YOUR BUILD MAY BE INCOMPLETE. 에러가 발생시
    • find . -type f | xargs -n 5 touch
    • 위의 명령으로 시간을 전부 현재 시간으로 수정해 줄 수 있다.


include config.mk

all:

clean:

skew:
	find . -type f | xargs -n 5 touch

build framework

  • release mode
    • gprof
    • strip
  • debug mode
    • gprof
    • gcov
    • cppcheck
    • macro processed source (gcc -E)
    • assembly source (gcc -S)


  • gprof (profiling)
$ g++ -pg sourcefile.c -o executablefile
& gprof executablefile
  • gcov (coverage check)
$ g++ --coverage sourcefile.c
$ gcov sourcefile.c
  • cppcheck (static analysis)
$ cppcheck sourcefile.c
개인 도구
이름공간

변수
행위
둘러보기
도구모음