Next: , Previous: Target Structure, Up: Target Macros


17.2 控制编译驱动器,gcc

你可以控制编译驱动器。

— Macro: SWITCH_TAKES_ARG (char)

一个C表达式,用来确定选项-char是否接受参数。 值应该为那个选项接受的参数个数,对于许多选项其为0。

缺省情况下,该宏被定义为DEFAULT_SWITCH_TAKES_ARG, 其可以正常处理标准的选项。除非你希望增加额外的接受参数的选项, 否则不需要定义SWITCH_TAKES_ARG。 任何重定义都应该先调用DEFAULT_SWITCH_TAKES_ARG,然后再检查额外的选项。

— Macro: WORD_SWITCH_TAKES_ARG (name)

一个C表达式,用来确定选项-name是否接受参数。 值应该为那个选项接受的参数个数,对于许多选项其为0。 该宏不同于SWITCH_TAKES_ARG,是用于选项名为多个字符的情况。

缺省情况下,该宏被定义为DEFAULT_WORD_SWITCH_TAKES_ARG, 其可以正常处理标准的选项。除非你希望增加额外的接受参数的选项, 否则不需要定义WORD_SWITCH_TAKES_ARG。 任何重定义都应该先调用DEFAULT_WORD_SWITCH_TAKES_ARG,然后再检查额外的选项。

— Macro: SWITCH_CURTAILS_COMPILATION (char)

一个C表达式,用来确定选项-char是否在生成可执行程序之前停止编译。 值为布尔型,如果选项确实停止生成可执行程序则为非0,否则为0。

缺省情况下,该宏被定义为DEFAULT_SWITCH_CURTAILS_COMPILATION, 其可以正常处理标准的选项。除非你希望增加额外的影响可执行程序生成的选项, 否则不需要定义SWITCH_CURTAILS_COMPILATION。 任何重定义都应该先调用DEFAULT_SWITCH_CURTAILS_COMPILATION, 然后再检查额外的选项。

— Macro: TARGET_OPTION_TRANSLATE_TABLE

如果定义,则为字符串对(pairs of strings)列表, 其中第一个字符串为gcc驱动程序的一个可能的命令行目标, 第二个字符串为空格分隔的(不支持tab和其它whitespace)选项列表, 用来替换第一个选项。 定义该列表的目标机要负责确保结果是有效的。替换选项不可以为--opt风格的, 它们必须为-opt风格的。该宏的目的是为选择multilib提供一种替换机制, 例如通过一个选项可以打开许多选项,其中一些用来选择multilib。 例如,在下面这个无意义的定义中, -malt-abi, -EB-mspoo会导致不同的multilib被选择:

          #define TARGET_OPTION_TRANSLATE_TABLE \
          { "-fast",   "-march=fast-foo -malt-abi -I/usr/fast-foo" }, \
          { "-compat", "-EB -malign=4 -mspoo" }
— Macro: DRIVER_SELF_SPECS

驱动器本身的specs列表。其应该为一个字符串数组的适当的初始化值, 并且不使用大括号包裹。

驱动器将这些specs应用到它自己的命令行上,位于加载缺省specs文件 (而不是由命令行指定的)和选择multilib目录或者运行任何子命令之间。 驱动器按照给定的顺序来应用它们,所以每个spec可以依赖于先前增加的选项。 还可以使用通常的方式,用‘%<option’来移除选项。

当一个port具有多个相互依赖的目标机选项时,该宏会有帮助。 它提供了一种标准化命令行的方法,使得其它specs的书写变得容易些。

如果不需要做任何事情的话,则不要定义该宏。

— Macro: OPTION_DEFAULT_SPECS

一个specs列表,用于支持驱动器中的配置时(configure-time)缺省选项 (即,--with选项)。 其应该为一个结构体数组的适当的初始化值,每个元素包含两个字符串, 并且不带有最外层的大括号对。

字符串对的第一项为缺省名字。其必须匹配目标机的config.gcc中的代码。 第二项为一个spec,当那个缺省名字被指定的时候会被应用。 在spec中,字符串‘%(VALUE)’出现的所有地方都将被缺省值替换。

驱动器将这些specs应用到它自己的命令行上, 位于加载缺省specs文件和处理DRIVER_SELF_SPECS之间, 使用与DRIVER_SELF_SPECS相同的机制。

