【RT-Thread学习笔记】使用scons命令生成静态库

描述

1 问题来源

本问题来源于RT-Thread的技术论坛的一个常见问题,当时我回答了这个问题,很荣幸拿了一个最佳答案,为了能够再次消化并进行知识点沉淀,我把这个问题再次抛到这里。 原问题,请戳这里:scons 命令buildlib使用方法

scons

2 实践分析

2.1 不懂就要问

既然不知道怎么用scons,那么我们先看到它的帮助信息,以下命令在scons的主目录执行,即可以找到Sconscript的目录下执行:

  1. rt-thread/bsp/qemu-vexpress-a9$ scons -h
  2. scons: Reading SConscript files ...
  3. drivers/SConscript
  4. applications/SConscript
  5. [, , ]
  6. scons: done reading SConscript files.
  7. usage: scons [OPTION] [TARGET] ...
  8.  
  9. SCons Options:
  10.   -b, -d, -e, -m, -S, -t, -w, --environment-overrides, --no-keep-going,
  11.   --no-print-directory, --print-directory, --stop, --touch
  12.                               Ignored for compatibility.
  13.   -c, --clean, --remove       Remove specified targets and dependencies.
  14.   -C DIR, --directory=DIR     Change to DIR before doing anything.
  15.   --cache-debug=FILE          Print CacheDir debug info to FILE.
  16.   --cache-disable, --no-cache
  17.                               Do not retrieve built targets from CacheDir.
  18.   --cache-force, --cache-populate
  19.                               Copy already-built targets into the CacheDir.
  20.   --cache-readonly            Do not update CacheDir with built targets.
  21.   --cache-show                Print build actions for files from CacheDir.
  22.   --config=MODE               Controls Configure subsystem: auto, force,
  23.                                 cache.
  24.   -D                          Search up directory tree for SConstruct,
  25.                                 build all Default() targets.
  26.   --debug=TYPE                Print various types of debugging information:
  27.                                 count, duplicate, explain, findlibs, includes,
  28.                                 memoizer, memory, objects, pdb, prepare,
  29.                                 presub, stacktrace, time, action-timestamps.
  30.   --diskcheck=TYPE            Enable specific on-disk checks.
  31.   --duplicate=DUPLICATE       Set the preferred duplication methods. Must be
  32.                                 one of hard-soft-copy, soft-hard-copy,
  33.                                 hard-copy, soft-copy, copy
  34.   --enable-virtualenv         Import certain virtualenv variables to SCons
  35.   -f FILE, --file=FILE, --makefile=FILE, --sconstruct=FILE
  36.                               Read FILE as the top-level SConstruct file.
  37.   -h, --help                  Print defined help message, or this one.
  38.   -H, --help-options          Print this message and exit.
  39.   -i, --ignore-errors         Ignore errors from build actions.
  40.   -I DIR, --include-dir=DIR   Search DIR for imported Python modules.
  41.   --ignore-virtualenv         Do not import virtualenv variables to SCons
  42.   --implicit-cache            Cache implicit dependencies
  43.   --implicit-deps-changed     Ignore cached implicit dependencies.
  44.   --implicit-deps-unchanged   Ignore changes in implicit dependencies.
  45.   --interact, --interactive   Run in interactive mode.
  46.   -j N, --jobs=N              Allow N jobs at once.
  47.   -k, --keep-going            Keep going when a target can't be made.
  48.   --max-drift=N               Set maximum system clock drift to N seconds.
  49.   --md5-chunksize=N           Set chunk-size for MD5 signature computation to
  50.                                 N kilobytes.
  51.   -n, --no-exec, --just-print, --dry-run, --recon
  52.                               Don't build; just print commands.
  53.   --no-site-dir               Don't search or use the usual site_scons dir.
  54.   --profile=FILE              Profile SCons and put results in FILE.
  55.   -q, --question              Don't build; exit status says if up to date.
  56.   -Q                          Suppress "Reading/Building" progress messages.
  57.   --random                    Build dependencies in random order.
  58.   -s, --silent, --quiet       Don't print commands.
  59.   --site-dir=DIR              Use DIR instead of the usual site_scons dir.
  60.   --stack-size=N              Set the stack size of the threads used to run
  61.                                 jobs to N kilobytes.
  62.   --taskmastertrace=FILE      Trace Node evaluation to FILE.
  63.   --tree=OPTIONS              Print a dependency tree in various formats: all,
  64.                                 derived, prune, status, linedraw.
  65.   -u, --up, --search-up       Search up directory tree for SConstruct,
  66.                                 build targets at or below current directory.
  67.   -U                          Search up directory tree for SConstruct,
  68.                                 build Default() targets from local SConscript.
  69.   -v, --version               Print the SCons version number and exit.
  70.   --warn=WARNING-SPEC, --warning=WARNING-SPEC
  71.                               Enable or disable warnings.
  72.   -Y REPOSITORY, --repository=REPOSITORY, --srcdir=REPOSITORY
  73.                               Search REPOSITORY for source and target files.
  74.  
  75. Local Options:
  76.   --dist                      make distribution
  77.   --dist-strip                make distribution and strip useless files
  78.   --dist-ide                  make distribution for RT-Thread Studio IDE
  79.   --project-path=PROJECT-PATH
  80.                               set dist-ide project output path
  81.   --project-name=PROJECT-NAME
  82.                               set project name
  83.   --reset-project-config      reset the project configurations to default
  84.   --cscope                    Build Cscope cross reference database. Requires
  85.                                 cscope installed.
  86.   --clang-analyzer            Perform static analyze with Clang-analyzer.
  87.                                 Requires Clang installed. It is recommended to
  88.                                 use with scan-build like this: `scan-build
  89.                                 scons --clang-analyzer` If things goes well,
  90.                                 scan-build will instruct you to invoke
  91.                                 scan-view.
  92.   --buildlib=BUILDLIB         building library of a component
  93.   --cleanlib                  clean up the library by --buildlib
  94.   --target=TARGET             set target project: mdk/mdk4/mdk5/iar/vs/vsc/ua/
  95.                                 cdk/ses/makefile/eclipse/codelite/cmake
  96.   --stackanalysis             thread stack static analysis
  97.   --genconfig                 Generate .config from rtconfig.h
  98.   --useconfig=USECONFIG       make rtconfig.h from config file.
  99.   --verbose                   print verbose information during build
  100.   --menuconfig                make menuconfig for RT-Thread BSP
  101.   --pyconfig                  Python GUI menuconfig for RT-Thread BSP
  102.   --pyconfig-silent           Don`t show pyconfig window

精准匹配下:

  1. rt-thread/bsp/qemu-vexpress-a9$ scons -h | grep buildlib
  2.   --buildlib=BUILDLIB         building library of a component
  3.   --cleanlib                  clean up the library by --buildlib

2.2 实践出整理

从上面的帮助信息,我们已经找到关键信息了,我们来实践下:

  1. rt-thread/bsp/qemu-vexpress-a9$ scons --buildlib=BUILDLIB 
  2. scons: Reading SConscript files ...
  3. b''
  4. drivers/SConscript
  5. applications/SConscript
  6. [, , ]
  7. scons: done reading SConscript files.
  8. scons: Building targets ...
  9. scons: building associated VariantDir targets: build
  10. scons: `.' is up to date.
  11. scons: done building targets.

