2014년 9월 25일 목요일

boost build, cross compile for arm

boost library
http://www.boost.org/

[build for linux] 

boost library를 사용할 필요가 있어 빌드함.
linux 상에서의 기본 빌드는 간단하다.

http://www.boost.org/doc/libs/1_51_0/more/getting_started/unix-variants.html#easy-build-and-install

$ ./bootstrap.sh
$ ./b2
$ sudo ./b2 install

이렇게 하면 아래 path에 설치 됨.

headers :  /usr/local/include/boost
libraries : /usr/local/lib

만약 빌드 중 gits/predefs.h 가 없다는 에러가 나오면 gcc-multilib를 설치
http://stackoverflow.com/questions/12591629/gcc-cannot-find-bits-predefs-h-on-i686
sudo apt-get install gcc-multilib

feature.h를 못찾겠다고 하면 아래 include 정보 추가
./b2 include=/usr/include

[cross compile for ARM architecture]

arm linux 용으로 빌드를 할 필요가 있어
cross compile을 하려면 다음과 같이 설정하고 빌드 하면 됨.

bjam cross compilation 설정

boost 폴더/tools/build/v2/user-config.jam  에 다음 정보만 입력
using gcc : arm : arm-none-linux-gnueabi-g++ ;
위 처럼 tool set name : version : invocation command 아니면 option을 입력
arm 용 cross compile 시에는 version 대신 arm을 기입했는데 상관 없는듯.

그리고 세번째 항목에는 컴파일러 빌드 명령과 option을 입력하는게 맞는데
option을 어떻게 설정하는지는 잘 몰라서 여기서 설정하지 않고 b2 실행 시 command line에서 입력 함.

참고로 아래 링크의 QnA에서 compile option을 compileflags 로 기입하는 것을 볼 수 있지만 실제 해봤을 때 boost 빌드에서 먹히지가 않았음.. http://stackoverflow.com/questions/15686972/how-to-change-check-the-compiler-used-by-b2-when-compiling-boost

using gcc : macports :
         full/Path/g++-mp4.8 :
  <compileflags>--sysroot=full/path/to/sysroot
  ;

빌드하면 boost documentation에서 보듯이 toolset과 target을 지정해서 빌드하면 됨.
# On windows box
b2 toolset=gcc-arm target-os=linux
# On Linux box
b2 toolset=gcc-mingw target-os=windows
되지만 아래 설정이 되어 있는지 먼저 확인을 해봐야 한다.

1. user-config.jam에서 설정된 invocation command 경로가 $PATH에 추가 되어 있는지
    추가 되어 있지 않았다면 추가하거나 아니며 user-config.jam에서 full path와 함께 command를 입력해라.
2. cross compile 시 필요한 include 파일이나 library들이 존재하는지
    cross compile tool chain에서 제공하는 include 파일들과 library들이 어디에 있는지 경로를 확인해 두고 관련 에러 시 path를 명시해야 한다.
3. 빌드 에러 시 정확한 메세지 확인을 위해서는 -d+2 (debug message level), -q(error 발생 시 빌드 중지) 옵션을 사용

그래서 나는 일단 다음과 같이 빌드 하였음.

./b2 toolset=gcc-arm target-os=linux  include=/home/ccc/arm-tool-chain/usr/include/ -d+2 -q 

빌드 후 library들은 boost 폴더 내 stage/lib 폴더에 복사된다.

참고로 세부 빌드 옵션 설명은 다음 링크에서 설명하고 있음.
예를 들어 include path 추가는 include, library 형태(.a, .so)는 link, flag 추가는 cxxflags, cflags, linkflags 를 사용..

근데 shared library로 빌드하려니.. gcc 설정이 문제인지 빌드가 안된다.. 포기..

Table 4.2. 
FeatureAllowed valuesNotes
variantdebug,release
linkshared,staticDetermines if Boost.Build creates shared or static libraries
threadingsingle,multiCause the produced binaries to be thread-safe. This requires proper support in the source code itself.
address-model32,64Explicitly request either 32-bit or 64-bit code generation. This typically requires that your compiler is appropriately configured. Please refer to the section called “C++ Compilers” and your compiler documentation in case of problems.
toolset(Depends on configuration)The C++ compiler to use. See the section called “C++ Compilers” for a detailed list.
include(Arbitrary string)Additional include paths for C and C++ compilers.
define(Arbitrary string)Additional macro definitions for C and C++ compilers. The string should be either SYMBOL or SYMBOL=VALUE
cxxflags(Arbitrary string)Custom options to pass to the C++ compiler.
cflags(Arbitrary string)Custom options to pass to the C compiler.
linkflags(Arbitrary string)Custom options to pass to the C++ linker.
runtime-linkshared,staticDetermines if shared or static version of C and C++ runtimes should be used.
If you have more than one version of a given C++ toolset (e.g. configured in user-config.jam, or autodetected, as happens with msvc), you can request the specific version by passing toolset-version as the value of the toolset feature, for example toolset=msvc-8.0.
If a feature has a fixed set of values it can be specified more than once on the command line. In which case, everything will be built several times -- once for each specified value of a feature. For example, if you use
b2 link=static link=shared threading=single threading=multi
Then a total of 4 builds will be performed. For convenience, instead of specifying all requested values of a feature in separate command line elements, you can separate the values with commas, for example:
b2 link=static,shared threading=single,multi
The comma has this special meaning only if the feature has a fixed set of values, so
b2 include=static,shared
is not treated specially.

댓글 없음:

댓글 쓰기