【问题标题】:How can I get a Copy Files Build Phase to follow the DSTROOT build setting?如何获得复制文件构建阶段以遵循 DSTROOT 构建设置?
【发布时间】:2019-04-27 19:23:58
【问题描述】:

我有一个构建库的项目。 Xcode 设置 DSTROOT 设置为默认的 /tmp/$(PROJECT_NAME).dst,Xcode 将库放在那里。我有一个复制阶段来添加手册页。它的目标设置为“绝对路径”,路径设置为 $(DSTROOT)/usr/local/share/man/man3。当我运行它时,它会尝试将手册页复制到“/usr/local/share/man/man3”,因此我的权限被拒绝。换句话说,它就像没有设置 DSTROOT 一样。我尝试显式设置 DSTROOT 值而不是使用默认值。一样的。

如何让这个 Copy Files Build Phase 使用 DSTROOT 值?

【问题讨论】:

    标签: xcode xcode10.2


    【解决方案1】:

    不要使用绝对路径。一种方法是选择 Wrapper 作为目标并使用“../../usr/local/share/man/man3”作为相对路径。这假定包装器路径是 /Applications/$(PRODUCT_NAME).app,默认值。

    另一种方法是根本不使用复制文件构建阶段。使用运行脚本构建阶段。将 shell 设置为 /bin/bash 并使用如下脚本:

    set -x
    mandir="$DSTROOT/usr/local/share/man/man3"
    mkdir -p "$mandir"
    i=0
    while [$i -lt ${SCRIPT_INPUT_FILE_COUNT}] ; do
        name="SCRIPT_INPUT_FILE_$i"
        cp "${!name}" "$mandir/"
        let i=i+1
    done
    

    您可能希望在复制文件后chmod 和/或chown

    确保将您要复制的文件作为输入添加到构建阶段,并将输出路径(可以基于${DSTROOT})作为输出添加。

    【讨论】:

    • 你确定 Wrapper 默认为 /Applications 吗?我以为它指向$(BUILT_PRODUCTS_DIR)/$(Target).app。我会试试你的第二个建议。
    • 对不起,你是对的,我犯了一个错误;默认为/Applications/$(PRODUCT_NAME).app。这就是为什么我将两个父目录引用放在相对路径中。我已经测试了这两种方法,它们都有效。
    • 我使用 Wrapper 和路径 ../../$(DSTROOT)/usr/local/share/man/man3。感谢您的提示。
    • 不客气,但这没有任何意义。 $(DSTROOT) 是绝对路径,因此将其放在相对路径中并没有任何好处。最有可能的是,它只是评估空字符串并且没有效果。
    • 没有。将其粘贴在相对路径的中间,它只是扩展了该相对路径。 Wrapper + ../.. 将其带到 root /。从那里到 DSTROOT 所带的任何地方。 Xcode 默认将 DSTROOT 设置为 /tmp/$(PROJECT_NAME).dst ,这就是它的所在。包含 DSTROOT 的重点是您可以使用sudo xcodebuild ... DSTROOT=/ 进行真正的安装。我正在使用我显示的路径,它适用于安装到 /tmp/$(PROJECT_NAME).dst /
    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2011-05-20
    • 2022-12-04
    • 2013-08-11
    相关资源
    最近更新 更多