use*_*064 3 xcode makefile xcodebuild
我有一个使用 xcodebuild 构建 Xcode 项目的 makefile。我的问题是
是 makefile 中的设置(使用 xcodebuild)还是调用 makefile 来构建项目时将使用的 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
... ...
Run Code Online (Sandbox Code Playgroud)
会不会用到这里的设置(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,然后构建我的项目。这是正确的方法吗?
谢谢。
哇——这个问题包含很多问题!让我们尝试一一解决它们:
会不会用到这里的设置(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 Testing 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 变量似乎使用老式的 /Developer 文件夹作为其 SDK 参考。目前尚不清楚您是否打算针对较旧的 10.5 SDK 从该目录进行构建,但我猜测这只是 Mac App Store 之前版本的 Xcode 的剩余部分。除非您的项目对 10.5 有特定的依赖,否则请考虑将您的 SDKROOT 路径升级到较新位置的更现代的 SDK:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk
然后,您会转向一系列关于框架的问题,以及让其他人可以访问它们的愿望。
我怀疑您真正在做的是制作一系列应用程序级框架,您希望在他们自己的项目中提供给其他人。
考虑机器安全
如果是这种情况,那么将这些编译好的框架安装到系统或用户框架库可能不是您想要做的。首先,/Library/Frameworks 文件夹要求应用程序具有对机器的 root 访问权限,这当然会对机器构成重大安全风险。用户的 Frameworks 文件夹 (~/Library/Frameworks) 只是稍微安全一点,但它也是一个不常见的用例,默认情况下不存在这样的文件夹!实际上,将框架推广到整个系统或整个用户的情况相对较少。
相反,由于您实际上只是在寻找一个有保证的已知位置,您可能希望将构建产品复制到项目目录本身内的文件夹中。那么无论您的用户将项目文件夹复制到何处,对主项目文件夹的子文件夹的相对引用将始终正确!
当然,有几个选择:
根据您的项目需求,从长远来看,这些选项之一可能更容易维护——哪一个将完全取决于您的项目以及您预计用户将如何使用您的框架。有一件事是绝对确定的,除非您绝对需要对您的框架进行 root 访问,否则最好同时避免那些 Library/Frameworks 目录。
希望这能让您指向正确的方向,如果您有任何后续问题,请在此答案的末尾发表评论,我会看看我是否可以澄清、详细说明等。
| 归档时间: |
|
| 查看次数: |
1690 次 |
| 最近记录: |