프로그램에 빌드 타임 기록하기

Posted at 2008/08/08 16:25 // in Programming // by Daniel


리눅스 계열의 경우 동작합니다.
make할 때마다 빌드시각을 version.c 파일을 생성해서 저장하고 그 파일에 있는 함수를 참조하게 해서 씁니다.

.PHONY:version clean

LD=gcc

test: test.o version.o
 ${LD} version.o test.o -o test


version.o:version.c version

version:
 @echo Making version information
 @echo -n 'const char* myversion(void) { const char* Build_Info  = "' > version.c
 @echo -n `date` >> version.c
 @echo '"; return Build_Info; }' >> version.c

clean:
 rm -f test test.o version.o

Makefile은 위와 같습니다.
version을 phony 타겟으로 지정해서 타겟에 상관없이 매번 생성케 했고
version.o가 version 타겟을 받으므로
test <- test.o, version.o <- version
의 빌드 의존성이 생겨서 최종바이너리인 test를 만들기 위해선 매번 version을 갱신하게 됩니다.
make version 하면
version.c 에 다음과 같이 써지게 됩니다.

const char* myversion(void) { const char* Build_Info  = "Fri Aug 8 16:19:58 KST 2008"; return Build_Info; }

test.c에 const char* myversion(void);로 선언해놓고 쓰면 됩니다.
예를 들어 다음과 같이

/* test.c */
#include <stdio.h>

const char* myversion(void);

int main()
{
    printf("version: %s\n", myversion());
    return 0;
}

테스트해보면 다음과 같이 됩니다.

[danielsong@raffaello test]$ make
cc    -c -o test.o test.c
Making version information
cc    -c -o version.o version.c
gcc version.o test.o -o test
[danielsong@raffaello test]$ ./test
version: Fri Aug 8 16:24:33 KST 2008

빌드한 시간이 찍히는 걸 볼 수 있습니다.


 




 

크리에이티브 커먼즈 라이센스
Creative Commons License

Makefile에서 if 문 쓰기 - ifeq

Posted at 2008/03/19 09:56 // in Tips/Utility programs // by Daniel
Makefile 작성하다보면 if를 써서 조건빌드나 특정 조건에서 변수 값을 다르게 하고 싶을 때가 있습니다.

ifeq를 쓰면 됩니다.

예를 들어 OS가 unix이냐 linux이냐에 따라 C compiler의 이름을 cc와 gcc로 구별하고 싶을 때는

OS=`uname -s`
ifeq ($(OS),Linux)
CC=gcc
CFLAGS = -Wall -m32 -I .
else
CC=gcc
CFLAGS = -w 0 -I .
endif

이와 같이 쓰면 동작합니다.
크리에이티브 커먼즈 라이센스
Creative Commons License