6

我想并行安装 XCode,并使用DEVELOPER_DIR环境变量在它们之间进行选择。这样做的目的是使用 的结果xcrun -f --sdk macosx clang来确定适当的 C 编译器,然后在脚本或构建系统中使用它。

CC=$(DEVELOPER_DIR=<something> xcrun -f --sdk macosx clang)

我的问题是在使用通过找到的工具时是否DEVELOPER_DIR需要保持设置,或者是否可以在执行过程中设置它,如上所述,然后在默认环境中使用返回的工具,而不需要仍然设置。xcrunxcrunDEVELOPER_DIR

换句话说,虽然xcrun显然依赖于 的值DEVELOPER_DIR,但工具本身是否也依赖于它?两者之间是否存在有意义的区别:

  • DEVELOPER_DIR=<whatever> command CC=$(xcrun -f --sdk macosx clang)
  • command CC=$(DEVELOPER_DIR=<whatever> xcrun -f --sdk macosx clang)

第二个正确吗?还是只有第一个?

4

1 回答 1

2

我想并行安装 XCode,并使用 DEVELOPER_DIR 环境变量在它们之间进行选择。

可以安装两个或多个版本的 Xcode。在它们之间进行选择的通常方法是使用xcode-select命令,但该命令的手册页似乎确实说您可以通过自己设置DEVELOPER_DIR环境变量来为当前会话完成相同的事情。以下是该--switch选项的文档说明:

将活动开发者目录设置为给定路径,例如 /Applications/Xcode-DP.app。此命令必须以超级用户权限运行(请参阅 sudo(8)),并将影响系统上的所有用户。要设置没有超级用户权限或仅用于当前 shell 会话的路径,请改用 DEVELOPER_DIR 环境变量(请参阅 ENVIRONMENT)。

但是,您还应该注意“环境”部分中给出的建议:

请注意,由于历史原因,开发者目录被认为是 Xcode 应用程序中的开发者内容目录(例如 /Applications/Xcode.app/Contents/Developer)。您可以将环境变量设置为实际的 Developer 内容目录或 Xcode 应用程序目录——代码选择提供的 shim 将自动将环境变量转换为完整的 Developer 内容路径。

所以<whatever>在你的问题中应该指定Developer目录的完整路径,而不仅仅是 Xcode 应用程序。

换句话说,虽然 xcrun 显然确实依赖于 DEVELOPER_DIR 的值,但工具本身是否也依赖于它?两者之间是否存在有意义的区别:

DEVELOPER_DIR=<whatever> command CC=$(xcrun -f --sdk macosx clang)

用于xcrun查找工具以便您可以自己调用它们并且担心何时设置和取消设置DEVELOPER_DIR似乎过于复杂。根据xcode-select文档,所有“垫片”都尊重DEVELOPER_DIR设置。这里的“Shims”是指/usr/bin. 只要正确设置了该环境变量,您就可以调用 '/usr/bin/clang' 而不是找到的任何内容,xcrun并将/usr/bin/clang调用. 据推测,您问这个问题是因为您正在编写某种构建脚本,因此在该脚本的早期设置然后使用命令应该没有问题。clangDEVELOPER_DIRDEVELOPER_DIR/usr/bin

command CC=$(DEVELOPER_DIR=<whatever> xcrun -f --sdk macosx clang)

程序从其父进程继承环境。在这里,您可以找到clang要使用的正确副本,但您将在DEVELOPER_DIR未设置的环境中调用它。这是否重要取决于您使用的工具是否调用任何其他工具。老实说,我不知道是否有任何工具确实调用了其他工具,但是像这样的工具xcodebuild会调用其中许多工具并因此依赖于DEVELOPER_DIR正确设置似乎是合乎逻辑的。

简而言之,DEVELOPER_DIR在构建脚本中根据需要进行设置没有缺点,并且尝试仅在调用中指定它xcrun似乎不如替代方法可靠。

于 2017-03-19T16:57:09.427 回答