리눅스 계열의 경우 동작합니다.
make할 때마다 빌드시각을 version.c 파일을 생성해서 저장하고 그 파일에 있는 함수를 참조하게 해서 씁니다.
.PHONY:version clean
LD=gcc
test: test.o version.o
${LD} version.o test.o -o test
version.o:version.c versionversion:
@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.cclean:
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
빌드한 시간이 찍히는 걸 볼 수 있습니다.