기본 콘텐츠로 건너뛰기

Windows 기반 Tool Chain을 Linux에서 작업

 

목표

현재 사용하고 있는 RTOS개발환경은 Windows에서 동작을 기본인데 Linux 에서 ARM ADS 컴파일 하는 것

 

Windows에서 Linux로 전환하기 위한 소스 및 빌드 수정사항

빌드환경관련해서는 3가지 단계로 진행하면 된다.

  1. Linux개발환경에 ARM ADS Compiler 설치
  2. PATH 및 ARM환경변수 설치
  3. windows 기반 toolchain을 수정없이 사용하기 위해서 wine을 통해 배치파일 수행

ADS 설치경로

Local 설치 또는 opt아래에 설치

공용설치

/opt/arm/linux/bin

/opt/arm/linux/common/lib

/opt/arm/linux/common/include

로컬설치

~/bin/ADSv1_2/Bin

~/bin/ADSv1_2/Include

~/bin/ADSv1_2/Lib

 

 

 

wine

set LM_LICENSE_FILE=Z:\data\limjh\licenses\license.dat

또는

set LM_LICENSE_FILE=/opt/arm/licenses/license.dat


set ARMLIB=Z:\data\limjh\bin\ADSv1_2\Lib

또는

set ARMLIB=Z:\opt\arm\common/lib

set PATH=%PATH%;Z:\data\limjh\bin\ADSv1_2\Bin

또는

set PATH=%PATH%;Z:\opt\arm\linux\Bin

linux

export LM_LICENSE_FILE=/data/limjh/licenses/license.dat
export ARMLIB=/opt/arm/common/lib
export PATH=$PATH:/opt/arm/linux/linux

 

사용하던 SDK에는 빌드환경을 설정하는 DOS용 batch파일을 사용하는데 다음과 같이 변경한다.

Common_Build_conf.bat수정사항

set GNUPATH=Z:/usr/bin;Z:/usr/sbin;Z:/sbin;Z:/bin
set ARMHOME=/opt/arm
set ARMLIB=/opt/arm/common/lib


################################################################################
# compiler path
################################################################################
    ARM_HOME_DIR            = $(ARMHOME)#

ifeq ($(USE_HOST_SELECT), USE_LINUX)
    ARM_INC_DIR             = $(ARM_HOME_DIR)/common/include#
    ARM_LIB_DIR             = $(ARM_HOME_DIR)/common/lib#
else
    ARM_INC_DIR             = $(ARM_HOME_DIR)/include#
    ARM_LIB_DIR             = $(ARM_HOME_DIR)/lib#
endif

ifeq ($(USE_COMPVER_SELECT), USE_RVCT_3_1)
    ARM_BIN_DIR             = $(RVCT31BIN)#
else

ifeq ($(USE_HOST_SELECT), USE_LINUX)
    ARM_BIN_DIR             = $(ARM_HOME_DIR)/linux/bin#
else
    ARM_BIN_DIR             = $(ARM_HOME_DIR)/bin#
endif

endif

ifeq ($(USE_COMPMODE_SELECT),USE_THUMB_MODE)
    ARMCC                   = $(ARM_BIN_DIR)/tcc#
    ARMCPP                  = $(ARM_BIN_DIR)/tcpp#
else
    ARMCC                   = $(ARM_BIN_DIR)/armcc#
    ARMCPP                  = $(ARM_BIN_DIR)/armcpp#
endif
    ARMASM                  = $(ARM_BIN_DIR)/armasm#
    ARMAR                   = $(ARM_BIN_DIR)/armar#
    ARMLINK                 = $(ARM_BIN_DIR)/armlink#
    FROMELF                 = $(ARM_BIN_DIR)/fromelf#
export FROMELF


 

빌드

windows에서 사용하던 하되 wine 을 통해서 다음과 같이 수행한다.

echo build make | wine cmd

또는

wine cmd

build.bat make

추가된

위와 같이 빌드를 하면 되는데

실제 적용할때는 WINE에서 빌드되는것과 Windows 에서 빌드되는것을 환경변수로 구분해서 커스마이징하고 빌드결과물에 대한 후처리를 위해서 최종 바이너리 가공까지 부분까지 추가했다.

