티스토리 뷰
임베디드 시스템 프로그램을 개발하다 보면 실제로 임베디드용 프로그램을 개발하는 머신과 빌드된 결과물이 동작되는 머신이 다름으로 인해서 생기는 문제가 가끔씩 발생한다.
새로운 기능을 추가하거나 발견된 오류를 수정해서 타겟 보드에 실행시켰는데 예상대로 동작하지 않는 경우가 있다. 그럴때에 코딩이 잘못되었다고 판단해서 아무리 이리저리 수정해도 전혀 개선되지 않아서 고생하는 경우가 있는데 결국 그 원인이 수정된 결과물 파일과 보드에 내린 파일이 달라서 그랬던걸 한참 뒤에서야 발견하게 되는 경우이다.
이번 글에서는 이런 문제를 조금이라도 줄여 볼 수 있는 방법에 대해서 알아본다.
#include <stdio.h>
#include <time.h>
int main(int argc, char** argv)
{
if (argc < 2)
{
printf("Usage: build_date <ver_file.c> [z]\n");
printf(" z : Reset build count to zero of ver_file.c\n");
return -1;
}
time_t cur_time = time(NULL);
char build_time[128];
strcpy(build_time, asctime(localtime(&cur_time)));
// remove new line character at the end of string
build_time[strlen(build_time)-1] = 0;
int build_count = 0;
char build_str[64];
FILE *fp = fopen(argv[1], "rt");
if (fp)
{
fgets(build_str, 64, fp);
fclose(fp);
sscanf(build_str, "/* Build [ %d ] */", &build_count);
if (argc == 3 && argv[2][0] == 'z')
build_count = 0;
else
++build_count;
}
if (!(fp = fopen(argv[1], "wt")))
{
printf("Couldn't write '%s'\n", argv[1]);
return -1;
}
fprintf(fp, "/* Build [ %d ] */\n", build_count);
fprintf(fp, "/* Do not modify this file. */\n\n");
fprintf(fp, "int build_count_g = %d;\n", build_count);
fprintf(fp, "char build_time_g[] = \"%s\";\n", build_time);
return 0;
}
먼저 위의 코드를 이용해서 실행파일을 만든다. 여기에서는 build_date.exe 파일로 만들었다고 가정한다.
위의 그림처럼 build_date를 실행할 때마다 version.c 파일의 build_count_g의 값이 1씩 증가되고 build_time_g의 내용은 build_date를 실행하는 순간의 날짜와 시간으로 업데이트 되는것을 볼 수 있다. 이 방법을 이용하면 타겟 보드용 프로젝트를 빌드할때마다 그 순간으로 업데이트 된 정보를 이용할 수 있게 된다.
제대로 동작되는지 간단한 윈도우 콘솔 프로그램 프로젝트를 이용해서 확인해 보도록 하겠다.
BUILD_DIR := build
all: ${BUILD_DIR}
${BUILD_DIR}: cmake
@build_date version.c
cmake --build ${BUILD_DIR}
@head -n 1 version.c
cmake: ${BUILD_DIR}/Makefile
${BUILD_DIR}/Makefile:
@cmake -B${BUILD_DIR}
clean:
@rm -rf ${BUILD_DIR}
@echo "Delete ${BUILD_DIR} directory"
.PHONY: all ${BUILD_DIR} cmake clean
위와 같이 Makefile을 만든다.
자세히 보면 cmake --build ${BUILD_DIR} 전후로 build_date를 실행하고 새로 업데이트된 내용을 출력하는것을 볼 수 있다.
#include <stdio.h>
#define MAJOR_VER 3
#define MINOR_VER 15
extern int build_count_g;
extern char build_time_g[];
int main()
{
printf("Hello Program: [ %d.%d.%d ] - %s\n",
MAJOR_VER, MINOR_VER, build_count_g, build_time_g);
return 0;
}
위의 코드에서 build_date에 만들어진 변수를 extern으로 불러 들여 출력하도록 만들었다.
make 명령으로 프로젝트를 빌드한 다음 만들어진 파일을 실행했을때 자동으로 빌드 정보가 업데이트가 되는것을 볼 수 있다.
'실전' 카테고리의 다른 글
템플릿 코드 생성 프로그램 (0) | 2024.06.07 |
---|---|
cmake를 이용한 AVR 개발 환경 (0) | 2024.05.28 |