web-dev-qa-db-ja.com

Xcode 10:DBエラーを添付できません

Xcode 10に更新すると、iOS静的ライブラリターゲットのビルドに失敗します。私がそれを構築しようとしている方法は次のとおりです:

xcodebuild -target TargetName -configuration Release clean build

Xcode 9ではすべてがスムーズに実行されますが、ビルドにXcode 10を使用すると、次のエラーが発生します(クリーン実行がスムーズに実行された後):

注:新しいビルドシステムの使用

注:プランニングビルド

注:ビルドの説明の構築ビルドシステム情報エラー:DBを接続できません:エラー:ビルドデータベース "/Users/uerceg/random-path/build/XCBuildData/build.db"にアクセスしています:データベースがロックされている可能性があります2つの同時ビルドが実行されています同じファイルシステムの場所。

**ビルドに失敗しました**

**ビルドに失敗しました**

次のビルドコマンドが失敗しました:PhaseScriptExecution MultiPlatform\Build /Users/uerceg/random-path/build/Library.build/Release-iphoneos/LibraryTarget.build/Script-9DE7C9021AE68FA5001556E5.sh(1失敗)

これはおそらく無関係ですが、新しいXcode 10ビルドシステムが重複したCopy Bundle Resource Info.plistファイルにエラーとしてフラグを立てていることに気づいたので、重複したエントリがないことを確認しましたが、おそらくこのエラーはこの事実とは関係ありません。

誰が何が間違っているのか考えていますか?

35
uerceg

さて、なんとか解決できたようです。 /bin/shスクリプトがBuild Phasesにあり、それが太い静的ライブラリを構築しようとしていました。スクリプトでは、OBJROOTパスを次のように設定しました。

OBJROOT="${OBJROOT}"

Xcode 10や新しいビルドシステムが途中でいくつかのパスを変更したようで、この行が問題の原因でした。次のように調整する必要があります。

OBJROOT="${OBJROOT}/DependentBuilds"

その後、xcodebuildはXcode 10で導入された新しいビルドシステムで問題なくこのターゲットをビルドします。

私は自分でこの解決策に到達しませんでした、Matt Gallagherと彼の投稿に感謝します: https://github.com/mattgallagher/CwlSignal/issues/24#issuecomment-396931001


@TMinのコメントで要求されているように、私のスクリプトは次のようになります。

set -e

# If we're already inside this script then die
if [ -n "$RW_MULTIPLATFORM_BUILD_IN_PROGRESS" ]; then
exit 0
fi
export RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1

RW_FRAMEWORK_NAME=${PROJECT_NAME}
RW_INPUT_STATIC_LIB="lib${PROJECT_NAME}.a"
RW_FRAMEWORK_LOCATION="${BUILT_PRODUCTS_DIR}/static/${RW_FRAMEWORK_NAME}Sdk.framework"

function build_static_library {
    echo "1"
    echo "${BUILD_DIR}"
    # Will rebuild the static library as specified
    #     build_static_library sdk
    xcrun xcodebuild -project "${PROJECT_FILE_PATH}" \
    -target "${TARGET_NAME}" \
    -configuration "${CONFIGURATION}" \
    -sdk "${1}" \
    ONLY_ACTIVE_Arch=NO \
    BUILD_DIR="${BUILD_DIR}" \
    OBJROOT="${OBJROOT}" \
    BUILD_ROOT="${BUILD_ROOT}" \
    SYMROOT="${SYMROOT}" $ACTION
}

function make_fat_library {
    # Will smash 2 static libs together
    #     make_fat_library in1 in2 out
    xcrun lipo -create "${1}" "${2}" -output "${3}"
}

# 1 - Extract the platform (iphoneos/iphonesimulator) from the SDK name
if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]; then
RW_SDK_PLATFORM=${BASH_REMATCH[1]}
else
echo "Could not find platform name from SDK_NAME: $SDK_NAME"
exit 1
fi

# 2 - Extract the version from the SDK
if [[ "$SDK_NAME" =~ ([0-9]+.*$) ]]; then
RW_SDK_VERSION=${BASH_REMATCH[1]}
else
echo "Could not find sdk version from SDK_NAME: $SDK_NAME"
exit 1
fi

# 3 - Determine the other platform
if [ "$RW_SDK_PLATFORM" == "iphoneos" ]; then
RW_OTHER_PLATFORM=iphonesimulator
else
RW_OTHER_PLATFORM=iphoneos
fi

