"Tricore Command 빌드환경 구축 가이드"의 두 판 사이의 차이
101번째 줄: | 101번째 줄: | ||
<p><img src="/data/wiki/2015-12-29/1451346814.png" alt="" /></p> | <p><img src="/data/wiki/2015-12-29/1451346814.png" alt="" /></p> | ||
<h3>Makefile 작성 포맷</h3> | <h3>Makefile 작성 포맷</h3> | ||
− | <p> | + | <p> </p> |
<p><strong>CC = cctc </strong><- compiler, linker, assembler를 사용위한control program<strong> </strong></p> | <p><strong>CC = cctc </strong><- compiler, linker, assembler를 사용위한control program<strong> </strong></p> | ||
<p><strong>PROJ = </strong><- Project의 이름을 정의한다.<strong> </strong></p> | <p><strong>PROJ = </strong><- Project의 이름을 정의한다.<strong> </strong></p> | ||
121번째 줄: | 121번째 줄: | ||
<p><strong>clean :</strong></p> | <p><strong>clean :</strong></p> | ||
<p><strong>rm -rf $(OBJS) $(TARGET) </strong><- -rf명령은 디렉토리가 비어있지 않아도 강제 삭제시 사용<strong> </strong></p> | <p><strong>rm -rf $(OBJS) $(TARGET) </strong><- -rf명령은 디렉토리가 비어있지 않아도 강제 삭제시 사용<strong> </strong></p> | ||
− | <p> | + | <p> </p> |
<p>Makefile은 <strong>매크로 정의 부분</strong>과 <strong>명령어 정의 부분</strong>으로 나누어져 있다. 위 예제에서 매크로 정의 부분은 “TARGET=” 까지이며, 나머지는 명령어 정의 부분이다. 정의된 매크로는 명령어 정의 부분에서 $(MACRO이름)을 이용하여 사용 가능하다.</p> | <p>Makefile은 <strong>매크로 정의 부분</strong>과 <strong>명령어 정의 부분</strong>으로 나누어져 있다. 위 예제에서 매크로 정의 부분은 “TARGET=” 까지이며, 나머지는 명령어 정의 부분이다. 정의된 매크로는 명령어 정의 부분에서 $(MACRO이름)을 이용하여 사용 가능하다.</p> | ||
<h3>Makefile 작성 실습 Ex1 (Makefile_ex1)</h3> | <h3>Makefile 작성 실습 Ex1 (Makefile_ex1)</h3> | ||
<p> 1. Makefile_ex1 이름의 Tasking 컴파일러 프로젝트 작성<br /> 2. makefile_ex1.c, src1.c, src2.c 소스파일 2개 생성.<br /> 3. 각 소스파일에 간단한 코드 작성<br /> 4. 아래와 같이 Makefile작성</p> | <p> 1. Makefile_ex1 이름의 Tasking 컴파일러 프로젝트 작성<br /> 2. makefile_ex1.c, src1.c, src2.c 소스파일 2개 생성.<br /> 3. 각 소스파일에 간단한 코드 작성<br /> 4. 아래와 같이 Makefile작성</p> | ||
<ol> </ol> | <ol> </ol> | ||
− | <p> | + | <p> </p> |
<p><img src="/data/wiki/2015-12-29/1451346850.png" alt="" /></p> | <p><img src="/data/wiki/2015-12-29/1451346850.png" alt="" /></p> | ||
− | |||
<p> 5. cmd 창을 현재 프로젝트의 경로에 복사 후 실행</p> | <p> 5. cmd 창을 현재 프로젝트의 경로에 복사 후 실행</p> | ||
<p> 6. mktc makefile all 커맨드 입력 후 컴파일 결과(.o .elf파일 생성) 확인</p> | <p> 6. mktc makefile all 커맨드 입력 후 컴파일 결과(.o .elf파일 생성) 확인</p> | ||
135번째 줄: | 134번째 줄: | ||
<p> 1. 실습 1에서 작성한 프로젝트를 makefile_ex2로 복사<br /> 2. Makefile을 아래와 같이 수정</p> | <p> 1. 실습 1에서 작성한 프로젝트를 makefile_ex2로 복사<br /> 2. Makefile을 아래와 같이 수정</p> | ||
<ol> </ol> | <ol> </ol> | ||
− | |||
<p><img src="/data/wiki/2015-12-29/1451346905.png" alt="" /></p> | <p><img src="/data/wiki/2015-12-29/1451346905.png" alt="" /></p> | ||
− | |||
<p> 3. 기존에 생성되있는 *.o, *.elf파일을 모두 지우고cmd창에 mktc makefile all 커맨드 입력 후 컴파일 결과(.o .elf파일 생성) 확인</p> | <p> 3. 기존에 생성되있는 *.o, *.elf파일을 모두 지우고cmd창에 mktc makefile all 커맨드 입력 후 컴파일 결과(.o .elf파일 생성) 확인</p> | ||
<p>실습1과 실습2의 예제는 동일한 결과물을 출력해낸다. 다만 실습2의 예제에서는 makefile 작성시 매크로 선언 구문을 이용하였기에 소스파일이나 object파일을 관리하기가 더 수월하다.</p> | <p>실습1과 실습2의 예제는 동일한 결과물을 출력해낸다. 다만 실습2의 예제에서는 makefile 작성시 매크로 선언 구문을 이용하였기에 소스파일이나 object파일을 관리하기가 더 수월하다.</p> |
2015년 12월 29일 (화) 09:17 판
Introduction
문서 소개
이 문서는 TASKING Compiler 사용시 Eclipse IDE환경 대신 커맨드 환경에서 makefile을 이용한 컴파일 방법을 Guide 한다.
C166 예제 다운로드
Tricore 예제 다운로드
문서 제작에 사용된 환경은 다음과 같다.
- Compiler : TASKING VX-toolset Tricore v4.2r2
- TRACE32 POWER DEBUG USB2 Module
- Tricore JTAG Debugger
- PowerView v.2013.02
- TC275TE-Bstep Reference Board
이 문서를 통해서 다음 내용을 배울 수 있다.
- Makefile 개념
- Makefile 작성 및 사용방법
- 커맨드 빌드 환경 구축 위한 기타 방법
Makefile 이란?
Makefile은 Make Utility를 사용하여 일종의 macro와 같이 자동적으로 결과 파일을 만들기 위해 쓸 수 있다. 이 파일 안에는 결과 파일을 생성하기 위한 파일들간의 관계, 명령어 등이 기술되어 있다.
Makefile 개요
이번 장을 통해서 다음과 같은 내용을 이해할 수 있다.
- Makefile 사용 위한 환경설정 - Makefile의 내부 구조 - Makefile 동작 원리 - Make Utility mktc - Makefile 작성 포맷 - Makefile 작성 실습 Ex1, Ex2 |
Makefile 사용 위한 환경설정
Tasking 컴파일러에서 제공하는 Make Utility를 모든 경로에서 사용 가능하도록 하려면 아래와 같이 환경변수를 등록해야 한다.
시스템 변수의 Path를 더블클릭 -> 변수값의 마지막에 semicolon(;)을 삽입
-> C:\Program Files (x86)\TASKING\TriCore v4.2r2\ctc\bin 추가.
Makefile의 내부 구조
Makefile은 기본적으로 목표(target), 의존 관계(dependency), 명령(command)의 세개로 이루어진 기본 규칙들이 계속적으로 나열되어 있다.
target ... : dependency ... command ... |
명령(command)부분에 정의된 명령들은 의존관계(dependdency)부분에 정의된 파일의 내용이 바뀌었거나, 목표 부분에 해당하는 파일이 없을 때 이곳에 정의된 것들이 차례대로 실행이 된다.
목표(target) 부분에는 결과 파일만 올 수 있는 것은 아니고, 보통 mktc makefile clean과 같이 간단한 레이블(lable) 기능을 제공하기도 한다.
명령(command) 부분은 반드시 TAB을 입력한 후 사용해야 한다. Make Utility는 명령어인지의 유무를 TAB으로 구별하기 때문이다. 그냥 빈칸을 입력하면 에러가 발생한다.
Makefile 동작 원리
all : Makefile_ex1.elf Makefile_ex1.elf : Makefile_ex1.o src1.o src2.o cctc -o Makefile_ex1.elf Makefile_ex1.o src1.o src2.o Makefile_ex1.o : Makefile_ex1.c cctc -c Makefile_ex1.c src1.o : src1.c cctc -c src1.c src2.o: src2.c cctc -c src2.c |
첫번째 target인 all은 Makefile_ex1.elf dependency를 가진 target을 찾는다. Makefile_ex1.elf: 으로 시작되는 레이블을 찾아가게 되면 Makefile_ex1.elf : Makefile_ex1.o src1.o src2.o라는 정보가 있다. Makefile_ex1.elf 라는 파일이 생성되기 위해서는 Makefile_ex1.o src1.o src2.o 가 필요하고 만약 이 *.o 파일들이 만들어져 있다면 cctc -o Makefile_ex1.elf Makefile_ex1.o src1.o src2.o 명령을 이용하여 Makefile_ex1.elf파일을 만들어 준다. *.o 파일이 없다면 바로 아래의 target 레이블인 Makefile_ex1.o를 수행하게 된다.
Make Utility mktc
mktc {makefile이름} {makefile에 정의된 target lable 이름} |
커맨드 환경에서 makefile을 실행하기 위해서는 mktc라는 utility를 사용한다.
만약 makefile의 이름이 다른 이름으로 정의되어 있을 경우는 -f라는 argument를 추가한다.
Makefile 작성 포맷
CC = cctc <- compiler, linker, assembler를 사용위한control program
PROJ = <- Project의 이름을 정의한다.
INC = <- include 되는 헤더 파일의 패스를 추가한다.
LIBS = <- 링크할 때 필요한 라이브러리를 추가한다.
CFLAGS = -g $(INC) <- 컴파일에 필요한 각종 옵션을 추가한다.
OBJS = <- 목적 파일의 이름을 적는다.
SRCS = <- 소스 파일의 이름을 적는다.
TARGET = <- 링크 후에 생성될 실행 파일의 이름을 적는다.
all : $(TARGET)
$(TARGET) : $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(LIBS)
.c.o : <- .c 를 입력 파일로 받고 .o 파일을 만든다
$(CC) -c $(CFLAGS) $< <- $<의 의미는 .c.o 라는 표현에서 .c 즉 C 소스 파일을 의미
clean :
rm -rf $(OBJS) $(TARGET) <- -rf명령은 디렉토리가 비어있지 않아도 강제 삭제시 사용
Makefile은 매크로 정의 부분과 명령어 정의 부분으로 나누어져 있다. 위 예제에서 매크로 정의 부분은 “TARGET=” 까지이며, 나머지는 명령어 정의 부분이다. 정의된 매크로는 명령어 정의 부분에서 $(MACRO이름)을 이용하여 사용 가능하다.
Makefile 작성 실습 Ex1 (Makefile_ex1)
1. Makefile_ex1 이름의 Tasking 컴파일러 프로젝트 작성
2. makefile_ex1.c, src1.c, src2.c 소스파일 2개 생성.
3. 각 소스파일에 간단한 코드 작성
4. 아래와 같이 Makefile작성
5. cmd 창을 현재 프로젝트의 경로에 복사 후 실행
6. mktc makefile all 커맨드 입력 후 컴파일 결과(.o .elf파일 생성) 확인
Makefile 작성 실습 Ex2 (Makefile_ex2)
1. 실습 1에서 작성한 프로젝트를 makefile_ex2로 복사
2. Makefile을 아래와 같이 수정
3. 기존에 생성되있는 *.o, *.elf파일을 모두 지우고cmd창에 mktc makefile all 커맨드 입력 후 컴파일 결과(.o .elf파일 생성) 확인
실습1과 실습2의 예제는 동일한 결과물을 출력해낸다. 다만 실습2의 예제에서는 makefile 작성시 매크로 선언 구문을 이용하였기에 소스파일이나 object파일을 관리하기가 더 수월하다.
TC275TE-Bstep Makefile 작성
이번 장을 통해서 다음과 같은 내용을 이해할 수 있다.
- TC275TE-Bstep 환경의 Tasking Compiler 기본 프로젝트 작성 - Makefile 옵션 적용 - Makefile 최종 작성 결과 확인 |
TC275TE-Bstep 환경의 Tasking Compiler 기본 프로젝트 작성 (Makefile_ex3)
1. TC27XB CPU를 선택하여 Makefile_ex3 프로젝트 생성
2. Makefile_ex2에서 만들어 놓은 makefile과 cmd.exe파일을 Makefile_ex3 경로에 복사
3. Makefile_ex3의 makefile을 텍스트뷰어로 open
4. PROJ, OBJS, SRCS, TARGET 매크로 내용 정의
5. elf파일을 만들기 위한 all 명령어 정의 구문 작성
6. 생성되는 결과물 파일들을 별도 폴더에 관리 위한 명령어 작성
7. Object 파일을 만들기 위한 .c.o 정의 구문 작성
8. 결과물을 제거하기 위한 clean 명령어 정의 구문 작성
위 과정대로 작성한 후에 cmd.exe파일 실행해서 mktc makefile all 명령을 주면 빌드 에러가 난다. 이유는 cstart.c파일에서 현재 사용하는 CPU의 레지스터들을 초기화 해주는 선언자들에 대한 define 정보를 찾을 수 없기 때문이다. 이를 해결하기 위해서는 사용하는 CPU선언, 레지스터 초기화, 컴파일시 필요한 추가 옵션 등을 적용해야 한다. 옵션 적용하는 방법은 3.2번에서 다루도록 한다.
Makefile 옵션 적용
Makefile에서 적용할 옵션의 커맨드는 Tasking컴파일러 IDE환경의 아래와 같은 위치에서 참고할 수 있다.
- 프로젝트의 Properties Window -> C/C++ Build -> Setting -> C/C++ Compiler -> All options
- 프로젝트의 Properties Window -> C/C++ Build -> Setting -> Assembler -> All options
- 프로젝트의 Properties Window -> C/C++ Build -> Setting -> Linker -> All options
C/C++ Compiler, Assembler, Linker에서 사용하는 모든 옵션을 Makefile의 CFLAGS 매크로에 다 복사해 주면 된다. 이때 고려해야 될 사항은 아래와 같다.
1. 옵션중 중복되는 내용은 제거
2. Include 경로는 CFLAGS 매크로가 아닌 INC 매크로에 –I”경로” 와 같은 포맷을 사용하여 별도 적용
Ex) INC = -I"C:\Users\Hyunyong\Desktop\makefile\Ex_Tricore_project\Makefile_final"
3. *.def, *.sfr파일이 있는 path를 Include경로에 추가
Ex) INC = -I”C:\Program Files (x86)\TASKING\TriCore v4.2r2\ctc\include”
4. 상위 디렉토리의 lsl파일이 아닌 현재 디렉토리의 lsl파일을 참조하도록 옵션 수정
Ex) "../프로젝트명.lsl"의 옵션을 "./프로젝트명.lsl"로 수정
5. -Wl--map-file="${PROJ}.mapxml" 옵션에서 ${PROJ}의 대괄호를 $(PROJ)로 수정
Makefile 최종 작성 결과 확인 (Makefile_final)
1. Tasking IDE 환경에서 Makefile_final이라는 이름으로 TC27xB 기본 HelloWorld 프로젝트 생성
2. Makefile_final 프로젝트의 경로에 cmd.exe파일과 기존 작성해오던 makefile copy.
3. Makefile을 아래와 같이 수정 작성
4. Cmd.exe파일 실행하여 mktc makefile all 입력
5. 프로젝트의 경로에 obj폴더 생성 및 *.o, *.elf, *.mapxml 파일 생성 확인
6. obj 폴더를 clean하고자 할때는 cmd.exe파일에서 mktc makefile clean 입력
makefile 사용 위한 기타 Solution
이번 장을 통해서 다음과 같은 내용을 이해할 수 있다.
- Tasking IDE환경에서 자동생성되는 makefile 사용 - Tasking IDE환경에서 만든 프로젝트를 커맨드 명령으로 빌드 |
Tasking IDE환경에서 자동생성되는 makefile 사용 (Makefile_another1)
Tasking IDE 환경에서는 프로젝트를 컴파일하기 위해 필요한 makefile을 자동으로 생성해준다. 만약 자동 생성된 makefile을 사용하려면 아래와 같이 하면 된다.
1. IDE 환경에서 프로젝트 생성
2. IDE 환경에서 해당 프로젝트를 한번 컴파일
3. 컴파일 완료 후 생성된 Debug 폴더에서 makefile 생성 확인
4. cmd.exe창에서 해당 프로젝트의 Debug 폴더로 경로 이동
5. amk –f makefile clean 입력하여 Debug 폴더 안의 output파일들 제거
6. amk –f makefile all 입력하여 컴파일 결과 확인
Tasking IDE환경에서 만든 프로젝트를 커맨드 명령으로 빌드 (Makefile_another2)
Tasking IDE 환경에서 만든 프로젝트를 makefile 없이 바로 커맨드 환경에서 빌드 하고자 한다면 아래와 같은 명령어를 사용하면 된다.
1. TC17XX 계열
A. cctc -v -g -D__CPU__=tc1796b --core=tc1.3 --no-warnings *.c -o makefile_another2_TC1796B.elf
B. 결과 확인
2. AURIX 계열
A. cctc -v -g -D__CPU__=tc27xb --core=tc1.6.x --no-warnings *.c -o makefile_another2_TC275XB.elf
B.결과 확인