Lors de la mise à jour vers Xcode 10, la génération cible de bibliothèque statique iOS ne parvient pas. Voici comment j'essaie de le construire:
xcodebuild -target TargetName -configuration Release clean build
Avec Xcode 9, tout se passe bien, mais lorsque Xcode 10 est utilisé pour la construction, le message d'erreur suivant s'affiche (après le nettoyage en douceur):
note: Utilisation du nouveau système de compilation
note: construction de planification
note Remarque: Construire la description de la construction Construire erreur d'information: impossible d'attacher la base de données: erreur: accès à la base de données de construction "/Users/uerceg/random-path/build/XCBuildData/build.db": la base de données est verrouillée Il est possible que deux versions simultanées s'exécutent dans le même fichier emplacement du système de fichiers.
** ÉCHEC DE CONSTRUCTION **
** ÉCHEC DE CONSTRUCTION **
Les commandes de construction suivantes ont échoué: PhaseScriptExecution MultiPlatform\Build /Users/uerceg/random-path/build/Library.build/Release-iphoneos/LibraryTarget.build/Script-9DE7C9021AE68FA5001556E5.sh (1 échec)
Ceci n’a probablement aucun rapport, mais j’ai remarqué que les nouvelles versions du système de construction Xcode 10 marquaient les erreurs comme des erreurs dans les fichiers Copy Bundle Resource
Info.plist.
Est-ce que quelqu'un a une idée de ce qui pourrait être faux?
Ok, semble avoir réussi à le résoudre. J'avais /bin/sh
script dans Build Phases
qui essayait de construire une grosse bibliothèque statique. Dans le script, j'avais OBJROOT
chemin défini comme ceci:
OBJROOT="${OBJROOT}"
On dirait que Xcode 10 et le nouveau système de construction ont modifié certains chemins sur le chemin et cette ligne était la source du problème. Il doit être ajusté pour:
OBJROOT="${OBJROOT}/DependentBuilds"
Après cela, xcodebuild
parvient à construire cette cible sans problèmes avec le nouveau système de construction introduit dans Xcode 10.
Je ne suis pas arrivé à cette solution par moi-même, un grand merci à Matt Gallagher et son message ici: https://github.com/mattgallagher/CwlSignal/issues/24#issuecomment-396931001
Comme demandé par @TMin dans le commentaire, voici à quoi ressemble mon script:
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 dans la méthode build_static_library
dans cette ligne:
OBJROOT="${OBJROOT}" \
Changer cette ligne pour:
OBJROOT="${OBJROOT}/DependantBuilds" \
résout le problème pour moi.
Ouvrir le fichier XCode-> Paramètres du projet
Système de construction-> Système de construction hérité
Configurer XCode de la version 10.0 Les paramètres du projet peuvent résoudre le problème.
Si vous utilisez un script de construction pour construire les bibliothèques de sous-module comme moi, vous devez également désactiver explicitement le nouveau système de construction dans votre script de construction à l'aide de -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
Si vous souhaitez conserver le système de génération par défaut XCode 10 tout en l'exécutant en dehors de IDE (sur une machine CI, par exemple), remplacez simplement le paramètre -target
par le paramètre -scheme
dans votre commande xcodebuild
, comme suit:
xcodebuild -scheme SchemeName -configuration Release clean build
Merci à this post de 2015 qui parle d’un problème très similaire et qui m’a donné l’allusion de le résoudre. Comme dit le même auteur,
Je me risquerais à deviner, que
xcodebuild
sans plan va à tort par le "système de construction moderne", donnant l'erreur mentionnée
Utilisez ce script, il fonctionnera correctement 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 que Xcode 10 build système utilise un seul thread, mais dans Xcode 10, il utilise un nouveau système de construction avec plusieurs threads. Ainsi, à chaque fois que vous exécutez votre bouton Xcode Run, ce script
xcodebuild -target logger ONLY_ACTIVE_Arch=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}".
appellera une fois de plus pour construire ainsi de suite, cela créera RECURSION
N'oubliez pas de terminer votre script avec (fi) sa fin de condition IF
L'étape 1 consiste à détecter la récurrence et à les arrêter
J'ai les mêmes problèmes et essaie tout ce qui est indiqué, mais cette erreur persiste. Parfois, le projet est construit, la prochaine fois, il n'y a pas d'erreur. Et la solution qui m’aide est de modifier le schéma et de désactiver Parallelize Build. Après que tout fonctionne bien.