Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
scons 入门教程 兼 自动化批处理
发布于 2012-01-11 14:05:40 浏览:41516
订阅该版
[tocm] [attachment=-1]详细内容见附件 SCONS自动化构建工具入门教程 mousie-yu 2012-1-7 本教程是作者在学习使用RT-Thread V1.0.0版本时,对SCONS的入门级别的经验总结。主要内容来自: [http://www.rt-thread.org/dokuwiki/doku. ... 6%E8%A7%A3](http://www.rt-thread.org/dokuwiki/doku.php?id=rt-thread%E4%B8%AD%E7%9A%84scons%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3) 一、安装工具 需要安装python 2.7.x 以及 scons 2.x。注意,并不推荐安装软件的最新版本。 下载链接: Python:http://www.python.org/ftp/python/2.7.1/python-2.7.1.msi SCONS:http://www.rt-thread.org/download/scons-2.0.1.win32.exe 必须先安装python,再安装scons。安装路径不建议使用中文和空格之类的符号。 采用默认安装即可,假设把python安装到了D:Python27. 则scons的默认安装路径为 D:Python27Scripts 为免去敲命令行的苦楚,推荐一个图形化工具 ArdaSConsUI,下载链接: [http://www.ourdev.cn/bbs/bbs_content.js ... _page_no=1](http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4773281&bbs_id=3066&bbs_page_no=1) 请自行安装编译工具。 以RealView MDK为例,安装路径必须是纯英文且不能带空格等符号。 建议直接安装到盘符根目录,如: D:Keil 下载RT-Thread V1.0.0,里面已经针对scons写好了脚本。 [http://rt-thread.googlecode.com/files/R ... 201.0.0.7z](http://rt-thread.googlecode.com/files/RT-Thread%201.0.0.7z) 至此,所有软件的准备工作完成了。 ? 二、设置环境变量 为了能让系统识别scons指令,还需要设置一下工作路径。设置方式有多种,使用命令行指令path;设置环境变量;通过注册表修改。此处介绍如何设置环境变量。 通过 我的电脑右键->属性->系统属性->高级,可以看到如下页面: 1. 在系统属性高级页面下,点击“环境变量”。 2. 在弹出的环境变量窗口下,在用户变量下点击“新建”。 3. 弹出新建用户变量窗口,输入如下信息: 变量名:PATH 变量值:D:Python27; D:Python27Scripts 4. 一路确认到底即可完成设置。 ? 三、使用SCONS编译RT-Thread 在安装完成Python和SCons后,就可以使用scons编译RT-Thread了,但是默认配置文件中并不知道你主机上安装的编译器位置,所以在编译RT-Thread之前,需要手动编辑rtconfig.py配置文件告诉scons编译器在哪里。用文本编辑器打开相应bsp目录下的rtconfig.py文件,编辑其中的: ``` CROSS_TOOL='keil' # 这里需要选择你使用的编译器 # EXEC_PATH指向了你编译器安装的位置 if CROSS_TOOL == 'gcc': PLATFORM = 'gcc' EXEC_PATH = 'D:/SourceryGCC/bin' elif CROSS_TOOL == 'keil': PLATFORM = 'armcc' EXEC_PATH = 'D:/Keil' elif CROSS_TOOL == 'iar': PLATFORM = 'iar' IAR_PATH = 'C:/Program Files/IAR Systems/Embedded Workbench 5.4 Evaluation_0' ```作者用的是编译器keil,修改keil的工作路径为“D:/Keil”,注意路径符号用的是反斜杠“/”,而非windows的“”。 修改好上述信息后,请出 Arda SConsUI软件。使用起来非常方便。 1. 设置工作路径,该路径同样不允许有中文和空格之类的符号存在。 2. 点击Bulid。 3. 查看编译结果,编译成功完成。 四、增减组件及生成RVMDK工程 增减组件非常简单。只需在rtconfig.h中宏定义某个组件。以文件系统为例: 在rtconfig.h中,宏定义RT_USING_DFS。然后用 Arda SConsUI软件编译即可。 ``` #define RT_USING_DFS // 使能文件系统``` 此时可能还需要使用RVMDK工程文件进行调试。使用scons可以自动生成RVMDK的工程文件。确保工程目录下包含一个名为 template.Uv2 或 template.uvproj 的模板工程。其中 .Uv2是给RVMDK V3.xx版本用的,.uvproj是给RVMDK V4.xx版本用的,当然,RVMDK V4.xx是可以打开 .Uv2工程并转换为 .uvproj工程的。 运行cmd,进入命令提示符窗口。 1. 进入工程目录。 2. 输入指令:scons --target =mdk4 -s 创建RVMDK V4.xx版本的工程。 如果需要RVMDK V3.xx版本的工程,输入: ```scons --target =mdk -s``` 3. 此时在工程目录下,可以看到RVMDK工程文件project.uvproj或project.Uv2。 打开工程即可看到文件系统已加入。 五、Sconsstruct 和 Sconsscript SConstruct文件是scons所接受的编译脚本主文件,它包含了一些基本的变量信息。 如果要关联用户自定义组件,需要在Sconsstruct中增加内容。已STM32固件库为例,有如下内容: ```# STM32 firemare library building script objs = objs + SConscript(RTT_ROOT + '/bsp/stm3210/Libraries/SConscript', variant_dir='bsp/Libraries', duplicate=0)``` 其含义为,让一个SConstruct文件再关联一个新的组件(用户自行定义的组件,而不是RT-Thread系统的组件,此处是STM32的固件库)。 Sconsscript分散在各个组件目录中,可理解为组件脚本。以下的是一个脚本范例: ```Import('RTT_ROOT') from building import * src = Glob('*.c') CPPPATH = [RTT_ROOT + '/components/pthreads'] group = DefineGroup('pthreads', src, depend = ['RT_USING_PTHREADS'], CPPPATH = CPPPATH) Return('group')``` 注意:如果是在components目录下放置一个新目录,并附加上类似上面的正确SConscript文件,那么在RT-Thread编译的过程中,scons将会自动寻找这个组件,并检查它的依赖关系,如果依赖关系满足,将自行把这个组件添加到编译过程中。 可以加入的参数包括: - CCFLAGS – C源文件编译的参数; - CPPPATH – 应该额外包含的头文件路径; - CPPDEFINES – C源文件编译时额外的宏定义; - LINKFLAGS – 连接时应该添加的参数。 ? 六、懒人必备之批处理 笔者是懒人,对于重复劳动这种吃力不讨好的事情要坚决杜绝!!! 于是使用批处理将整个过程简化到了极致。环境变量、ArdaSConsUI都忽略掉吧,不需要他们了。只需将批处理放在工程目录下,双击运行即可! 批处理代码如下。保存为 .bat 格式即可。 ```@echo off @Rem 设置 Python27 及 Scripts 的路径 set python=D:Program FilesPython27 set scripts=D:Program FilesPython27Scripts @Rem 设置编译器,mdk/mdk4/iar set complier=mdk4 @Rem 设置编译方式,0 或 1表示普通编译 >2表示多核编译 set core=2 @Rem 将本批处理文件放到工程目录下点击运行即可 @Rem 注意:工程目录不可有“中文”“空格”等字符出现 @Rem 下面命令可自动实现编译及生成RVMK @Rem 加入script工作路径 path %path%;%python%;%scripts% cd %~dp0 @Rem 编译或生成工程 :Start echo . echo . echo . echo ***************************************************** echo * author: mousie-yu * echo * date: 2012.1.10 * echo * brief: scons自动化批处理 * echo * path: %~dp0 echo ***************************************************** choice /c:bme /m Build-编译工程,Make-生成工程,Exit-退出 if errorlevel 3 goto End if errorlevel 2 goto Make if errorlevel 1 goto Build :Build call scons.bat -c call scons.bat -j %core% goto Start :Make call scons.bat --target=%complier% -s goto Start :End exit``` [attachment=-1] [attach]0[/attach] 下载附件 [scons入门指南_mousie.pdf](https://oss-club.rt-thread.org/uploads/2292_75365c1908068e91383ec57972166a11.pdf) 下载附件 [_complier.rar](https://oss-club.rt-thread.org/uploads/2292_7d4cb58f198c3393865fe423237dd800.rar) ![QQ图片20140306081236.jpg](https://oss-club.rt-thread.org/uploads/6323_5c6f55066ed9314193792d5e9f052827.jpg) ![QQ图片20140306081712.jpg](https://oss-club.rt-thread.org/uploads/6323_184b81f02b97ac7ded59ed41a9c5f40e.jpg)
查看更多
42
个回答
默认排序
按发布时间排序
bernard
2012-01-11
这家伙很懒,什么也没写!
Arda的SconsUI也找到了,真不错! 推荐初学scons的朋友可以看看
aaa1982
2012-01-11
这家伙很懒,什么也没写!
真晕:最开始就有没玩转 请问我明明指定了path,为啥调用armcc的时候还提示说'armcc' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 我直接敲armcc完全可以执行啊 D:\RT-Thread 1.0.0\bsp\stm32f10x>path PATH=C:\Python27\Scripts;C:\Keil\ARM\BIN40 D:\RT-Thread 1.0.0\bsp\stm32f10x>scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... scons: building associated VariantDir targets: build\bsp armcc -o build\bsp\application.o -c --device DARMSTM --apcs=interwork -Id:/Keil/ ARM/RV31/INC -g -O0 -DUSE_STDPERIPH_DRIVER -DSTM32F10X_HD -I. "-ID:\RT-Thread 1. 0.0" "-ID:\RT-Thread 1.0.0\include" "-ID:\RT-Thread 1.0.0\libcpu\arm\cortex-m3" "-ID:\RT-Thread 1.0.0\libcpu\arm\common" "-ID:\RT-Thread 1.0.0\components\finsh" -ILibraries\STM32F10x_StdPeriph_Driver\inc "-ID:\RT-Thread 1.0.0\Libraries\STM3 2F10x_StdPeriph_Driver\inc" -ILibraries\CMSIS\CM3\CoreSupport "-ID:\RT-Thread 1. 0.0\Libraries\CMSIS\CM3\CoreSupport" -ILibraries\CMSIS\CM3\DeviceSupport\ST\STM3 2F10x "-ID:\RT-Thread 1.0.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x" appl ication.c 'armcc' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 scons: *** [build\bsp\application.o] Error 1 scons: building terminated because of errors. D:\RT-Thread 1.0.0\bsp\stm32f10x>
bernard
2012-01-11
这家伙很懒,什么也没写!
你的rtconfig.py没配置吧: C:\Keil 这个路径
aaa1982
2012-01-12
这家伙很懒,什么也没写!
晕倒,昨天晚上还是看了一下,直接把 e:\keil改成了 d:\keil 实际上我的存在c:不知道但是怎么想的,看来太晚了一定要睡觉,否则得不偿失啊。 感谢熊版主。
ljt8015
2012-01-13
这家伙很懒,什么也没写!
# EXEC_PATH指向了你编译器安装的位置 ``` if CROSS_TOOL == 'gcc': PLATFORM = 'gcc' EXEC_PATH = 'D:/SourceryGCC/bin' elif CROSS_TOOL == 'keil': PLATFORM = 'armcc' EXEC_PATH = 'D:/Keil' elif CROSS_TOOL == 'iar': PLATFORM = 'iar' IAR_PATH = 'C:/Program Files/IAR Systems/Embedded Workbench 5.4 Evaluation_0' ``` 如果要生成eclipse工程,好不好实现?
bernard
2012-01-13
这家伙很懒,什么也没写!
># EXEC_PATH指向了你编译器安装的位置 >if CROSS_TOOL == 'gcc': > PLATFORM = 'gcc' > EXEC_PATH = 'D:/SourceryGCC/bin' >elif CROSS_TOOL == 'keil': > PLATFORM = 'armcc' > EXEC_PATH = 'D:/Keil' >elif CROSS_TOOL == 'iar': > PLATFORM = 'iar' > IAR_PATH = 'C:/Program Files/IAR Systems/Embedded Workbench 5.4 Evaluation_0' > > >如果要生成eclipse工程,好不好实现? --- eclipse工程是直接向导生成,不需要这么麻烦
aaa1982
2012-01-20
这家伙很懒,什么也没写!
请问为啥改成Gcc 又用不了了。 报错 scons: *** [buildspapplication.o] scons: building terminated because of errors. 这回gcc的地址肯定没设置错了 ``` # toolchains options ARCH='arm' CPU='cortex-m3' CROSS_TOOL='gcc' #device options # STM32_TYPE = # 'STM32F10X_LD','STM32F10X_LD_VL', # 'STM32F10X_MD','STM32F10X_MD_VL', # 'STM32F10X_HD','STM32F10X_HD_VL', # 'STM32F10X_XL','STM32F10X_CL' STM32_TYPE = 'STM32F10X_HD' # lcd panel options # 'FMT0371','ILI932X', 'SSD1289' RT_USING_LCD_TYPE = 'SSD1289' # cross_tool provides the cross compiler # EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR if CROSS_TOOL == 'gcc': PLATFORM = 'gcc' EXEC_PATH = 'D:CodeSourceryin' #这个地址肯定没错 elif CROSS_TOOL == 'keil': PLATFORM = 'armcc' EXEC_PATH = 'C:/Keil' elif CROSS_TOOL == 'iar': PLATFORM = 'iar' IAR_PATH = 'E:/Program Files/IAR Systems/Embedded Workbench 6.0' ``` ``` D:RT-Thread 1.0.0spstm32f10x>path PATH=C:Python27Scripts D:RT-Thread 1.0.0spstm32f10x>scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... scons: building associated VariantDir targets: buildsp arm-none-eabi-gcc -o buildspapplication.o -c -mcpu=cortex-m3 -mthumb -ffuncti on-sections -fdata-sections -O0 -gdwarf-2 -DRT_USING_MINILIBC -DUSE_STDPERIPH_DR IVER -DSTM32F10X_HD -I. "-ID:RT-Thread 1.0.0" "-ID:RT-Thread 1.0.0include" "- ID:RT-Thread 1.0.0libcpuarmcortex-m3" "-ID:RT-Thread 1.0.0libcpuarmcommo n" "-ID:RT-Thread 1.0.0componentsfinsh" "-ID:RT-Thread 1.0.0componentslibc minilibc" -ILibrariesSTM32F10x_StdPeriph_Driverinc "-ID:RT-Thread 1.0.0Libr ariesSTM32F10x_StdPeriph_Driverinc" -ILibrariesCMSISCM3CoreSupport "-ID:RT -Thread 1.0.0LibrariesCMSISCM3CoreSupport" -ILibrariesCMSISCM3DeviceSuppo rtSTSTM32F10x "-ID:RT-Thread 1.0.0LibrariesCMSISCM3DeviceSupportSTSTM32 F10x" application.c scons: *** [buildspapplication.o] scons: building terminated because of errors. D:RT-Thread 1.0.0spstm32f10x> ```
bernard
2012-01-20
这家伙很懒,什么也没写!
EXEC_PATH = 'D:\CodeSourcery\bin' #这个地址肯定没错 这个地址也加入到你的执行环境PATH中吧,scons在GNU GCC上处理似乎有些怪异。
aaa1982
2012-01-20
这家伙很懒,什么也没写!
确实又是没设置好path的问题,太惭愧了 [s:182] [s:182] 请教个问题:GCC最后link这个过程 为啥会能出.axf 这种格式啊,这不是只有keil采用的格式么。 我试了一下,确实可以在keil下面下载和调试,而且也可以用gcc提供的工具objdump,不是说只有elf格式的可以objdump出来么,怎么添加了那么多调试信息的.axf也可以objdump? 而且用MDK的工具链链接出来的.axf就不能objdump。 请问是哪个链接选项能让arm-none-eabi-gcc -o 打出可以在keil下面用的.axf文件 ? ``` arm-none-eabi-gcc -o rtthread-stm32.axf -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -Wl,--gc-sections,-Map=rtthread-stm32.map,-cref,-u,Reset_Handler -T stm32_rom.ld buildspapplication.o buildspstartup.o buildspoard.o buildspstm32f10x_it.o buildsp tc.o buildspusart.o buildspserial.o buildspled.o buildsrcclock.o buildsrcdevice.o buildsrcidle.o buildsrcipc.o buildsrcirq.o buildsrckservice.o buildsrcmem.o buildsrcmempool.o buildsrcobject.o buildsrcscheduler.o buildsrc hread.o buildsrc imer.o buildlibcpuarmcortex-m3cpuport.o buildlibcpuarmcortex-m3context_gcc.o buildlibcpuarmcommonacktrace.o buildlibcpuarmcommondiv0.o buildlibcpuarmcommonshowmem.o buildcomponentsfinshlibfinsh.a buildcomponentslibcminilibcctype.o buildcomponentslibcminilibcmath.o buildcomponentslibcminilibcqsort.o buildcomponentslibcminilibc and.o buildcomponentslibcminilibcstdlib.o buildcomponentslibcminilibcstring.o buildcomponentslibcminilibc ime.o buildspLibrariesCMSISCM3CoreSupportcore_cm3.o buildspLibrariesCMSISCM3DeviceSupportSTSTM32F10xsystem_stm32f10x.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_crc.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_rcc.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_wwdg.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_pwr.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_exti.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_bkp.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_i2c.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_adc.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_dac.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_rtc.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_fsmc.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_tim.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_iwdg.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_spi.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_flash.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_sdio.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_gpio.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_usart.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_dbgmcu.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_dma.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_can.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcstm32f10x_cec.o buildspLibrariesSTM32F10x_StdPeriph_Driversrcmisc.o buildspLibrariesCMSISCM3DeviceSupportSTSTM32F10xstartupgcc_ride7startup_stm32f10x_hd.o ```
bernard
2012-01-20
这家伙很懒,什么也没写!
生成.axf后缀名其实是为了让它在keil mdk中能够正确加载、调试。而实际上,这个axf=elf,是完全一样。 控制.axf后缀名是在rtconfig.py中配置的输出后缀名。
撰写答案
登录
注册新账号
关注者
0
被浏览
41.5k
关于作者
draapho
这家伙很懒,什么也没写!
提问
3
回答
2
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部