如果不需要做任何事情的话,则不要定义该宏。

— Macro: CPP_SPEC

一个C字符串常量,告诉GCC驱动程序要传给CPP的选项。 其还可以指定如何将你传给GCC的选项转换成GCC传给CPP的选项。

如果不需要做任何事情的话,则不要定义该宏。

— Macro: CPLUSPLUS_CPP_SPEC

该宏类似于CPP_SPEC,只不过是用于C++而不是C。如果你不定义该宏, 则会使用CPP_SPEC的值(如果存在)来替代。

— Macro: CC1_SPEC

一个C字符串常量,告诉GCC驱动程序要传给cc1, cc1plus, f771和其它语言前端的选项。 其还可以指定如何将你传给GCC的选项转换成GCC传给前端的选项。

如果不需要做任何事情的话,则不要定义该宏。

— Macro: CC1PLUS_SPEC

一个C字符串常量,告诉GCC驱动程序要传给cc1plus的选项。 其还可以指定如何将你传给GCC的选项转换成GCC传给cc1plus的选项。

如果不需要做任何事情的话,则不要定义该宏。 注意在CC1_SPEC中定义的所有选项已经被传给cc1plus, 所以不需要在CC1PLUS_SPEC中重复CC1_SPEC的内容。

— Macro: ASM_SPEC

一个C字符串常量,告诉GCC驱动程序要传给汇编器的选项。 其还可以指定如何将你传给GCC的选项转换成GCC传给汇编器的选项。 参见文件sun3.h中的例子。

如果不需要做任何事情的话,则不要定义该宏。

— Macro: ASM_FINAL_SPEC

一个C字符串常量,告诉GCC驱动程序如何在运行正常的汇编器之后,来运行任何清除程序。 通常,不需要该宏。参见文件mips.h中的例子。

如果不需要做任何事情的话,则不要定义该宏。

— Macro: AS_NEEDS_DASH_FOR_PIPED_INPUT

如果驱动器应该传给汇编器一个由单横线-组成的参数, 来指示它从标准输入(其将为一个与编译器输出相连接的管道)读取时, 则定义该宏,并且不需要给出定义值。 该参数在任何指定输出文件名的-o选项后面被给出。

如果不定义该宏,则汇编器被认为在没有传给任何非选项参数时,才从标准输入读取。 如果你的汇编器根本不能从标准输入读取,则使用‘%{pipe:%e}’; 参见mips.h中的例子。

— Macro: LINK_SPEC

一个C字符串常量,告诉GCC驱动程序要传给连接器的选项。 其还可以指定如何将你传给GCC的选项转换成GCC传给连接器的选项。

如果不需要做任何事情的话,则不要定义该宏。

— Macro: LIB_SPEC

另一个C字符串常量,与LINK_SPEC的用法很相似。 两者的区别是LIB_SPEC用于传给连接器的命令的结尾处。

如果该宏没有被定义,则提供缺省的方式,从通常的地方来加载标准C库。 参见gcc.c

— Macro: LIBGCC_SPEC

另一个C字符串常量, 告诉GCC驱动程序如何以及什么时候将对libgcc.a的引用放到连接器的命令行中。 该常量同时被放在LIB_SPEC的值的前面和后面。

如果该宏没有被定义,则GCC驱动器提供了一个缺省的方式, 将字符串-lgcc传给连接器。

— Macro: REAL_LIBGCC_SPEC

缺省情况下,如果ENABLE_SHARED_LIBGCC被定义, 则LIBGCC_SPEC不直接被驱动程序使用,而是根据命令行标记-static, -shared, -static-libgcc-shared-libgcc的值, 进行修改,从而引用libgcc.a的不同版本。在一些目标机上,这些修改并不合适, 这样就可以定义REAL_LIBGCC_SPECREAL_LIBGCC_SPEC告诉驱动器如何将对libgcc的引用放到连接器命令行中, 不过不像LIBGCC_SPEC,它不经过修改,被直接使用。

— Macro: USE_LD_AS_NEEDED