发现并没有生成,仔细一看,这个buildlib=后面跟的名称不是乱填的,是需要填写你当前目录下,已经使用scons语法配置好的组件,这个东西在scons里面是叫Group。 通俗来说,就是使用buildlib,一个Gourp就可以生成一个库。 我们再来实践下,以bsp/qemu-vexpress-a9的Application这个Group为例,在其applications目录有定义Sconsript: 

scons

那么就可以输入scons--buildlib=Applications

scons

就可以将Applications那个group定义的C文件编译打包成一个静态库,输出也是位于bsp的目录中。

3 经验总结

  • 任何命令行指令,千万不要放过它的help信息
  • scons 使用--buildlib=xxx轻松生存库文件,库名称为libxxx.a

4 更多分享

架构师李肯

一个专注于嵌入式IoT领域的架构师。有着近10年的嵌入式一线开发经验,深耕IoT领域多年,熟知IoT领域的业务发展,深度掌握IoT领域的相关技术栈,包括但不限于主流RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、主流IoT云平台的对接、嵌入式IoT系统的架构设计等等。拥有多项IoT领域的发明专利,热衷于技术分享,有多年撰写技术博客的经验积累,连续多月获得RT-Thread官方技术社区原创技术博文优秀奖,荣获CSDN博客专家、CSDN物联网领域优质创作者、2021年度CSDN&RT-Thread技术社区之星、RT-Thread官方嵌入式开源社区认证专家、RT-Thread 2021年度论坛之星TOP4、华为云云享专家(嵌入式物联网架构设计师)等荣誉。坚信【知识改变命运,技术改变世界】!

欢迎关注我的github仓库01workstation,日常分享一些开发笔记和项目实战,欢迎指正问题。

同时也非常欢迎关注我的专栏:有问题的话,可以跟我讨论,知无不答,谢谢大家。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分