【问题标题】:Separate build directory using xcodebuild使用 xcodebuild 分离构建目录
【发布时间】:2011-02-11 14:08:37
【问题描述】:

xcodebuild 的手册页内容如下:

从目录运行 xcodebuild 包含您的项目(即 目录包含 projectname.xcodeproj 包)。

我想保持我的源目录(Subversion 外部)干净且未修改,并将我的目标文件和可执行文件构建到完全位于源目录之外的位置。

有什么方法可以使用xcodebuild 从终端构建单独的构建目录,就像您可以在 Windows 上使用make 工具甚至msbuild 一样?

【问题讨论】:

    标签: macos xcodebuild


    【解决方案1】:

    您可以从命令行设置构建设置。 CONFIGURATION_BUILD_DIR 将设置构建目录。例如:

    xcodebuild -project YourProject.xcodeproj -configuration Debug -target All ARCHS=x86_64 ONLY_ACTIVE_ARCH=YES CONFIGURATION_BUILD_DIR=../some/other/dir
    

    可在 Apple 网站上找到参考:

    【讨论】:

    • 我发现我还需要设置CONFIGURATION_TEMP_DIR,然后这对我有用。
    • 你可以设置 BUILD_DIR 也可以:D
    【解决方案2】:

    为了实现完全分离,必须更改以下构建设置(不仅仅是CONFIGURATION_BUILD_DIR,就像接受的答案所建议的那样),否则 Xcode 仍会在其默认构建文件夹下构建它的一些工件。

    在我的机器上,Xcode 通常会将所有内容构建到./Build./DerivedData,其中当前目录是我的项目之一。

    我希望 xcodebuild 构建 Build-command-line 文件夹下的所有内容,因此我使用 xcodebuild -scheme MyScheme -showBuildSettings | grep Build\/ 查找与所有构建路径相对应的所有构建设置,并且通过试验结束错误,我发现“生成”构建设置足以将 xcodebuild 生成的所有构建工件 重定向到自定义文件夹。

    我最终使用了以下命令:

    BUILD_DIR=./Build-command-line
    DERIVED_DATA_DIR=$(BUILD_DIR)/DerivedData
    
    xcodebuild -project MyProject.xcodeproj \
             -IDEBuildOperationMaxNumberOfConcurrentCompileTasks=`sysctl -n hw.ncpu` \
             -scheme MyScheme \
             -sdk iphonesimulator \
             -destination 'platform=iOS Simulator,name=iPhone 6S Plus,OS=latest' \
             -xcconfig command-line-build.xcconfig \
             -derivedDataPath $(DERIVED_DATA_DIR) \
             test
    

    command-line-build.xcconfig 在哪里:

    HERE_BUILD=$(SRCROOT)/Build-command-line
    HERE_INTERMEDIATES=$(HERE_BUILD)/Intermediates
    
    // Paths
    // the following paths are enough to redirect everything to $HERE_BUILD
    MODULE_CACHE_DIR    = $(HERE_BUILD)/DerivedData/ModuleCache
    OBJROOT             = $(HERE_INTERMEDIATES)
    SHARED_PRECOMPS_DIR = $(HERE_INTERMEDIATES)/PrecompiledHeaders
    SYMROOT
    

    注意:确保在 xcconfig 中使用绝对路径,否则可能会出现错误:Xcode crashing on startup “parentPath must be nil but it is not

    我写了一篇关于这个解决方案的帖子,有点背景:xcodebuild: how to really change its build path

    附:当然,这些信息可能会发生变化,但从 Xcode Version 7.3.1 (7D1014) 开始,它对我来说非常有效。

    【讨论】:

    • 斯坦尼斯拉夫,你可能是(唯一的人:))知道this one:O
    • 不,我不知道。对不起:)
    【解决方案3】:

    Xcode 10

    如果您使用的是 CocoaPods,则适用于工作区:

    xcodebuild -workspace youProject.xcworkspace -scheme yourScheme -sdk iphonesimulator -configuration Release SYMROOT=$(PWD)/build
    

    这会将您的 .app 放入 ./build/Release-iphonesimulator

    【讨论】:

      【解决方案4】:

      在我的项目中,设置 SYMROOT 足以在不同的位置构建项目,而其他位置保持不变。

      来自 Apple 的 Xcode Build Setting Reference(我是通过另一个答案在这里找到的,谢谢!):

      SYMROOT(构建产品路径)

      描述:目录路径。标识包含产品文件和中间构建文件的目录层次结构的根。产品和构建文件放置在该目录的子目录中。

      ...

      影响:BUILT_PRODUCTS_DIR、CONFIGURATION_BUILD_DIR (...)

      xcodebuild 手册页中也多次提及此设置:

      可用的操作有:

      build:在构建根目录(SYMROOT)中构建目标...

      clean:从构建根目录 (SYMROOT) 中删除构建产品和中间文件....

      【讨论】:

      • 如果您想将所有内容重定向到自定义文件夹,至少OBJROOT 非常重要,因为相当多的文件夹依赖于它,而不是SYMROOT。我刚刚检查了 Xcode 7.3.1 - MODULE_CACHE_DIR 和 SHARED_PRECOMPS_DIR 也独立于SYMROOT。所以你的答案仍然会在默认构建目录中构建一些东西,但也许这对你的任务来说已经足够了。
      【解决方案5】:

      您应该将SYMROOT 构建设置设置为您想要的位置。所有其他相关的构建设置都源自它。

      【讨论】:

        【解决方案6】:

        您也可以临时更改工作目录并从那里运行命令。即

         (cd dir1/dir2/MyApp && xcodebuild build -workspace "MyApp.xcworkspace" -scheme "MyApp")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多