set USE_HOST_SELECT=USE_LINUX
export USE_HOST_SELECT=USE_LINUX

cd ./Build/Target/MD7150P
wine cmd /C build clean 2>/dev/null | tee /dev/null
wine cmd /C build make 2>/dev/null | tee /dev/null

cp /data/jenkins/jobs/RTOS_MD7150P/workspace/Build/Base/MD7150P_LUCA_DebugRel.bin /data/jenkins/jobs/RTOS_MD7150P/workspace/Util/InputBinary/DTK_LUCA_DebugRel.bin

cd /data/jenkins/jobs/RTOS_MD7150P/workspace/Util

wine cmd /C build clean 2>/dev/null | tee /dev/null
wine cmd /C build make 2>/dev/null | tee /dev/null

소스관련해서

역슬래쉬와 대소문자가 문제가 되며 ,  빌드에서 오류가 나는 부분을 일괄적으로 변경하는 수작업이 필요하다.

시간이 많이 들어가는 작업을 마치고 원본과 수정본의 diff를 확보하면

다른 프로젝트에도 적용이 가능하다.

diff와 patch를 이용해서 다음과 같이 적용했다.

패치만들기

ORG 과 MOD

diff  -urN ORG MOD > test.diff
diff  -urN STI_572 STI_Linux > total.diff
diff  -urN STI_572/Source STI_Linux/Source > linux_source.diff
diff  -urN STI_572/Build STI_Linux/Build > linux_build.diff

적용하기

방법한가지
cd ORG
cd Source
2 step 아래로 이동해서 -p2
patch -p2 < ~/linux_source.diff
patch -p2 < ~/linux_build.diff

방법두가지
patch -p0 < ~/total.diff

 

 

Tip

대소문자와 역슬레대소문자 구분 때문에 문제가 된다고 했는데 찾아보면

동일한 패턴이 많기 때문에 아래의 script로 일괄 수정한다.

단순 replace
#!/bin/bash

