xcodebuild在哪里加载设置(来自Xcode项目或makefile中设置的内容)?

时间:2013-07-18 18:18:49

标签: xcode makefile xcodebuild

我有一个使用xcodebuild构建Xcode项目的makefile。 我的问题是

在调用makefile构建项目时,是否使用makefile(使用xcodebuild)中的设置或Xcode项目中的设置?

例如,如果我在makefile中有一些设置,例如:

SDKROOT =/Developer/SDKs/MacOSX10.5.sdk ARCHS="i386 x86_64"
CXXFLGS =-I/Users/XXYY/dev/Frameworks/Headers -DUNIX   (just an example to show where to check header files, this is different from what is set in the Xcode project)

target:
       xcodebuild build -target $@ -configuration Release 


 ... ...

是否会使用此处的设置(SDKROOT和CXXFLGS)?

如果答案是肯定的,那么我可以设置我的Xcode项目(称为项目A)链接到我自己的一些框架,放在$(HOME)/ Library / Frameworks中,然后将它发送给用户。

同时,当我构建这个项目A时,我可以将它设置为链接到框架,这是在我的makefile中构建项目A的同时构建的。

这样,当用户打开我的项目A时,框架将链接到他们的$ HOME / Library / Frameworks。 (该框架将被要求复制)

或者当我尝试发布一个项目(使用我自己的框架)时,我可以问我如何为自己的框架设置搜索路径? makefile中的进程将是:首先构建我的框架,然后是我的项目(显然,我的项目将链接到框架的新构建)。

如果我将框架的路径设置为链接到myframeworkfolder / build / Release / * .frameworks,则在将项目复制到其他用户时需要重置此路径。如果我将框架的路径设置为链接到例如/ Library / Frameworks,那么其他用户不需要更改路径。有人建议我应该做什么这个吗?或者我应该将框架的路径设置为/ Library / Frameworks,然后在完成构建框架后,将其复制到/ Library / Frameworks,然后构建我的项目。这是正确的方法吗?

感谢。

1 个答案:

答案 0 :(得分:4)

哇 - 这个问题包含了很多问题!让我们一个接一个地尝试解决它们:

  

是否会使用此处的设置(SDKROOT和CXXFLGS)?

不,您已成功制作了makefile变量,但它们不会被构建目标中的xcodebuild命令拾取 - 您需要在xcodebuild命令中将这些值设置为其他构建参数。从xcodebuild的手册页中,我们看到构建配置覆盖的这种赋值格式已从完整的命令格式提炼为[setting=value ...]

  

xcodebuild [-project projectname] -scheme schemename [-configuration configurationname] [-sdk [sdkfullpath | sdkname]                   [buildaction ...] [setting = value ...] [ - userdefault = value ...]

这意味着您必须在xcodebuild命令中以键值样式格式设置构建设置。重要的是要注意构建设置有一个层次结构 - 一些是由SDK定义的,然后可以在项目级别覆盖,可以在目标级别进一步覆盖,然后可以被xcodebuild设置部分覆盖,并且可以使用特定于xcodebuild的-xcconfig file最后一次覆盖。

那只是......很棒......有这么多地方注入构建设置间接,我们应该如何才能使这项工作成功?

这是项目设计师必须开始决定如何使用,重用,甚至滥用他们的代码,构建产品和框架的地方。共享或共同的构建设置越多,它应该在配置中越高,这样它将适用于最广泛的目标集。例如,SDKROOT是一种可能在项目级构建设置中设置的构建设置,因为该项目的消费者很可能希望使用与构建或使用这些框架相同的SDK。当然,你必须决定一个设置是否应该是所谓的全球性的。所有目标,并仔细推广/降级您的构建配置。由于您的源问题中的应用程序/框架/用例没有太多详细信息,因此SO社区无法提供具体的指导。相反,我会指出您的最佳实践方向,并留给您应用这些最佳实践。

现在,回到makefile ...如果要直接从终端运行此构建,并应用了这些自定义命令行设置,则xcodebuild命令将如下所示:

  

xcodebuild -project Testing.xcodeproj -target测试SDKROOT =' /Developer/SDKs/MacOSX10.5.sdk' ARCHS =' i386 x86_64' CXXFLGS =' -I / Users / XXYY / dev / Frameworks / Headers -DUNIX'

运行时,xcodebuild命令的前几行输出如下所示:

  

从命令行构建设置:
   ARCHS = i386 x86_64
   CXXFLGS = -I / Users / XXYY / dev / Frameworks / Headers -DUNIX
   SDKROOT = /Developer/SDKs/MacOSX10.5.sdk

然后可以将此命令移植到您的make文件中,只需进行相对较少的更改:

  

xcodebuild -project Testing.xcodeproj -target测试SDKROOT = $ {SDKROOT} ARCHS = $ {ARCHS} CXXFLGS = $ {CXXFLGS}

${FOO}符号是makefile变量替换语法 - 继续将新的xcodebuild行粘贴到makefile中,然后调整变量的值,最后调用make。您将像以前一样看到xcodebuild输出的前几行,它们反映了您对makefile变量所做的更改。

<强>恭喜!您现在已将makefile变量传递给Xcodebuild了!

潜在的缺陷:您的SDKROOT变量似乎使用old-school / Developer文件夹作为其SDK参考。目前还不清楚你是否打算从这个目录开始构建旧的10.5 SDK,但是我猜想这只是Xcode之前的Mac App Store版本的遗留问题。除非您的项目特定依赖于10.5,否则请考虑将SDKROOT路径升级到更新位置的更现代的SDK:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk

然后,您转向一系列有关框架的问题以及让他人可以访问它们的愿望。

我怀疑你真正在做的是制作一系列你希望在他们自己的项目中向其他人提供的应用程序级框架。

考虑机器安全性

如果是这种情况,那么将这些编译的框架安装到系统或用户框架库可能您想要做什么。首先,/ Library / Frameworks文件夹要求应用程序具有对计算机的root访问权限,这当然会对计算机造成非常小的安全风险。用户的Frameworks文件夹(〜/ Library / Frameworks)只是稍微安全一点,但是这样一个不常见的用例,默认情况下这样的文件夹不存在!实际上,向整个系统或整个用户推广框架的情况相对较少。

相反,由于您实际上只是在寻找有保证的已知位置,因此您可能希望将构建产品复制到项目目录本身内的文件夹中。然后,无论用户在何处复制项目文件夹,对主项目文件夹的子文件夹的相对引用始终是正确的!

当然,有几种选择:

  1. 在结尾处添加“复制文件”构建阶段,并将构建的产品从标准构建产品目录复制到主项目文件夹的已知子文件夹。和以前一样,您可以将项目引用更新为相对于项目的根目录。
  2. 将DSTROOT设置为$ {SRCROOT},将INSTALL_PATH设置为项目文件夹中的命名目录,并将DEPLOYMENT_LOCATION设置为1.这将使您的框架&#34;已安装&#34;对于项目中的此已知路径,您可以设置相对于此已知位置的所有其他标头和框架搜索路径。
  3. 根据您的项目需求,从长远来看,其中一个选项可能更容易维护 - 哪个选项完全取决于您的项目以及您预计用户将如何使用您的框架。有一件事是绝对肯定的,除非您对框架完全需要 root访问权限,否则最好一起避免这些库/框架目录。

    希望这可以让你指出正确的方向,如果你有任何后续问题,在这个答案结尾处发表评论并且我会看看我是否可以澄清,详细说明等。