Компиляция статической библиотеки для Google Native Client с использованием SCons - PullRequest
1 голос
/ 16 декабря 2011

Я работаю над несколькими мультиплатформенными проектами, которые зависят от общей платформы.Я хочу добавить поддержку Google Native-Client (NaCl).Сначала я решил проблему скомпилировать фреймворк как статическую библиотеку (вот как я это делал на всех других платформах).

Я должен сказать, что никогда раньше не использовал SCons.Я думаю, что я начинаю понимать это.Начиная с build.scons из учебника, я могу получить компиляцию и компоновку кода.Теперь я хотел бы пропустить процесс компоновки, но похоже, что nacl_env никогда не предназначался для компиляции статических библиотек.

Чтение справки SCons мне не сильно помогло, поскольку узел библиотеки отсутствует в nacl_env.

Не думаю, что я понимаю SCons достаточно, чтобы написать весь процесс сборки с нуля, поэтому я прыгал, чтобы не делать этого.

1.Правильно ли я подхожу к проблеме?

2.Любые советы или образцы nacl static libs, сборка с использованием SCons?

Ответы [ 2 ]

2 голосов
/ 23 декабря 2011

Хорошо, то, что я сделал, было гораздо более обманчивым, чем то, что вам, вероятно, нужно.

Я хотел, чтобы моя статическая библиотека выполняла этапы инициализации модуля 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 = False,
  • LIBS = [ 'web2grid_framework', 'srpc']
  • LIBPATH = [»../../../ бен / Библиотека / lib32' , '.. / .. / .. / bin / Lib / lib64']
  • LINKFLAGS = [ '- потоковой']

Я не говорю, что это чистый метод, но он выполняет свою работу.

0 голосов
/ 16 декабря 2011

Итак, здесь есть два вопроса
1. Использование SCONS:
NaCl использует SCONS для своих примеров, просто чтобы упростить компиляцию примеров.В действительности SCONS просто направляет компиляторы GCC / G ++ в каталогах сборки SDK.(SCONS примет входные сценарии и создаст последнюю строку параметров для отправки в GCC)

GCC - это обычный компилятор, который хорошо документирован в сети: http://gcc.gnu.org/

Как выинтеграция NaCl-компиляции в ваш рабочий процесс зависит от вас (то есть вы не обязаны использовать SCONS).

Например, если вы хотите перейти в GCC напрямую, вы можете просто позвонить:
<path to bin>/x86_64-nacl-gcc -m64 -o test.nexe main.c

Для получения более подробной информации о том, как скомпилировать модули NaCl, ознакомьтесь с документацией @ gonacl.com по компиляции , в которой подробно описано, как компилировать с использованием SCONS и без него.

2.Compilng Статические библиотеки с GCC
Вот пример: http://www.adp -gmbh.ch / cpp / gcc / create_lib.html

~ Main

...