ubuntu 16.04 에서 Raspberry Pi Cross Compile 하기 (node.js 사례)
Small Devices/Raspberry Pi 2018. 3. 10. 23:52
|
Raspberry Pi 자체에서 빌드 툴을 설치해서 소스를 빌드할 수 있으나, 많은 시간이(사실 어마어마한) 소요된다. 라즈베리파이에서 DB등, 자신이 원하는 프로그램을 빌드해서 설치하려면 크로스 컴파일 환경에서 컴파일하고 라즈베리파이로 전송해서 사용하는게 정신 건강에 좋을 수 있다.
이번 포스팅에서는 유분투 16.04에서 라즈베리파이 프로그램을 빌드하기 위한 방법을 정리해 본다.
1. Cross-Compile 환경 설정
다음의 사이트에서 크로스컴파일을 위한 툴을 다운로드 한다.
https://github.com/raspberrypi/tools
명령어: git clone https://github.com/raspberrypi/tools
64 비트 우분투에서는 해당 툴이 실행되지 않는다. 32비트 지원을 위하여 i386 아키텍처를 활성화 시키고, 32비트 라이브러리를 설치한다.
sudo dkpg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libstdc++6:i386
sudo apt-get install zlib1g:i386
Bash 프로파일에 경로를 설정한다. (~ 에서 vi .profile로 경로 설정)
예: export PATH=$PATH:~/raspberrypi/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin
source ~/.profile로 경로를 반영하고 arm-linux-gnueabihf-gcc -v 로 실행되는지 확인한다.
2. Raspberry Pi Zero W 용 node.js Cross Compile 해보기
Raspberry Pi Zero W에서 이용 가능한 Node.js 를 컴파일 하는 것을 설명한다. (Raspberry Pi 3는 조금 다르다.) node.js 의 최신 소스를 다운로드 한다.
wget https://nodejs.org/dist/v8.10.0/node-v8.10.0.tar.gz
압축을 풀고 해당 폴더로 이동한다.
tar xzvf node-v8.10.0.tar.gz
TOOL_HOME=~/raspberrypi/tools/arm-bcm2708/arm-linux-gnueabihf GCCARCH="arm-linux-gnueabihf" DEBARCH="armhf" export CC="${GCCARCH}-gcc" export CXX="${GCCARCH}-g++" export AR="${GCCARCH}-ar" export RANLIB="${GCCARCH}-ranlib" export LINK="${GCCARCH}-g++" export CFLAGS="-march=armv6j -mfpu=vfp -mfloat-abi=hard -DUSE_EABI_HARDFLOAT" export OPENSSL_armcap=6 export GYPFLAGS="-Darmeabi=hard -Dv8_use_arm_eabi_hardfloat=true -Dv8_can_use_vfp3_instructions=false -Dv8_can_use_vfp2_instructions=true -Darm7=0 -Darm_vfp=vfp" export VFP3=off export VFP2=on export PATH=$PATH:$TOOL_HOME/bin |
make
make install
하게 되면 ./out/usr/local 밑에 컴파일된 노드가 빌드된다. 이 밑에 있는 폴더와 파일을 RPI-Zero W 의 /usr/local 에 옮기면 컴파일된 노드를 이용 가능하다.
3. Raspberry Pi3 용 컴파일 옵션
RPI3의 경우 다음의 컴파일 옵션으로 설정(CFLAGS)하는게 좋다고 한다. (https://www.raspberrypi.org/forums/viewtopic.php?t=144115)
-O2 -Otime -marm -mabi=aapcs-linux -march=armv8-a+crc -mfloat-abi=hard -mfpu=neon-fp-armv8 #other options are 'fp-armv8', 'neon-fp-armv8', and 'crypto-neon-fp-armv8' -funsafe-math-optimizations -mhard-float -mlittle-endian -mtls-dialect= gnu2 #or just gnu if gnu2 doesn't work -mtune=cortex-a53 -munaligned-access -mvectorize-with-neon-quad |
4. NPM Cross-Compile
node.js npm 모듈은 다음처럼 Cross-Compile이 가능하다.
npm install --target_arch=arm --build-from-source "module_name"