【问题标题】:Where Do Xcode Default Flags Come From?Xcode 默认标志从何而来?
【发布时间】:2023-03-05 22:20:01
【问题描述】:

动机

Xcode 提供了操作所需的任何编译器/链接器工具链的能力,但默认 Xcode 配置假定 Mac SDK 并添加了许多默认标志,这些标志不会出现在项目本身的任何位置。

如果可以禁用/删除这些标志,Xcode 的本地构建系统可以用于控制外部编译器/工具链,例如 xtensa-elf-gcc 和周边工具,同时获得 Xcode 的代码突出显示和 clang 的分析的好处。与 Xcode 直接支持的外部 makefile 选项相比,这将是一个非常可取的选项,它与 Xcode 的其余部分没有特别好的集成。

动机 TL;DR

如果可以禁用 Xcode 的默认标志,Xcode 可以直接支持为 ESP8266 编译代码(使用 CC=xtensa-elf-gcc)。

xtensa-elf-gcc 不支持默认标志(假定为 Mac OS)并阻止其使用。

标志是这不起作用的唯一原因。

示例

最基本的编译会生成带有这些标志的 clang 命令:

-xc

-arch x86_64

-fmessage-length=0

-fdiagnostics-show-note-include-stack

-fmacro-backtrace-limit=0

-std=gnu99

-Wno-trigraphs

-fpascal 字符串

-O0

-fno-普通

-Wno-missing-field-initializers

-Wno-missing-prototypes

-Werror=返回类型

-W文档

-Wunreachable-code

-Werror=deprecated-objc-isa-usage

-Werror=objc-root-class

-Wno-missing-braces

-括号

-W开关

-Wunused-function

-Wno-unused-label

-Wno-unused-parameter

-Wunused-变量

-Wunused-value

-空体

-W条件未初始化

-Wno-unknown-pragmas

-Wno-shadow

-Wno-four-char-constants

-Wno-conversion

-W常量转换

-Wint-转换

-Wbool-转换

-Wenum-转换

-Wshorten-64-to-32

-Wpointer-sign

-Wno-newline-eof

-DDEBUG=1

-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk

-fasm-blocks

-fstrict-aliasing

-Wdeprecated-declarations

-mmacosx-version-min=10.12

-g

-Wno-sign-conversion

-Winfinite-递归

-iquote [生成的文件.hmap]

-I[own-target-headers.hmap]

-I[all-target-headers.hmap]

-iquote [project-headers.hmap]

-I[构建/产品/调试/包含]

-I[Build/Intermediates/libESP8266.build/Debug/libESP8266.build/DerivedSources/x86_64]

-I[Build/Intermediates/libESP8266.build/Debug/libESP8266.build/DerivedSources]

-F[构建/产品/调试]

-MMD

-MT 依赖关系

-MF [Build/Intermediates/libESP8266.build/Debug/libESP8266.build/Objects-normal/x86_64/main.d]

--serialize-diagnostics [Build/Intermediates/libESP8266.build/Debug/libESP8266.build/Objects-normal/x86_64/main.dia]

-c /Users/asher/Projects/Arduino/libESP8266/main.c

-o [main.o]

显然,其中一些或多或少是必要的(-c、-o、各种 -Is 等),但大多数应该是完全可选的。

问题

那么他们来自哪里?我已经尝试编辑基本模板,即使在减少所有与 Mac 相关的方面后,结果也是一样的。它们是否以编程方式添加到某处?如果是这样,它(大概)在 DevToolsCore 或 IDEFoundation 中?

【问题讨论】:

  • 我通过让 cmake 构建 Xcode 项目来做到这一点。
  • 这是我想避免的 :) Xcode 在不负责构建时不会提供所有相同的界面优势。
  • 你可以通过选项-GXcode让cmake构建一个Xcode项目
  • 但是你会得到一个外部的 make 目标。
  • 你解决过这个问题吗? Xcode 只是抛出一堆我不想要的默认标志......

标签: c++ xcode gcc


【解决方案1】:

它们来自 XCode“构建设置”。您可以通过“构建选项”添加自己的编译器。这不适合你吗?

你也可以在 XCode 中配置Alternative Toolchains(没试过)。

【讨论】:

  • 不幸的是这里不是一个解决方案。您确实可以添加自己的构建设置,但您不能删除默认情况下存在的所有设置。其中一些,例如警告,可以通过编辑 TemplateInfo.plist 来删除,但其他一些,例如 -arch 和 -isysroot,在这里似乎不可修改。如果您想出了一些方法,请分享。
  • 另外,如果您(或其他任何人)知道如何实际创建替代工具链,请分享。您链接到的信息仅涉及如何利用现有的替代工具链,假设它们是为 Xcode(即 swift 工具链)构建的。
  • 明确一点:改变编译器不是问题。问题是一旦编译器改变了,仍然使用相同的标志,新的编译器不能识别所有的标志。
  • 其实编辑 TemplateInfo.plist 似乎不会影响输出的警告。
【解决方案2】:

有一个答案,但不是一个方便的答案。

Xcode 构建实现可以在以下位置找到:

/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin

核心定义似乎是从各种插件中的 .xcspec 文件组装而成的,这些插件可以在以下位置找到:

/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins

特别是对于 clang 和 ld,请查看:

/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/Clang\ LLVM\ 1.0.xcplugin/Contents/Resources/Clang\ LLVM\ 1.0.xcspec
/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/CoreBuildTasks.xcplugin/Contents/Resources/Ld.xcspec

根据您要寻找的内容,您可能需要挖掘。如果您正在寻找特定的构建设置,请在 Xcode 构建设置检查器中找到它,然后在文本内容中搜索相应的变量名称。

理论上,.xcspec 文件允许包标识符和继承描述组合您想要的任何构建结果。据我所知,这些细节没有很好的记录/根本没有记录。

由于 Apple 已将 Xcode 插件仅限于 Apple,因此可能无法在用户级别以合理的方式扩展构建定义。可以修改默认系统,但最终只能得到修改后的版本。

也许其他人已经想出或稍后会想出更多关于如何利用此设置的信息,在这种情况下,我将更新答案以反映我们的最佳知识。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多