본문 바로가기

개발/embed

gcc 로 nuvoton source 직접 build(compile) 하기

반응형

본글은 Visual Source Code ( VsCode ) 로 Nuvoton 소스를 build ( compile ), debug 하는 글의 한 부분 입니다.

 

1.  Nuvoton 제공 Sample Code를 Keil 에서 Compile 하기   ( https://bahk33.tistory.com/181  )

2.  gcc 로 nuvoton source 직접 build(compile) 하기             ( https://bahk33.tistory.com/183 )   :   본글

3.  Visual Source VS Code 로 nuvoton Build(Compile) 하기   ( https://bahk33.tistory.com/185  ) 

4.  VS Code 로 nuvoton 디버그 하기                                       (  https://bahk33.tistory.com/186  ) 

 

==========================================

본문 목차.

0.개념

1  cmake 설치

     -  CMakeLists.txt 에서 makefile 만드는것 

2. make.exe 설치

      -  make.exe, gcc.exe 등이 있어 make 하고 compile 할 수 있게 함

3  arm gcc 설치

4  "CMakeLists.txt" 파일 만들기

5  "arm-none-eabi-gcc.cmake" 파일 만들기

6  Build ( Compile ) 하기

==========================================

 

0. 개념

> Build 라 하면, 소스파일들(~.c / ~.cpp)을  binary(~.hex/ ~.bin) 파일로 만드는 일련의 과정 입니다.

 이를 하기 위하여 nuvoton 의  keil 을 쓰는 경우, 그냥 [build target] 항목만 실행 하면 되었는데,

 VS Code 로 할 경우 직접 해 줘야 합니다.

 

> 일반적으로 빌드는

  1) makefile 을 만들고,

  2) make.exe 를 실행하여 makefile 안에 기록된 소스 파일들을

   컴파일러(gcc.exe) 를 이용 하여 object 들로 만들고 또 이들을 합쳐서 bin 파일을 만듭니다.

 

>  하지만 여기서는 makefile 만드는것이 어려워

  1) CMakeLists.txt 를 먼저 만들고

  2) cmake.exe로 이 파일( CMakeLists.txt )에서  makefile을 만들고,

  3) make.exe 를 실행 하는 방법으로 합니다. 

 

=====================================

> 이에 따라 필요한 파일들을 설치 하고 실행 하는 과정을 보여 줍니다.

 

=====================================

 

자 그럼 해 보실까요

1. cmake 설치  : 저는 풀어 쓰는것을 좋아해서 풀어 쓰는 버전으로 갑니다.

> https://cmake.org/download/  에서 cmake-3.31.4-windows-x86_64.zip  (크기 45M 정도) 을 다운 받아 적당한데 풉니다.

   이 파일이 32비트도 되는지 모르지만,   여기서는 win11 - 64bit 기준로 진행 합니다.

 

 

> 풀은 것의 bin 디렉토리를 보면 아래와 같읍니다.

 

> "cmd" 창을 열고 "path" 를 치면 나오는  환경변수 path 에 cmake bin 디렉토리 가 있도록 설정 하여,

  "cmake --version" 를 치면, 버전이 나오게 합니다.

      win11 의 경우 환경변수 설정 방법은  https://bahk33.tistory.com/182  를 참고 하셔요.

 

 

2. make.exe 설치

  > minGW 또는 다른 것으로도 할 수 있겠으나 여기서는  xpack-dev-tools 에 있는  windows-build-tools-xpack  를 설치 합니다.

https://github.com/xpack-dev-tools  에 접속 하여  선택 하든 

https://github.com/xpack-dev-tools/windows-build-tools-xpack/releases/  로 가서

https://github.com/xpack-dev-tools/windows-build-tools-xpack/releases/download/v4.4.1-3/xpack-windows-build-tools-4.4.1-3-win32-x64.zip  ( 크기, 3M 정도, 아래 첨부 합니다 ) 를 다운로드 합니다.

 

 

 

> 다운 받은 xpack-windows-build-tools-4.4.1-3-win32-x64.zip 를 적당한데 풀어 주셔요 

   여기서는 E:\_t\_d\_VSCode\xpack-windows-build-tools-4.3.0-1\ 에 풀었으며

   E:\_t\_d\_VSCode\xpack-windows-build-tools-4.3.0-1\bin 에 가보면 make.exe 가 있는것을 확인 할 수 있읍니다.

 

 

3. Arm gcc 설치 하기

- 소스(~.c) 파일을 컴파일 하는 컴파일러 (gcc.exe ) 를 설치 합니다.  여기서는 포터블 버전 사용 합니다.

https://developer.arm.com/downloads/-/gnu-rm   에서

  https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-win32.zip  

  ( 크기 195M 정도 ) 을 다운 받아 적당한데 풀어 줍니다.

 

