Как включить специфичные для Xcode флаги сборки для проектов на основе автоинструментов - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь построить проект Google protobuf для iOS, но неясно, как включить специфичные для iOS флаги, такие как -fembed-bitcode и BITCODE_GENERATION_MODE=bitcode с помощью autotool. Я попытался с помощью следующего сценария:

#!/bin/bash

## Environments
ScriptDir="$( cd "$( dirname "$0" )" && pwd )"
cd - &> /dev/null

# Exit the build pass if any command returns a non-zero value
#set -o errexit


# Echo commands
set -x

# 13.4.0 - Mavericks
# 14.0.0 - Yosemite
# 15.0.0 - El Capitan
# 16.0.0 - Sierra
DARWIN=darwin`uname -r`

MIN_SDK_VERSION=8.0

IPHONEOS_SYSROOT=`xcrun --sdk iphoneos --show-sdk-path`
IPHONESIMULATOR_SYSROOT=`xcrun --sdk iphonesimulator --show-sdk-path`

# Verbose clang output
#CLANG_VERBOSE="--verbose"

CC=clang
CXX=clang

SILENCED_WARNINGS="-Wno-unused-local-typedef -Wno-unused-function"

# NOTE: Google Protobuf does not currently build if you specify 'libstdc++'
# instead of `libc++` here.
STDLIB=libc++

CFLAGS="${CLANG_VERBOSE} ${SILENCED_WARNINGS} -DNDEBUG -g -O0 -pipe -fPIC -fcxx-exceptions"
CXXFLAGS="${CFLAGS} -std=c++11 -stdlib=${STDLIB}"

LDFLAGS="-stdlib=${STDLIB}"
LIBS="-lc++ -lc++abi"

PROTOC=`which protoc`

PROTOBUF_SOURCE_DIR="$ScriptDir"

PREFIX="$ScriptDir"/_build
if [ -d ${PREFIX} ]
then
    rm -rf "${PREFIX}"
fi
mkdir -p "${PREFIX}/platform" &> /dev/null

## Functions

build-arch() {
  HOST=$1
  ARCH=$2
  PLATFORM_CFLAGS=$3
  PLATFORM_NAME=${ARCH}
  SYSROOT=${IPHONEOS_SYSROOT}

  make distclean
  ./configure \
    --build=x86_64-apple-${DARWIN} \
    --host=${HOST} \
    --with-protoc=${PROTOC} \
    --disable-shared \
    --prefix=${PREFIX} \
    --exec-prefix=${PREFIX}/platform/${PLATFORM_NAME} \
    "CC=${CC}" \
    "CFLAGS=${CFLAGS} -miphoneos-version-min=${MIN_SDK_VERSION} -arch ${ARCH} -isysroot ${SYSROOT} ${PLATFORM_CFLAGS}" \
    "CXX=${CXX}" \
    "CXXFLAGS=${CXXFLAGS} -miphoneos-version-min=${MIN_SDK_VERSION} -arch ${ARCH} -isysroot ${SYSROOT}" \
    LDFLAGS="-arch ${ARCH} -miphoneos-version-min=${MIN_SDK_VERSION} ${LDFLAGS}" \
    "LIBS=${LIBS}"

  make -j8
  make install
}

build-i386-simulator() {
  ARCH=i386
  HOST=${ARCH}-apple-${DARWIN}
  PLATFORM_NAME=${ARCH}-simulator
  SYSROOT=${IPHONESIMULATOR_SYSROOT}

  make distclean
  ./configure \
    --build=x86_64-apple-${DARWIN} \
    --host=${HOST} \
    --with-protoc=${PROTOC} \
    --disable-shared \
    --prefix=${PREFIX} \
    --exec-prefix=${PREFIX}/platform/${PLATFORM_NAME} \
    "CC=${CC}" \
    "CFLAGS=${CFLAGS} -mios-simulator-version-min=${MIN_SDK_VERSION} -arch ${ARCH} -isysroot ${SYSROOT}" \
    "CXX=${CXX}" \
    "CXXFLAGS=${CXXFLAGS} -mios-simulator-version-min=${MIN_SDK_VERSION} -arch ${ARCH} -isysroot ${SYSROOT}" \
    LDFLAGS="-arch ${ARCH} -mios-simulator-version-min=${MIN_SDK_VERSION} ${LDFLAGS}" \
    "LIBS=${LIBS}"

  make -j8
  make install
}

