bfin-xxx-gcc中options.h的生成

本文详细解析了GCC-4.3.1在Blackfin系列DSP上的编译过程中的Makefile配置,特别是如何通过awk脚本生成options.h文件的过程及其依赖项。

快乐虾

http://blog.youkuaiyun.com/lights_joy/

lights@hb165.com

   

本文适用于

gcc- 4.3.1

Blackfin系列DSP

Visual Studio 2005

   

欢迎转载,但请保留作者信息

 

 

 

 

Makefile.in中有这样的语句:

options.h: s-options-h ; @true

s-options-h: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opth-gen.awk

     $(AWK) -f $(srcdir)/opt-functions.awk -f $(srcdir)/opth-gen.awk /

            < $< > tmp-options.h

     $(SHELL) $(srcdir)/../move-if-change tmp-options.h options.h

     $(STAMP) $@

它将取决于optionlist文件,再查optionlist

optionlist: s-options ; @true

s-options: $(ALL_OPT_FILES) Makefile $(srcdir)/opt-gather.awk

     $(AWK) -f $(srcdir)/opt-gather.awk $(ALL_OPT_FILES) > tmp-optionlist

     $(SHELL) $(srcdir)/../move-if-change tmp-optionlist optionlist

     $(STAMP) s-options

在这里用到了一个变量ALL_OPT_FILES,看看它是什么东西:

ALL_OPT_FILES=$(lang_opt_files) $(extra_opt_files)

查一下lang_opt_files,在configure脚本中这样定义:

for lang in ${srcdir}/*/config-lang.in

do

……………….

     if test -f $srcdir/$subdir/lang.opt; then

         lang_opt_files="$lang_opt_files $srcdir/$subdir/lang.opt"

     fi

……………….

done

从这里我们就可以知道$lang_opt_files的值将为

”treelang/lang.opt”

再找extra_opt_files,在configure脚本有如下语句:

# Convert extra_options into a form suitable for Makefile use.

extra_opt_files=

for f in $extra_options; do

  extra_opt_files="$extra_opt_files /$(srcdir)/config/$f"

done

在这里用到了extra_options变量,在config.gcc中对这个值进行了设置:

if test -f ${srcdir}/config/${cpu_type}/${cpu_type}.opt

then

     extra_options="${extra_options} ${cpu_type}/${cpu_type}.opt"

fi

bfin*-uclinux*)

     tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h linux.h bfin/uclinux.h"

     tmake_file=bfin/t-bfin-uclinux

     tm_defines="${tm_defines} UCLIBC_DEFAULT=1"

     extra_options="${extra_options} linux.opt"

     use_collect2=no

     ;;

因此extra_tions的值为:

“bfin/bfin.opt linux.opt”

回到extra_opt_files的定义上来,由extra_options的值可知,extra_opt_files的值将为:

“config/bfin/bfin.opt config/linux.opt”

这样我们就可以知道在MakefileALL_OPT_FILES这个变量的值为:

”treelang/lang.opt  config/bfin/bfin.opt config/linux.opt”

执行awk命令,可以得到optionlist文件的内容:

LanguageTreelang

flexer-traceTreelangTrace lexical analysis

fparser-traceTreelangTrace the parsing process

mcpu=Target RejectNegative JoinedSpecify the name of the target CPU

mcsync-anomalyTarget Report Var(bfin_csync_anomaly) Init(-1)Work around a hardware anomaly by adding a number of NOPs before aCSYNC or SSYNC instruction.

mfast-fpTarget Report Mask(FAST_FP)Link with the fast floating-point library

mfdpicTarget Report Mask(FDPIC)Enable Function Descriptor PIC mode

mglibcTarget RejectNegative Report InverseMask(UCLIBC, GLIBC) Var(linux_uclibc) VarExistsUse GNU libc instead of uClibc

mid-shared-libraryTarget Report Mask(ID_SHARED_LIBRARY)Enabled ID based shared library

minline-pltTarget Report Mask(INLINE_PLT)Enable inlining of PLT in function calls

mleaf-id-shared-libraryTarget Report Mask(LEAF_ID_SHARED_LIBRARY)Generate code that won't be linked against any other ID shared libraries,but may be used as a shared library.

mlong-callsTarget Report Mask(LONG_CALLS)Avoid generating pc-relative calls; use indirection

mlow64kTarget Report Mask(LOW_64K)Program is entirely located in low 64k of memory

momit-leaf-frame-pointerTarget Report Mask(OMIT_LEAF_FRAME_POINTER)Omit frame pointer for leaf functions

msep-dataTarget Report Mask(SEP_DATA)Enable separate data segment

mshared-library-id=Target RejectNegative Joined UInteger Var(bfin_library_id)ID of shared library to build

msimTarget RejectNegativeUse simulator runtime

mspecld-anomalyTarget Report Var(bfin_specld_anomaly) Init(-1)Avoid speculative loads to work around a hardware anomaly.

mstack-check-l1Target Report Mask(STACK_CHECK_L1)Do stack checking using bounds in L1 scratch memory

muclibcTarget RejectNegative Report Mask(UCLIBC) Var(linux_uclibc) Init(UCLIBC_DEFAULT ? OPTION_MASK_UCLIBC : 0)Use uClibc instead of GNU libc

vTreelang

yTreelang

再执行awk命令生成options.h

/* This file is auto-generated by opth-gen.awk.  */

 