- 여기서는 "E:\_t\_d\_VSCode\gcc-arm-none-eabi-10.3-2021.10" 에 풀었읍니다.

 

- 환경 변수  "ARM_TOOLCHAIN_DIR" 를 만들어 "E:\_t\_d\_VSCode\gcc-arm-none-eabi-10.3-2021.10\bin"로 설정 합니다.

 

* 사실  arm-none-eabi-gcc.cmake 라는 파일(아래에서 설명) 4번째 줄에 설정을 해도 되는데, 이상하게 win11 에서 에러 나네요.

 

 

4. "CMakeLists.txt" 파일 만들기

> 먼저 사용할 샘플 소스는 https://bahk33.tistory.com/181  에서 만든것을 이용 합니다. 

   이것을 이용하여 아래 것을 추가한 파일을 아래 첨부 합니다.

> "CMakeLists.txt" 와 아래에서 추가할  "arm-none-eabi-gcc.cmake" 파일 경로를 보여주는 그림 추가 합니다.

> 다운 받은 것에 있지만, Source Directory 안에  "CMakeLists.txt" 를 만듭니다.

cmake_minimum_required(VERSION 3.13)
set(CMAKE_SYSTEM_NAME Generic)

set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/tools")
include(arm-none-eabi-gcc)

### Project 이름 설정, 암거나 하셔요
set(PRJ_NAME UART_AutoFlow)

project(${PRJ_NAME}
  LANGUAGES ASM C CXX
)

set(EXECUTABLE ${PRJ_NAME}.elf)

file(GLOB SRC_FILES CONFIGURE_DEPENDS
  _Lib/StdDriver/src/retarget.c
  _Lib/StdDriver/src/clk.c
  _Lib/StdDriver/src/sys.c
  _Lib/StdDriver/src/uart.c
)