build-x86_64-simulator() {
  ARCH=x86_64
  PLATFORM_NAME=${ARCH}-simulator
  SYSROOT=${IPHONESIMULATOR_SYSROOT}

  make distclean
  ./configure --prefix=${PREFIX} \
              --exec-prefix=${PREFIX}/platform/${PLATFORM_NAME} \
              --with-sysroot=${SYSROOT} \
              --with-protoc=`which protoc` \
              --enable-static \
              --disable-shared

  make -j8
  make install
}

build-fat-lib() {
  OUT=${PREFIX}/universal
  mkdir -p ${OUT}

  PLATFORM_ROOT=${PREFIX}/platform
  LIPO=lipo

  LIB=libprotobuf.a
  ${LIPO} ${PLATFORM_ROOT}/arm64/lib/${LIB} \
          ${PLATFORM_ROOT}/armv7/lib/${LIB} \
          ${PLATFORM_ROOT}/x86_64-simulator/lib/${LIB} \
          ${PLATFORM_ROOT}/i386-simulator/lib/${LIB} \
          -create \
          -output ${OUT}/${LIB}

  LIB_LITE=libprotobuf-lite.a
  ${LIPO} ${PLATFORM_ROOT}/arm64/lib/${LIB_LITE} \
          ${PLATFORM_ROOT}/armv7/lib/${LIB_LITE} \
          ${PLATFORM_ROOT}/x86_64-simulator/lib/${LIB_LITE} \
          ${PLATFORM_ROOT}/i386-simulator/lib/${LIB_LITE} \
          -create \
          -output ${OUT}/${LIB_LITE}
}

## Build pass

cd ${PROTOBUF_SOURCE_DIR}

./autogen.sh

build-x86_64-simulator
build-i386-simulator

build-arch arm arm64 "BITCODE_GENERATION_MODE=bitcode -fembed-bitcode"
build-arch armv7-apple-${DARWIN} armv7 -fembed-bitcode

build-fat-lib

echo DONE!

В приведенном выше сценарии я попытался передать мои предполагаемые параметры через CFLAGS, который не работал: сборка прототипных библиотек с помощью этого сценария проходит, носвязывание с выходом Universal libs с другим проектом XCode терпит неудачу. Очевидно, что битовый код не был включен, т.е. флаги не работали.

Интересно, невозможно ли добиться того, что я делаю, с помощью одного только автоинструмента? Должен ли я создать настоящий проект XCode для этой цели?

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Autotools предоставляют основу для построения и поддержки систем сборки. Они обеспечивают некоторую стандартизацию, но в значительной степени возможности системы сборки на основе Autotools зависят от проекта.

Но при этом ваш сценарий не передает что-либо configure через CFLAGS, CC или любое другое. Это переменные среды , распознаваемые configure, но вместо этого вы пытаетесь передать их в качестве аргументов. Это лучший способ сделать это, если вы хотите вставить эти аргументы на шаге make, но по умолчанию он не работает вообще для configure. Синтаксис оболочки требует назначения переменных перед именем команды, например:

"CC=${CC}" \
"CFLAGS=${CFLAGS} -miphoneos-version-min=${MIN_SDK_VERSION} -arch ${ARCH} -isysroot ${SYSROOT} ${PLATFORM_CFLAGS}" \
"CXX=${CXX}" \
"CXXFLAGS=${CXXFLAGS} -miphoneos-version-min=${MIN_SDK_VERSION} -arch ${ARCH} -isysroot ${SYSROOT}" \
LDFLAGS="-arch ${ARCH} -miphoneos-version-min=${MIN_SDK_VERSION} ${LDFLAGS}" \
"LIBS=${LIBS}" \
./configure \
  --build=x86_64-apple-${DARWIN} \
  --host=${HOST} \
  --with-protoc=${PROTOC} \
  --disable-shared \
  --prefix=${PREFIX} \
  --exec-prefix=${PREFIX}/platform/${PLATFORM_NAME}

Или вы можете просто установить и export эти переменные с помощью одной или нескольких отдельных команд, предшествующих configure.


Кроме того, make distclean не делает то, что вы хотите, когда нет make-файла, как в случае проекта Autotools, который еще не был настроен. Вы должны защититься от сбоев, сделав выполнение этой команды условным существованием make-файла верхнего уровня.

0 голосов
/ 09 октября 2019

Для полноты картины в моем оригинальном скрипте есть ошибки цитаты, например,

"CC=${CC}" должно было быть CC="${CC}" и т. Д.

В противном случае предложение @ JohnBollinger оперемещение этих переменных среды до того, как ./configure не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...