빌드 시스템
- 툴체인이 주로 make 변수 CROSS_COMPILE로 제어되는 순수한 makefile들
- Autotools로 알려진 GNU 빌드 시스템
- CMake (http://cmake.org)
[ makefile ]
리눅스 커널, U-Boot 부트로더, BusyBox를 포함한 몇몇 중요한 패키지들은 크로스 컴파일이 매우 쉽다.
각각 컴파일할 때, make 변수 CROSS_COMPILE에 툴체인 접두어를 넣기만 하면 된다. (끝에 대시(-)가 붙는다.)
BusyBox를 컴파일할 때 명령어
$ make CROSS_COMPILE=aarch
셸 변수로 설정할 경우
$ export CROSS_COMPILE=aarch
$ make
U-Boot와 리눅스의 경우, make 변수 ARCH도 지원하는 아키텍처로 설정해야 한다. (3장, 4장)
[ Autotools ]
GNU 빌드 시스템을 뜻하며, 유닉스나 리눅스 OS에서 소스코드를 빌드하는 데 도움을 주는 프로그램 도구를 말한다.
일반적으로 Autotools는 GNU에서 제공하는 utility인 Autoconf, Automake, Libtool 등을 말한다.
- GNU Autoconf (https://www.gnu.org/software/autoconf/autoconf.html)
- GNU Automake (https://www.gnu.org/savannah-checkouts/gnu/automake/)
- GNU Libtool (https://www.gnu.org/software/libtool/libtool.html)
- Gnulib (https://www.gnu.org/software/gnulib/)
Aututools 설치
해당 패키지를 설치한 후, 아래 명령어를 실행한다.
$ ./configure
$ make
$ sudo make install
Autotools는 다음의 셸 변수들을 설정함으로써 configure 스크립트의 동작에 영향을 줄 수 있다.
- CC : C 컴파일러 명령
- CFLAGS : C 컴파일러 옵션
- LDFLAGS : 링커 옵션
- 비표준 디렉터리 <lib dir>에 라이브러리가 있다면, -L<lib dir>를 추가해 <lib dir>를 라이브러리 검색 경로에 넣을 수 있다.
- LIBS : 링커에게 넘길 추가 라이브러리 목록
- 수학 라이브러리(libm)의 경우 -lm
- CPPFLAGS : C/C++ 전처리기 옵션
- 비표준 디렉터리 <include dir>에서 헤더를 찾고 싶다면 -I<include dir>를 추가한다.
- CPP : C 전처리기
Ex) SQLite 설치
SQLite 라이브러리는 간단한 관계형 데이터베이스를 구현한다.
$ wget http://www.sqlite.org/2015/sqlite-autoconf-3081101.tar.gz
$ tar -zxvf sqlite-autoconf-3081101.tar.gz
$ cd sqlite-autoconf-3081101/
기본 설치 디렉터리는 <sysroot>/usr/local/*이다.
보통은 헤더와 라이브러리를 기본 디렉터리에서 찾도록 <sysroot>/usr*에 설치한다.
$ CC=aarch64-rpi3-linux-gnu-gcc ./configure --host=aarch64-rpi3-linux-gnu --prefix=/usr
make 하기 전에, make 변수 DESTDIR를 설정해 툴체인 디렉터리에 설치한다.
그렇지 않으면 호스트 컴퓨터의 /usr 디렉터리에 설치할 것이다.
$ make DESTDIR=$(aarch64-rpi3-linux-gnu-gcc -print-sysroot) install
make 후, sysroot 폴더에 sqlite 파일이 추가된 것을 볼 수 있다.
- <sysroot>/usr/bin/sqlite3 : 타깃에 설치하고 실행할 수 있는 SQLite의 커맨드라인 인터페이스
- <sysroot>/usr/lib : libsqlite3.so.0.8.6, libsqlite3.so.0, libsqlite3.so, libsqlite3.la, libsqlite3.a : 공유/정적 라이브러리
- <sysroot>/usr/lib/pkgconfig/sqlite3.pc : 패키지 구성 파일
- <sysroot>/usr/include : sqlite3.h, sqlite3ext.h : 헤더 파일
- <sysroot>/usr/share/man/man1/sqlite3.1 : 매뉴얼 페이지
컴파일
sqlite3이 sysroot에 설치되어 아래와 같이 경로를 지정하지 않아도 컴파일러는 헤더와 라이브러리를 문제없이 찾을 것이다.
하지만 다른 곳에 설치되었다면, -L과 -I 옵션을 이용해 경로를 추가해주어야 한다.
$ aarch64-rpi3-linux-gnu-gcc -lsqlite3 sqlite-test.c -o sqlite-test
[ 패키지 구성 ]
pkg-config는 [sysroot]/usr/lib/pkconfig에 Autotools 패키지의 데이터베이스를 두므로 어떤 패키지가 설치되고 어떤 컴파일 플래그가 필요한지 알 수 있다.
https://www.freedesktop.org/wiki/Software/pkg-config/
2023.03.19 - [Linux/etc] - [Linux] pkg-config 사용법
예를 들어, SQLite3용 데이터베이스는 이름이 sqlite3.pc이고 SQLite3가 필요한 다른 패키지들에 필요한 필수 정보를 담고 있다.
$ cat $(aarch64-rpi3-linux-gnu-gcc -print-sysroot)/usr/lib/pkgconfig/sqlite3.pc
pkg-config를 이용해 gcc에게 바로 넘길 수 있는 형태로 나타낼 수 있다.
libsqlite3 같은 라이브러리의 경우, 라이브러리 이름(--libs)과 C 플래그(--cflags)를 알고 싶다면 다음과 같이 실행한다.
$ pkg-config sqlite3 --libs --cflags
위 명령어를 실행시키면 아래와 같은 에러가 난다.
Host의 sysroot에서 sqlite3을 찾았는데, Host에는 libsqlite3용 개발 패키지가 설치되어 있지 않다.
셸 변수 PKG_CONFIG_LIBDIR을 설정해서 타깃 툴체인의 sysroot를 가리키도록 해야 한다.
$ export PKG_CONFIG_LIBDIR=$(aarch64-rpi3-linux-gnu-gcc -print-sysroot)/usr/lib/pkgconfig
컴파일
$ aarch64-rpi3-linux-gnu-gcc $(pkg-config sqlite3 --cflags --libs) sqlite-test.c -o sqlite-test