file(GLOB_RECURSE SRC_FILES_RECURSE CONFIGURE_DEPENDS
  _Lib/NUC472_442/Source/*.c
  _LIb/NUC472_442/Source/GCC/*.c
)

###  Source File 부분
add_executable(${EXECUTABLE} 
  main.c
  _Lib/NUC472_442/Source/GCC/startup_NUC472_442.S

  ${SRC_FILES}
  ${SRC_FILES_RECURSE}
)

#### Include directory 부분
target_include_directories(${EXECUTABLE} PRIVATE 
  _Lib/Include
  _Lib/StdDriver/inc
  _Lib/NUC472_442/Include
  _LIb/NUC472_442/Source/GCC
)

target_compile_definitions(${EXECUTABLE} PRIVATE
  )

target_compile_options(${EXECUTABLE} PRIVATE
  -mcpu=cortex-m4
  -mthumb
# -mfpu=fpv4-sp-d16 
# -mfloat-abi=hard

  -fsigned-char
  -fdata-sections
  -ffunction-sections
  -fsingle-precision-constant
  -Wall

  -g3
  -O0
  )

target_link_options(${EXECUTABLE} PRIVATE
  -T${CMAKE_CURRENT_SOURCE_DIR}/_LIb/NUC472_442/Source/GCC/gcc_arm.ld
  -mcpu=cortex-m4
  -mthumb
# -mfpu=fpv4-sp-d16 
# -mfloat-abi=hard
  -specs=nano.specs
  -lc
  -lm
  -lstdc++
  -lsupc++
  -lnosys
  -Wl,-Map=${PRJ_NAME}.map,--cref
  -Wl,--gc-sections
  -Xlinker -print-memory-usage -Xlinker
  )

target_link_libraries( ${EXECUTABLE} PRIVATE
  )

add_custom_command(TARGET ${EXECUTABLE} 
    POST_BUILD
    COMMAND ${CMAKE_OBJCOPY} ARGS -O binary ${EXECUTABLE} ${PROJECT_NAME}.bin
    COMMENT "Invoking: Make Binary"
    )

#set_target_properties(${EXECUTABLE} PROPERTIES SUFFIX ".elf")
#add_custom_command(TARGET ${EXECUTABLE} POST_BUILD
#        COMMAND arm-none-eabi-size --format=berkeley --totals "$<TARGET_FILE:${EXECUTABLE}>"
#        COMMENT "Invoking: Cross ARM GNU Print Size")

 

> "CMakeLists.txt" 에 대하여 좀더 아시고 싶으신 분은

 -  https://github.com/lifeisforu/cmake_tutorial  

 -  https://cmake.org/cmake/help/latest/manual/cmake-language.7.html 

등을 참조 하셔요

 

5.  "arm-none-eabi-gcc.cmake" 파일 만들기

 >  소스 디렉토리에 "tools" 라는 디렉토리를 만들고 그 안에, "arm-none-eabi-gcc.cmake" 를 만든다.

 >  아래 첨부한 파일에 들어 있읍니다.

 

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)

#set(ARM_TOOLCHAIN_DIR "E:/_t/_d/_VSCode/gcc-arm-none-eabi-10.3-2021.10/bin")
if(DEFINED ENV{ARM_TOOLCHAIN_DIR})
set(ARM_TOOLCHAIN_DIR $ENV{ARM_TOOLCHAIN_DIR}/)
else()
 if (WIN32)
 message(FATAL_ERROR "ARM_TOOLCHAIN_DIR Not Defined")
 endif()
endif()
message("ARM_TOOLCHAIN_DIR $ENV{ARM_TOOLCHAIN_DIR}")


find_program(CMAKE_MAKE_PROGRAM
  NAMES make
        make.exe
  DOC "Find a suitable make program for building under Windows/MinGW"
  HINTS E:/_t/_d/_VSCode/xpack-windows-build-tools-4.3.0-1/bin ) 

set(TOOLCHAIN_PREFIX ${ARM_TOOLCHAIN_DIR}arm-none-eabi-)

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

if (WIN32)
set(CMAKE_C_COMPILER "${TOOLCHAIN_PREFIX}gcc.exe" CACHE FILEPATH "C Compiler path")
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PREFIX}g++.exe" CACHE FILEPATH "C++ Compiler path")
else()
set(CMAKE_C_COMPILER "${TOOLCHAIN_PREFIX}gcc" CACHE FILEPATH "C Compiler path")
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PREFIX}g++" CACHE FILEPATH "C++ Compiler path")
endif()

set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy CACHE INTERNAL "objcopy tool")
set(CMAKE_SIZE_UTIL ${TOOLCHAIN_PREFIX}size CACHE INTERNAL "size tool")

set(CMAKE_C_STANDARD    11)
set(CMAKE_CXX_STANDARD  17)

# Disable compiler checks.
set(CMAKE_C_COMPILER_FORCED TRUE)
set(CMAKE_CXX_COMPILER_FORCED TRUE)

set(CMAKE_FIND_ROOT_PATH ${BINUTILS_PATH})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

 

> 본 파일 안에 make.exe 파일 경로, 파일명을 지정 할 수 있읍니다. 적당하게 수정 하여 주셔요

 

> 퍼 온것은 MinGW 어쩌고 하지만 여기서는 "xpack-windows-build-tools" 를 이용 한것이니 그 경로를 넣었읍니다.

   즉 여기서는 MinGW 는 쓰지 않읍니다.

 

 

6. Build ( Compile ) 하기

> Build 는 두단계 입니다. 

1)  cmake.exe 로 CMakeLists.txt 에서 makefile 만드는 단계

2)  make.exe makefile 에서 bin 만들기 단계 - 하지만 여기서는 이 역시도 cmake 를 이용하여 합니다.

 

그럼 해 볼까요 

>.  cmake 로 CMakeLists.txt 에서 makefile 만들기

사실 설정 다 끝나서 간단 합니다. 

그냥  cmake -S . -B build -G "MinGW Makefiles" 명령만 치면 끝납니다.

 

성공적으로 끝나면, build 디렉토리 안에 Makefile 이 만들어 져 있는것을 볼 수 있읍니다.

 

>.  cmake 로 makefile 에서 bin 만들기

이 역시 앞에서 한것이 문제가 없다면 간단히 끝납니다

명령 cmake --build build -j16 를 치면 자동으로 됩니다.

실행이 성공적으로 끝나면, build 디렉토리 안에   바이너리 파일(~.bin, ~.elf) 만들어 져 있는것을 볼 수 있읍니다.

  

> 타겟 보드에 바이너리 파일 다운 로드 하면, 아래 그림과 같이 serial termanal 에서 결과를 볼 수 있읍니다.

 

 

수고 하셨읍니다.

*. 파일 첨부 합니다.

 

UART_AutoFlow-GccCompile.zip
2.97MB

 

 

 

cmake-3.31.3-windows-x86_64.zip                     45M 라 첨부 불가
gcc-arm-none-eabi-10.3-2021.10-win32.zip        200M 라 첨부 불가

xpack-windows-build-tools-4.3.0-1-win32-x64.zip

xpack-windows-build-tools-4.3.0-1-win32-x64.zip
2.71MB

 

 

관련된 모든 파일은

https://1024terabox.com/s/14o6ublK_ChNyk_kNX44mLA

 

에서 받을 수 있읍니다.

 

 

 

다음글 은

3. Visual Source VS Code 로 nuvoton Build(Compile) 하기   ( https://bahk33.tistory.com/185  ) 

 

입니다.

 

==========================
수고 하셨읍니다.
도움이 되셨으면, 댓글 부탁합니다. 댓글 하나에 힘이 됩니다.

고맙읍니다.

반응형