#ifndef OPTIONS_H

#define OPTIONS_H

 

extern int target_flags;

extern int target_flags_explicit;

 

extern int bfin_csync_anomaly;

extern int linux_uclibc;

extern int bfin_library_id;

extern int bfin_specld_anomaly;

extern int linux_uclibc;

 

#define MASK_FAST_FP (1 << 0)

#define MASK_FDPIC (1 << 1)

#define MASK_ID_SHARED_LIBRARY (1 << 2)

#define MASK_INLINE_PLT (1 << 3)

#define MASK_LEAF_ID_SHARED_LIBRARY (1 << 4)

#define MASK_LONG_CALLS (1 << 5)

#define MASK_LOW_64K (1 << 6)

#define MASK_OMIT_LEAF_FRAME_POINTER (1 << 7)

#define MASK_SEP_DATA (1 << 8)

#define MASK_STACK_CHECK_L1 (1 << 9)

#define OPTION_MASK_UCLIBC (1 << 0)

 

#define TARGET_FAST_FP ((target_flags & MASK_FAST_FP) != 0)

#define TARGET_FDPIC ((target_flags & MASK_FDPIC) != 0)

#define TARGET_ID_SHARED_LIBRARY ((target_flags & MASK_ID_SHARED_LIBRARY) != 0)

#define TARGET_INLINE_PLT ((target_flags & MASK_INLINE_PLT) != 0)

#define TARGET_LEAF_ID_SHARED_LIBRARY ((target_flags & MASK_LEAF_ID_SHARED_LIBRARY) != 0)

#define TARGET_LONG_CALLS ((target_flags & MASK_LONG_CALLS) != 0)

#define TARGET_LOW_64K ((target_flags & MASK_LOW_64K) != 0)

#define TARGET_OMIT_LEAF_FRAME_POINTER ((target_flags & MASK_OMIT_LEAF_FRAME_POINTER) != 0)

#define TARGET_SEP_DATA ((target_flags & MASK_SEP_DATA) != 0)

#define TARGET_STACK_CHECK_L1 ((target_flags & MASK_STACK_CHECK_L1) != 0)

#define OPTION_UCLIBC ((linux_uclibc & OPTION_MASK_UCLIBC) != 0)

 

#define OPTION_GLIBC ((linux_uclibc & OPTION_MASK_UCLIBC) == 0)

 

#define CL_Treelang   (1 << 0)

#define CL_LANG_ALL   ((1 << 1) - 1)

 

enum opt_code

{

  OPT_flexer_trace,                          /* -flexer-trace */

  OPT_fparser_trace,                         /* -fparser-trace */

  OPT_mcpu_,                                 /* -mcpu= */

  OPT_mcsync_anomaly,                        /* -mcsync-anomaly */

  OPT_mfast_fp,                              /* -mfast-fp */

  OPT_mfdpic,                                /* -mfdpic */

  OPT_mglibc,                                /* -mglibc */

  OPT_mid_shared_library,                    /* -mid-shared-library */

  OPT_minline_plt,                           /* -minline-plt */

  OPT_mleaf_id_shared_library,               /* -mleaf-id-shared-library */

  OPT_mlong_calls,                           /* -mlong-calls */

  OPT_mlow64k,                               /* -mlow64k */

  OPT_momit_leaf_frame_pointer,              /* -momit-leaf-frame-pointer */

  OPT_msep_data,                             /* -msep-data */

  OPT_mshared_library_id_,                   /* -mshared-library-id= */

  OPT_msim,                                  /* -msim */

  OPT_mspecld_anomaly,                       /* -mspecld-anomaly */

  OPT_mstack_check_l1,                       /* -mstack-check-l1 */

  OPT_muclibc,                               /* -muclibc */

  OPT_v,                                     /* -v */

  OPT_y,                                     /* -y */

  N_OPTS

};

 

#endif /* OPTIONS_H */

 

 

参考资料

无心插柳-在vs2005中编译GCC4( 2008-1-13 )

gcc交叉编译的实现( 2008-1-25 )

vs2005下编译gcc:工程文件( 2008-1-30 )

asm_out_filegcc汇编代码的生成( 2008-1-30 )

gcc4.1中的machine_mode( 2008-2-1 )

gcc 4.3 configure脚本学习(1):前言( 2008-4-23 )

gcc 4.3 configure脚本学习(2):Be Bourne compatible( 2008-4-24 )

gcc 4.3 configure脚本学习(3):NLS nuisances( 2008-4-24 )

bfin-gcc-4.3.1config.h的生成( 2008-8-5 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(1):输出注释( 2008-8-5 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(2):Shell检测( 2008-8-5 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(3):文件配置( 2008-8-6 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(4):帮助信息输出( 2008-8-6 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(5):参数判断( 2008-8-6 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(6):子目录获取( 2008-8-6 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(7):创建临时目录( 2008-8-6 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(8):配置文件生成( 2008-8-6 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(9):头文件生成( 2008-8-6 )

bfin-xxx-gcc-4.3.1auto-host.h的生成( 2008-8-6 )

bfin-xxx-gccmultilib.h的生成( 2008-8-7 )

bfin-xxx-gcctm.h的生成( 2008-8-7 )

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌云阁主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值