一个宏,用于控制在REAL_LIBGCC_SPEC中提到的对LIBGCC_SPEC的修改。 如果非0,则会生成一个spec,当不使用任何-static, -static-libgcc-shared-libgcc来连接的时候, 将使用–as-needed和静态异常处理库所在位置的共享libgcc。

— Macro: LINK_EH_SPEC

如果定义,则该C字符串常量被增加到LINK_SPEC中。 当USE_LD_AS_NEEDED为0或者未定义时, 其还影响在REAL_LIBGCC_SPEC中提到的对LIBGCC_SPEC的修改。

— Macro: STARTFILE_SPEC

另一个C字符串常量,与LINK_SPEC的用法很相似。 两者的不同之处是STARTFILE_SPEC用于传给连接器的命令的最开始处。

如果该宏没有被定义,则会提供一种缺省方式, 从通常的地方来加载标准C启动(startup)文件。参见gcc.c

— Macro: ENDFILE_SPEC

另一个C字符串常量,与LINK_SPEC的用法很相似。 两者的不同之处是ENDFILE_SPEC用于传给连接器的命令的最末尾处。

如果不需要做任何事情的话,则不要定义该宏。

— Macro: THREAD_MODEL_SPEC

GCC -v将会打印GCC被配置使用的线程模式。然而,在有些平台上这是无法工作的, 像AIX 4.3。对于这样的平台,将THREAD_MODEL_SPEC定义为没有空格的字符串来 命名可识别的线程模式的名字。%*为该宏的缺省值, 将扩展为在config.gcc中设置的thread_file的值。

— Macro: SYSROOT_SUFFIX_SPEC

定义该宏,当GCC使用sysroot被配置时,来为目标机的sysroot增加一个suffix。 这将导致GCC在sysroot+suffix下查找usr/lib等。

— Macro: SYSROOT_HEADERS_SUFFIX_SPEC

定义该宏,当GCC使用sysroot被配置时,来为目标机的sysroot增加一个headers_suffix。 这将导致GCC将更新的sysroot+headers_suffix传给CPP, 使其在sysroot+headers_suffix下查找usr/include等。

— Macro: EXTRA_SPECS

定义该宏,来提供放在specs文件中, 可以被各种specification,像CC1_SPEC,使用的额外的specification。

定义应该为一个结构体数组的初始化值,其包含一个字符串常量, 定义了specification的名字,以及一个字符串常量,提供相应的specification。

如果不需要做任何事情的话,则不要定义该宏。

当一种体系结构包含多个相关的目标机,所具有的各种..._SPECS彼此很相似 的时候,EXTRA_SPECS会很有用,维护者会希望有一个地方来集中保存这些定义。

例如,PowerPC System V.4的目标机使用EXTRA_SPECS, 在System V调用序列被使用时,来定义_CALL_SYSV, 在较老的基于AIX的调用序列被使用时,来定义_CALL_AIX

config/rs6000/rs6000.h目标机文件这样定义:

          #define EXTRA_SPECS \
            { "cpp_sysv_default", CPP_SYSV_DEFAULT },
          
          #define CPP_SYS_DEFAULT ""

config/rs6000/sysv.h目标机文件这样定义:

          #undef CPP_SPEC
          #define CPP_SPEC \
          "%{posix: -D_POSIX_SOURCE } \
          %{mcall-sysv: -D_CALL_SYSV } \
          %{!mcall-sysv: %(cpp_sysv_default) } \
          %{msoft-float: -D_SOFT_FLOAT} %{mcpu=403: -D_SOFT_FLOAT}"
          
          #undef CPP_SYSV_DEFAULT
          #define CPP_SYSV_DEFAULT "-D_CALL_SYSV"

config/rs6000/eabiaix.h目标机文件将CPP_SYSV_DEFAULT定义为:

          #undef CPP_SYSV_DEFAULT
          #define CPP_SYSV_DEFAULT "-D_CALL_AIX"
— Macro: LINK_LIBGCC_SPECIAL_1

定义该宏,如果驱动程序应该找到库libgcc.a。 如果没有定义该宏,则驱动程序将参数-lgcc传给连接器,告诉连接器来查找。

— Macro: LINK_GCC_C_SEQUENCE_SPEC

指定给连接器的libgcc和libc的顺序。缺省为%G %L %G

— Macro: LINK_COMMAND_SPEC