if [[ $# < 2 ]]; then
    echo "Usage: $0 Before After"
    exit 1
fi

BEFORE=$1
AFTER=$2

echo "[${BEFORE}] => [${AFTER}]"
find . -name "*.c*" -print0 | xargs -0 sed -i "s/${BEFORE}/${AFTER}/g"
find . -name "*.h*" -print0 | xargs -0 sed -i "s/${BEFORE}/${AFTER}/g"

대소문자차이로 파일명을 수정해야하는 경우

Makefile.mk 를 makefile.mk 을 실제 파일명과 구분없이 사용하다 Linux에서는문제가 된다.

find -type f -name "Makefile.mk" | sed -e 'p' -e 's/Makefile/makefile/g' | xargs -n 2 mv

단계는 3단계
1단계
find로 파일찾기

2단계 기존파일명과 변경할 파일명 준비하기
-e ‘p’ 기존파일명
-e ‘s/Makefile/makefile/g’ 치환하고 싶은 결과파일명

3단계
mv 또는 rename으로 파일명 변경하기
sed에서 넘겨준 문자를 방기 위해서 xargs 가사용된다.
xargs –n 2 인자수를 2개로 조정.
mv로 실행.

 

Wine을 설치할때 정말 단순한 실수로 시간을 낭비한게 있는데

 ttf-mscorefonts-installer 설정 중입니다

같은 사용자 입력 대기화면이 있는데 여기서 enter키를 아무리 누르거나해도 넘어가진 않는다.

Tab 한번해서 focus이동하고 space bar를 살짝 눌러줘야 넘어간다.

참고

KLDPWiki: 오픈소스 프로젝트에 참여하기위한 diff와 patch 사용법

댓글

이 블로그의 인기 게시물

DELL의 새게이밍 노트북, Inspiron 15 7000 Gaming, Dual Display 문제

Dell New 게이밍노트북 7567  I7 Notebook http://www.dell.com/kr/p/inspiron-15-7567-laptop/pd?ref=PD_OC 7th Generation Intel® Core™ i7 프로세서 8GB 메모리 1TB 하드 드라이브 + 128GB 솔리드 스테이트 드라이브 NVIDIA® GeForce® GTX 1050 Ti (4GB GDDR5 그래픽 메모리 포함) 상세 사양 리눅스 개발환경이 필요해서 여러대 구매한 노트북입니다. 기본적으로 ubuntu 16.04 가 설치되어 있는데, 필요한 개발환경이 ubuntu 이고 별도의 windows 개발용 PC가 있기 때문에 구매를 결정하게 되었습니다. Slim하지 않지만 I7 HQ CPU와 1050TI spec 이 결정하는데 주요했고, 받은 후에 빌드환경 구축후 8 thread compile을 만끽하던중 치명적인 문제를 Display쪽 문제를 발견하고, Dell express 쪽과 전화통화도 하고 문의 메일도 보내서 지원을 받고(진행)중입니다. 추가 :  시간낭비하지 말라고 중간에 업데이트합니다.  해결되었고, 해결방법은  Windows 을 설치한 후 Fn+F8을 눌러서 모드를 확장모드를 선택합니다. 디스플레이 설정이나 드라이버 재설치 같은 방법으로는 조정이 불가능했습니다. --------------------------------------------------------------------- 요즘 다들 Dual monitor 환경일텐데, Dual Monitor를 복제형태로만 지원을 합니다. 14.04 설치후 업데이트시 375.66 Driver가 설치됩니다. nVidia driver가 설치되었으나, 모니터 인식에 문제가 있어서 해상도 확장설정자체를 할 수 없습니다. 기본 ubuntu라서 driver 문제인가 확인하기 위해서 우분투 64bit 환경 NVIDIA...

우분투에서 성가신 자동 실행 처리

우분투운서비스는 종료된지 예전인데 script에 남아 있어서 항상 실행된다 apt-get 패키지가 제거되어도 etc/xdg/autostart 폴더에서 삭제해야 실행되지 않는다. /etc/xdg/autostart$ ls at-spi-dbus-bus.desktop              gnome-settings-daemon.desktop                print-applet.desktop bluetooth-applet-unity.desktop       gnome-sound-applet.desktop                   pulseaudio-kde.desktop bluetooth-applet.desktop             gnome-user-share.desktop                     pulseaudio.desktop deja-dup-monitor.desktop             gsettings-data-convert.desktop               telepathy-indicator.desktop gdu-notification-daemon.desktop      gwibber.desktop                             ...

llama 계열 gguf 제공되는 경우 가져와서 사용하는 예제

llama 계열의 모델이 친절하게 gguf 형태로 제공되는 경우 어떻게 다운받고 어떻게 ollama에 추가하는지 예전에 gguf 파일을 등록하는 유튜브 강의를 보고 메모해두것을 기반으로 2024년 12월31일 추운 겨울 밤 기억을 백업해 봅니다 수동으로 작성한 것은 지우고 copilot으로 포맷을 정리해서 업데이트합니다. Bllossom/llama-3.2-Korean-Bllossom-3B-gguf-Q4_K_M 한국어 모델 추가하기 시작 : MS Copilot과의 질의응답 중 llama 3.2 기반의 한국어 학습 모델을 발견. 현재 사용 모델 : EEVE-Korean-10.8B (약 7.7 GB) 모델 사용 중. llama 3.2 기반 한국어 모델 소개 : 모델 설명 링크 gguf 파일 다운로드 링크 deepseek-ai/DeepSeek-R1-Distill-Qwen-7B  기반 한국어 모델 소개 : 모델 설명 링크 gguf 파일 다운로드 링크 모델 설정 파일 (Modelfile) : FROM llama-3.2-Korean-Bllossom-3B-gguf-Q4_K_M.gguf PARAMETER temperature 0.6 PARAMETER top_p 0.9 TEMPLATE """<|start_header_id|>system<|end_header_id|> Cutting Knowledge Date : December 2023 {{ if .System }}{{ .System }} {{- end }} {{- if .Tools }} When you receive a tool call response, use the output to format an answer to the orginal user question. You are a helpful assistant with tool calling capabilities. {{- end }} <|eot_id|> {{- range $i , $_ := .Messa...