Xcode 10: unable to attach DB error

后端 未结 7 1655
粉色の甜心
粉色の甜心 2020-12-02 13:34

When updating to Xcode 10, iOS static library target fails to build. Way how I am trying to build it is following:

xcodebuild -target TargetName -configurati         


        
相关标签:
7条回答
  • 2020-12-02 13:37

    If you want to keep the XCode 10 default build system but still running your build outside of the IDE (in a CI machine for instance), just replace your -target parameter for the -scheme parameter in your xcodebuild command like:

    xcodebuild -scheme SchemeName -configuration Release clean build
    

    Thanks to this post from 2015 that talks about a very similar problem and it gave me the hint to solve this problem. As the same author says,

    I would hazard a guess, that xcodebuild without a scheme goes wrongly through the "modern build system", giving the mentioned error

    0 讨论(0)
  • 2020-12-02 13:42

    Adding a Clean derived data step in my build scripts (before an Xcode build) seems to fix the problem for me.

    Not sure if it's related, but my project uses Realm (installed with CocoaPods). This is the GitHub issue that inspired the "fix" -> https://github.com/realm/realm-cocoa/issues/5812.

    0 讨论(0)
  • 2020-12-02 13:43

    If you use build script to build submodule's libraries like me. You also need to disable new build system in your build script explicitly by using -UseModernBuildSystem=NO in your xcodebuild command.

    For example:

    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
    
    0 讨论(0)
  • 2020-12-02 13:46

    Okay, seems like I managed to solve it. I was having /bin/sh script in Build Phases that was trying to build fat static library. In the script, I had OBJROOT path set like this:

    OBJROOT="${OBJROOT}"
    

    Seems like Xcode 10 and new build system changed some paths on the way and this line was the source of the issue. It needs to be adjusted to:

    OBJROOT="${OBJROOT}/DependentBuilds"
    

    After that, xcodebuild manages to build this target without issues with new build system introduced in Xcode 10.

    I didn't get to this solution by myself, big thanks to Matt Gallagher and his post in here: https://github.com/mattgallagher/CwlSignal/issues/24#issuecomment-396931001


    As requested by @TMin in comment, here's how my script looks like:

    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"
    

    Problem is in build_static_library method in this line:

    OBJROOT="${OBJROOT}" \
    

    Changing that line to:

    OBJROOT="${OBJROOT}/DependantBuilds" \
    

    solves the issue for me.

    0 讨论(0)
  • 2020-12-02 13:50

    I have the same issues and try everything from the hints but this error still continues. Sometimes the project is built, next time there is no and error. And the solution that helps me is to edit scheme and switch off Parallelize Build. After that everything works fine.

    0 讨论(0)
  • 2020-12-02 14:01

    Use this script it will it is working fine with new build system

    # 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
    

    before Xcode 10 build system uses single thread, but in Xcode 10 usees new build system with multiple threads, so every time you run your build Xcode run button this script

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

    will call one more time for build so on, that will create RECURSION

    Don't forgot to end you Script With (fi) its end of IF condition

    Step 1 is to Detect RECURSION and stop them

    0 讨论(0)
提交回复
热议问题