一个C字符串常量,给出执行连接器所需的完整的命令行。当定义时, 每次在gcc.c中对连接器命令行的修改,你都需要更新你的port。 因此,只有当你需要完全重定义所调用的连接器的命令行,并且没有其他方式来完成时, 才定义该宏。可以通过LINK_GCC_C_SEQUENCE_SPEC来替代该宏。

— Macro: LINK_ELIMINATE_DUPLICATE_LDIRECTORIES

一个非零值, 使得collect2从连接命令中移除重复的-Ldirectory搜索目录。 如果移除重复的搜索目录会改变连接器的语法,则不要定义为非零。

— Macro: MULTILIB_DEFAULTS

定义该宏为字符串数组的初始化C表达式,用来告诉驱动器程序对于该目标机, 哪些选项是缺省的,因此当使用MULTILIB_OPTIONS时,不需要单独处理。

如果在target makefile片段中没有定义MULTILIB_OPTIONS, 或者如果在MULTILIB_OPTIONS中列出的选项中没有被设为缺省的, 则不要定义该宏。参见Target Fragment

— Macro: RELATIVE_PREFIX_NOT_LINKDIR

定义该宏来告诉gcc, 如果前缀指示了一个绝对的文件名, 则其应该只将-B的前缀转换成-L连接器选项,

— Macro: MD_EXEC_PREFIX

如果定义,该宏为一个可选前缀,其在STANDARD_EXEC_PREFIX之后进行尝试。 当使用-b选项,或者编译器被构建为交叉编译器时, 将不搜索MD_EXEC_PREFIX。如果你定义了MD_EXEC_PREFIX, 则要确保将其增加到configure.in中用于查找汇编器的目录列表中。

— Macro: STANDARD_STARTFILE_PREFIX

定义该宏为C字符串常量, 如果你希望覆盖将libdir作为前缀来搜索起始文件crt0.o等的标准选择。 当构建为交叉编译器时,STANDARD_STARTFILE_PREFIX不被搜索。

— Macro: STANDARD_STARTFILE_PREFIX_1

定义该宏为C字符串常量,如果你希望覆盖在缺省前缀之后, 将/lib作为前缀来搜索起始文件crt0.o等的标准选择。 当构建为交叉编译器时,STANDARD_STARTFILE_PREFIX_1不被搜索。

— Macro: STANDARD_STARTFILE_PREFIX_2

定义该宏为C字符串常量,如果你希望覆盖在缺省前缀之后, 将/lib作为前缀来搜索起始文件crt0.o等的标准选择。 当构建为交叉编译器时,STANDARD_STARTFILE_PREFIX_2不被搜索。

— Macro: MD_STARTFILE_PREFIX

如果定义,该宏提供了额外的前缀,在标准前缀之后被尝试。 当使用-b选项,或者编译器被构建为交叉编译器时, 将不搜索MD_EXEC_PREFIX

— Macro: MD_STARTFILE_PREFIX_1

如果定义,该宏提供了另一个额外的前缀,在标准前缀之后被尝试。 当使用-b选项,或者编译器被构建为交叉编译器时,其将不被搜索。

— Macro: INIT_ENVIRONMENT

定义该宏为C字符串常量,如果你希望为驱动器调用的程序,例如汇编器和连接器, 来设置的环境变量。驱动器将该宏的值传给putenv来初始化需要的环境变量。

— Macro: LOCAL_INCLUDE_DIR

定义该宏为C字符串常量,如果你希望覆写当尝试搜索局部头文件时, 将/usr/local/include作为缺省前缀的标准选择。 在搜索顺序中,LOCAL_INCLUDE_DIR位于SYSTEM_INCLUDE_DIR之前。

交叉编译器既不搜索/usr/local/include,也不搜索它的替换者。

— Macro: SYSTEM_INCLUDE_DIR

定义该宏作为C字符串常量, 如果你希望指定一个系统特定的目录在标准目录之前来搜索头文件。 在搜索顺序中,SYSTEM_INCLUDE_DIR位于STANDARD_INCLUDE_DIR之前。

交叉编译器不使用该宏,并且不搜索所指定的目录。

— Macro: STANDARD_INCLUDE_DIR

