58 votes

Xcode 10: impossible de joindre l'erreur DB

Lors de la mise à jour de Xcode 10, iOS statique de la bibliothèque de la cible échoue à construire. Façon que je suis en train de construire est la suivante:

xcodebuild -target TargetName -configuration Release clean build

Avec Xcode 9 tout se passe bien, mais quand Xcode 10 est utilisé pour le construire, j'obtiens le message d'erreur suivant (après le nettoyage fonctionne bien):

remarque: en Utilisant le nouveau système de construction

remarque: la Planification de construire

remarque: Construction description du système de génération d'informations d'erreur: impossible de joindre DB: erreur: l'accès aux base de données "/Users/uerceg/random-chemin/build/XCBuildData/build.db: base de données est verrouillé, Éventuellement, il y a deux concurrentes s'appuie cours d'exécution dans la même répertoire du système de fichiers.

** BUILD FAILED **

** BUILD FAILED **

La génération suivante de commandes a échoué: PhaseScriptExecution Multiplateforme\ Build /Users/uerceg/random-path/build/Library.build/Release-iphoneos/LibraryTarget.build/Script-9DE7C9021AE68FA5001556E5.sh (1 échec)

C'est probablement sans rapport, mais j'ai remarqué que les nouveaux Xcode 10 construire des indicateurs système dupliqué Copy Bundle Resource d'Infos.des fichiers plist comme des erreurs, donc je n'ai assurez-vous qu'il n'y a pas de dédoublement des entrées, mais probablement que cette erreur n'est pas liée à ce fait.

Quelqu'un a une idée de ce qui pourrait être mauvais?

85voto

uerceg Points 583

Bon, semblerait que j'ai réussi à le résoudre. J'ai eu /bin/sh script en Build Phases qui tentait de mettre en place la graisse bibliothèque statique. Dans le script, j'ai eu OBJROOT chemin d'accès défini comme ceci:

OBJROOT="${OBJROOT}"

Semble comme Xcode 10 et le nouveau système de construction changé quelques chemins sur le chemin et cette ligne a été la source du problème. Il doit être ajusté à:

OBJROOT="${OBJROOT}/DependentBuilds"

Après, xcodebuild parvient à construire cette cible sans problème avec le nouveau système de construction introduit dans Xcode 10.

Je n'ai pas cette solution par moi-même, un grand merci à Matt Gallagher et son post ici: https://github.com/mattgallagher/CwlSignal/issues/24#issuecomment-396931001


Comme demandé par @TMin en commentaire, voici comment mon script ressemble à:

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"

Le problème est en build_static_library méthode dans cette ligne:

OBJROOT="${OBJROOT}" \

Changer cette ligne:

OBJROOT="${OBJROOT}/DependantBuilds" \

résout le problème pour moi.

53voto

sharon ouyang Points 521

Ouvrez le fichier XCode-> Paramètres du projet

Build System-> Legacy Build System

Configurer les paramètres du projet XCode de la version 10.0 peut résoudre le problème.

21voto

Shih Ken Points 427

Si vous utilisez un script de construction pour créer des bibliothèques de sous-modules comme moi. Vous devez également désactiver explicitement le nouveau système de build dans votre script de build en utilisant -UseModernBuildSystem=NO dans votre commande xcodebuild.

Par exemple:

 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
 

0voto

Raj Maurya Points 1

L'utilisation de ce script, il va il fonctionne très bien avec le nouveau système de construction

# 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

avant de Xcode 10 build système utilise un seul thread, mais dans Xcode 10 usees nouveau système de construction avec plusieurs threads, de sorte que chaque fois que vous exécutez votre version de Xcode bouton exécuter ce script

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

va appeler une fois de plus pour construire ainsi de suite, qui va créer la RÉCURSIVITÉ

N'oublie pas de mettre fin à votre Script Avec (fi) à la fin de sa condition if

L'étape 1 consiste à Détecter la RÉCURSIVITÉ et les arrêter

0voto

Delfín Points 79

Si vous voulez garder le XCode 10 système de génération par défaut mais toujours en cours d'exécution de votre build en dehors de l'IDE (dans un IC de la machine par exemple), il suffit de remplacer votre -target paramètre pour l' -scheme paramètre dans votre xcodebuild commande comme:

xcodebuild -scheme SchemeName -configuration Release clean build

Merci pour ce post à partir de 2015, qui parle d'un problème similaire et il m'a donné l'astuce pour résoudre ce problème. Le même auteur dit,

Je hasarder une conjecture, que xcodebuild sans régime va à tort, par le biais de la "moderne système de construction", donnant à l'erreur mentionné

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X