# 4 - Find the build directory
if [[ "$BUILT_PRODUCTS_DIR" =~ (.*)$RW_SDK_PLATFORM$ ]]; then
RW_OTHER_BUILT_PRODUCTS_DIR="${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}"
else
echo "Could not find other platform build directory."
exit 1
fi

# Build the other platform.
build_static_library "${RW_OTHER_PLATFORM}${RW_SDK_VERSION}"

# If we're currently building for iphonesimulator, then need to rebuild
#   to ensure that we get both i386 and x86_64
if [ "$RW_SDK_PLATFORM" == "iphonesimulator" ]; then
build_static_library "${SDK_NAME}"
fi

# Join the 2 static libs into 1 and Push into the .framework
make_fat_library "${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}" \
"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}" \
"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}Sdk"

# Ensure that the framework is present in both platform's build directories
cp -a "${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}Sdk" \
"${RW_OTHER_BUILT_PRODUCTS_DIR}/static/${RW_FRAMEWORK_NAME}Sdk.framework/Versions/A/${RW_FRAMEWORK_NAME}Sdk"

# Copy the framework to the project directory
ditto "${RW_FRAMEWORK_LOCATION}" "${SRCROOT}/Frameworks/static/${RW_FRAMEWORK_NAME}Sdk.framework"

問題はこの行のbuild_static_libraryメソッドにあります:

OBJROOT="${OBJROOT}" \

その行を次のように変更します。

OBJROOT="${OBJROOT}/DependantBuilds" \

私のために問題を解決します。

60
uerceg

XCodeファイルを開く->プロジェクト設定

ビルドシステム->レガシービルドシステム

XCodeバージョン10.0のプロジェクト設定を構成すると、問題を解決できます。

33
sharon ouyang

ビルドスクリプトを使用して、私のようなサブモジュールのライブラリをビルドする場合。また、xcodebuildコマンドで-UseModernBuildSystem=NOを使用して、ビルドスクリプトで新しいビルドシステムを明示的に無効にする必要があります。

例えば:

xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}" -UseModernBuildSystem=NO
19
Shih Ken

XCode 10のデフォルトビルドシステムを維持したいが、IDEの外部(CIマシンなど)でビルドを実行する場合は、xcodebuildコマンドの-targetパラメーターを-schemeパラメーターに置き換えます。

xcodebuild -scheme SchemeName -configuration Release clean build

this 2015年の投稿に感謝します。これは非常によく似た問題について述べており、この問題を解決するためのヒントを与えてくれました。同じ著者が言うように、

スキームを持たないxcodebuildが「モダンビルドシステム」を誤って通過し、前述のエラーが発生するという推測は危険です

0
Delfín

このスクリプトを使用すると、新しいビルドシステムで正常に動作します。

# Step 1 search RECURSION and if detected stop "*/

if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: Detected, stopping"
else
export ALREADYINVOKED="true"

UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

# Step 2. Build Device and Simulator versions

xcodebuild -target logger ONLY_ACTIVE_Arch=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

xcodebuild -target logger-configuration ${CONFIGURATION} -sdk iphonesimulator -Arch i386 -Arch x86_64 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"

# Step 3. Create universal binary file using lipo
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}universal.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a"

# Last touch. copy the header files. Just for convenience
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/"

fi

xcode 10ビルドシステムがシングルスレッドを使用する前に、Xcode 10では複数のスレッドを持つ新しいビルドシステムを使用するため、ビルドを実行するたびにXcode実行ボタンはこのスクリプト

 xcodebuild -target logger ONLY_ACTIVE_Arch=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}".

ビルドのためにもう一度呼び出します、それはRECURSIONを作成します

スクリプトを終了することを忘れないでください(fi)IF条件の終了

ステップ1は、再帰を検出して停止することです。

0
Raj Maurya

私は同じ問題を抱えており、ヒントからすべてを試しますが、このエラーは引き続き発生します。時々プロジェクトがビルドされ、次回はエラーが発生しません。そして、私を助ける解決策は、スキームを編集し、Parallelize Buildをオフにすることです。その後、すべてが正常に動作します。

0
Dmytro Turkov

Xcodeビルドの前にビルドスクリプトにClean Derived Dataステップを追加すると、問題が解決するようです。

それが関連しているかどうかはわかりませんが、私のプロジェクトではRealm(CocoaPodsと共にインストールされます)を使用しています。これは、「修正」を促したGitHubの問題です-> https://github.com/realm/realm-cocoa/issues/5812

0
Adam Waite