定义该宏为C字符串常量, 如果你希望覆写将/usr/include作为缺省前缀来尝试搜索头文件的标准选择。

交叉编译器忽略该宏,并且不搜索/usr/include和它的替换者。

— Macro: STANDARD_INCLUDE_COMPONENT

“component”对应于STANDARD_INCLUDE_DIR。关于组件的描述, 参见下面的INCLUDE_DEFAULTS。如果你没有定义该宏,则不使用组件。

— Macro: INCLUDE_DEFAULTS

定义该宏,如果你希望覆写include文件的全部缺省搜索路径。对于一个本地编译器, 缺省搜索路径通常由GCC_INCLUDE_DIR, LOCAL_INCLUDE_DIR, SYSTEM_INCLUDE_DIR, GPLUSPLUS_INCLUDE_DIRSTANDARD_INCLUDE_DIR组成。另外,GPLUSPLUS_INCLUDE_DIRGCC_INCLUDE_DIRMakefile自动定义,并指定为GCC的私有搜索区域。 目录GPLUSPLUS_INCLUDE_DIR只用于C++程序。

该定义为一个结构体数组的初始化值。 每个数组元素具有四个元素:目录名(字符串常量), 组件名(也是字符串常量),一个标志用来指示只用于C++, 以及一个标志用来表示当编译C++时,对该目录下include进来的代码, 不需要使用extern ‘C进行包裹。 使用空元素来标记数组的结尾。

组件名指出了include文件属于什么GNU包,如果存在,则全部使用大写字母。 例如,可能为‘GCC’或‘BINUTILS’。 如果程序包是商家提供的操作系统的一部分,则将名字写为‘0’。

例如,这是用于VAX/VMS的定义:

          #define INCLUDE_DEFAULTS \
          {                                       \
            { "GNU_GXX_INCLUDE:", "G++", 1, 1},   \
            { "GNU_CC_INCLUDE:", "GCC", 0, 0},    \
            { "SYS$SYSROOT:[SYSLIB.]", 0, 0, 0},  \
            { ".", 0, 0, 0},                      \
            { 0, 0, 0, 0}                         \
          }

这些是尝试查找exec文件的前缀顺序:

  1. 用户使用-B指定的前缀。
  2. 环境变量GCC_EXEC_PREFIX, 或者如果GCC_EXEC_PREFIX没有被设置并且编译器没有被安装到配置时的prefix处, 则搜索编译器实际被安装的位置。
  3. 环境变量COMPILER_PATH指定的目录。
  4. STANDARD_EXEC_PREFIX,如果编译器安装在配置时的prefix处。
  5. 位置/usr/libexec/gcc/,仅当是本地编译器。
  6. 位置/usr/lib/gcc/,仅当是本地编译器。
  7. MD_EXEC_PREFIX,如果定义,仅当是本地编译器。

这些是尝试查找启动文件的前缀顺序:

  1. 用户使用-B指定的前缀。
  2. 环境变量GCC_EXEC_PREFIX,或者基于工具链的安装位置被自动确定的值。
  3. 由环境变量LIBRARY_PATH指定的目录(或者port特定的名字,只用于本地编译器, 交叉编译器不使用)。
  4. STANDARD_EXEC_PREFIX,但只当工具链被安装在配置的prefix处, 或者为本地编译器。
  5. 位置/usr/lib/gcc/,仅当是本地编译器。
  6. MD_EXEC_PREFIX,如果定义,仅当是本地编译器。
  7. MD_STARTFILE_PREFIX,如果定义, 仅当为本地编译器,或者具有目标机系统根目录(system root)。
  8. MD_STARTFILE_PREFIX_1,如果定义, 仅当为本地编译器,或者具有目标机系统根目录。
  9. STANDARD_STARTFILE_PREFIX,带有任何sysroot的修改。 如果该路径相关,则会加上GCC_EXEC_PREFIX前缀和机器后缀, 或者STANDARD_EXEC_PREFIX和机器后缀。
  10. STANDARD_STARTFILE_PREFIX_1,仅当为本地编译器, 或者具有目标机系统根目录。该宏的缺省值为/lib/
  11. STANDARD_STARTFILE_PREFIX_2,仅当为本地编译器, 或者具有目标机系统根目录。该宏的缺省值为/usr/lib/