2011-12-16 24 views
1

我正在研究幾個都依賴於通用框架的多平臺項目。 我想添加對Google Native Client(NaCl)的支持。我解決問題的方式是首先將框架編譯爲靜態庫(這是我在其他平臺上的工作方式)。我不得不說,我從來沒有使用過SCons。我想我開始抓住它。從教程中的build.scons開始,我可以獲得一些代碼編譯和鏈接。現在我想跳過鏈接過程,但似乎nacl_env從來沒有打算編譯靜態庫。使用SCons編譯Google Native Client的靜態庫

由於缺少nacl_env中的Library節點,讀SCons幫助並沒有多大幫助。

我不認爲我理解SCons足以從頭開始編寫整個構建過程,所以我跳到不必這樣做。

1.我是否正確接近問題?

2.任何提示或示例nacl靜態庫,使用SCons構建?

回答

2

好吧,我所做的是比你可能需要更多的方式弄虛作假。

我想讓我的靜態庫來處理NaCl模塊的初始化步驟,然後調用一些項目特定的函數。

我最終將我的整個框架和內置libppapi_cpp.a的內容轉換爲一個.o文件,然後將其轉換爲一個.a文件和一個靜態庫。

我需要一個單獨的.o文件,否則我會遇到依賴關係問題,因爲我不能解決初始化問題。

build_lib。SH(框架):

#!/bin/bash -e 

SDK="/home/kalmi/ik/nacl_sdk/pepper_15" 

function create_allIn_a { 
TMPDIR="`mktemp -d`" 
    echo $TMPDIR 
    cp $O_FILES $TMPDIR 
    pushd $TMPDIR &> /dev/null 
    $AR x $LIBPPAPI_CPP_A 
    $LD -Ur * -o ALL.o 
    $AR rvs $OUTPUT_NAME ALL.o 
    $RANLIB $OUTPUT_NAME 
    popd &> /dev/null 
} 

./scons 


BIN_BASE="$SDK/toolchain/linux_x86/bin" 
LD="$BIN_BASE/i686-nacl-ld" 
AR="$BIN_BASE/i686-nacl-ar" 
RANLIB="$BIN_BASE/i686-nacl-ranlib" 
LIBPPAPI_CPP_A="$SDK/toolchain/linux_x86_newlib/x86_64-nacl/lib32/libppapi_cpp.a" 
O_FILES="`find $(pwd)/opt_x86_32 | grep .o$ | grep --invert-match my_main.o | tr "\n" " "`" 
LIBDIR="../../../bin/lib/lib32" 
mkdir -p $LIBDIR 
if [ -f $LIBDIR/libweb2grid_framework.a ]; then 
    rm $LIBDIR/libweb2grid_framework.a 
fi 
OUTPUT_NAME="`readlink -m $LIBDIR/libweb2grid_framework.a`" 
create_allIn_a 


BIN_BASE="$SDK/toolchain/linux_x86/bin" 
LD="$BIN_BASE/x86_64-nacl-ld" 
AR="$BIN_BASE/x86_64-nacl-ar" 
RANLIB="$BIN_BASE/x86_64-nacl-ranlib" 
LIBPPAPI_CPP_A="$SDK/toolchain/linux_x86_newlib/x86_64-nacl/lib64/libppapi_cpp.a" 
O_FILES="`find $(pwd)/opt_x86_64 | grep .o$ | grep --invert-match my_main.o | tr "\n" " "`" 
LIBDIR="../../../bin/lib/lib64" 
mkdir -p $LIBDIR 
if [ -f $LIBDIR/libweb2grid_framework.a ]; then 
    rm $LIBDIR/libweb2grid_framework.a 
fi 
OUTPUT_NAME="`readlink -m $LIBDIR/libweb2grid_framework.a`" 
create_allIn_a 

./scons -c 

的my_main.o文件被排除在靜態庫,因爲該文件包含要由使用該框架的項目中提供的功能。

build.scons該框架文件是真正普通的。

build.scons(爲使用這個框架的一些項目):

#! -*- python -*- 

#What to compile: 
sources = [ 'src/something.cpp', 'src/something_helper.cpp' ] 


###############################################################x 

import make_nacl_env 
import nacl_utils 
import os 

nacl_env = make_nacl_env.NaClEnvironment(
    use_c_plus_plus_libs=False, 
    nacl_platform=os.getenv('NACL_TARGET_PLATFORM')) 

nacl_env.Append(
    # Add a CPPPATH that enables the full-path #include directives, such as 
    # #include "examples/sine_synth/sine_synth.h" 
    CPPPATH=[os.path.dirname(os.path.dirname(os.path.dirname(os.getcwd())))], 
    LIBS=['web2grid_framework','srpc'], 
    LIBPATH=['../../../bin/lib/lib32','../../../bin/lib/lib64'], 
    LINKFLAGS=['-pthread'] 
    ) 

nacl_env.AllNaClModules(sources, 'client') 

有些線路值得強調:

  • use_c_plus_plus_libs =假
  • LIBS = [ 'web2grid_framework' '','../../../bin/lib/lib64'],
  • LINKFLAGS = [「 - 並行線程」]

我並不是說這是一個乾淨的方法,但它能夠完成任務。

+0

該示例很有用。這就是我一直在尋找的。一些如何編譯用於NaCl的靜態庫的實例,我可以根據需要進行修改。 – Aleks

0

所以,這裏有兩個問題
1.使用scons的:
氯化鈉使用SCons它的例子,僅僅是爲了幫助編制的例子更容易。實際上,SCONS只是指向SDK構建目錄中的GCC/G ++編譯器。 (scons的將輸入腳本,並創建最終的PARAM字符串發送到GCC)

GCC是一種常見的編譯器,並且是有據可查的淨:http://gcc.gnu.org/

你怎麼氯化鈉編譯融入你的工作-flow取決於你(即你不必使用SCONS)。

舉例來說,如果你想直接到GCC,你可以簡單地調用:
<path to bin>/x86_64-nacl-gcc -m64 -o test.nexe main.c

如需更詳細的研究如何編譯的NaCl模塊,請閱讀documentation @ gonacl.com on compiling這將詳細介紹如何編譯有和沒有SCONS。

2.Compilng靜態庫與GCC
下面是一個例子:http://www.adp-gmbh.ch/cpp/gcc/create_lib.html

〜主要

+0

嗯。出於某種原因,我認爲可能有一些其他陌生的步驟涉及編譯NaCl,或者可能有一個完全在Python中實現的步驟。我會花更多的時間來修復scons構建,但很高興知道我可以輕鬆切換到makefile。 – Aleks