Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SCons
【已完美解决】scons问题求助:如何设置编译输出目录搞清楚后,有些编译输出的obj文件却在源码目录,而不是设置的输出目录。
发布于 2023-05-29 15:27:38 浏览:1200
订阅该版
[tocm] 最近在基于目前已有的rt-thread构建框架,改造设计一套新的软件架构及构建,基于RA系列的BSP,使用scons的构建方式在windows的env环境下推进。 在这期间,参考了社区帖子 [scons如何指定输出目录](https://club.rt-thread.org/ask/question/6f323c2ff96b6cb6.html) , 基本能够实现将编译输出的obj文件导到编译输出目录,而不是在原来的源码目录。 但是,我发现了一个个例,以 **bsp\renesas\ra2l1-cpk** 为例,在它的原生的rt-thread env构建流程中也是存在这样的问题。 见下面执行scons的编译出: ```c CC build\kernel\src\kservice.o CC build\kernel\src\mem.o CC build\kernel\src\mempool.o CC build\kernel\src\object.o CC build\kernel\src\scheduler.o CC build\kernel\src\thread.o CC build\kernel\src\timer.o CC build\ra_gen\common_data.o CC build\ra_gen\hal_data.o CC build\ra_gen\main.o CC build\ra_gen\pin_data.o CC build\ra_gen\vector_data.o CC build\src\hal_entry.o CC ra\fsp\src\bsp\cmsis\Device\RENESAS\Source\startup.o CC ra\fsp\src\bsp\cmsis\Device\RENESAS\Source\system.o CC ra\fsp\src\bsp\mcu\all\bsp_clocks.o CC ra\fsp\src\bsp\mcu\all\bsp_common.o CC ra\fsp\src\bsp\mcu\all\bsp_delay.o CC ra\fsp\src\bsp\mcu\all\bsp_group_irq.o CC ra\fsp\src\bsp\mcu\all\bsp_guard.o CC ra\fsp\src\bsp\mcu\all\bsp_io.o CC ra\fsp\src\bsp\mcu\all\bsp_irq.o CC ra\fsp\src\bsp\mcu\all\bsp_register_protection.o CC ra\fsp\src\bsp\mcu\all\bsp_rom_registers.o CC ra\fsp\src\bsp\mcu\all\bsp_sbrk.o CC ra\fsp\src\bsp\mcu\all\bsp_security.o CC ra\fsp\src\r_icu\r_icu.o CC ra\fsp\src\r_ioport\r_ioport.o CC ra\fsp\src\r_sci_uart\r_sci_uart.o CC D:\llc\git_repos\rt-thread-share\rt-thread-share\rtt-5.0\rt-thread\bsp\renesas\libraries\HAL_Drivers\drv_common.o CC D:\llc\git_repos\rt-thread-share\rt-thread-share\rtt-5.0\rt-thread\bsp\renesas\libraries\HAL_Drivers\drv_gpio.o CC D:\llc\git_repos\rt-thread-share\rt-thread-share\rtt-5.0\rt-thread\bsp\renesas\libraries\HAL_Drivers\drv_usart_v2.o D:\llc\git_repos\rt-thread-share\rt-thread-share\rtt-5.0\rt-thread\bsp\renesas\libraries\HAL_Drivers\drv_usart_v2.c: In function 'ra_uart_transmit': D:\llc\git_repos\rt-thread-share\rt-thread-share\rtt-5.0\rt-thread\bsp\renesas\libraries\HAL_Drivers\drv_usart_v2.c:260:21: warning: variable 'uart' set but not used [-Wunused-but-set-variable] 260 | struct ra_uart *uart; | ^~~~ LINK rtthread.elf arm-none-eabi-objcopy -O ihex rtthread.elf rtthread.hex arm-none-eabi-size rtthread.elf text data bss dec hex filename 87364 1592 4728 93684 16df4 rtthread.elf scons: done building targets. ``` 注意看 ra目录下的几个obj文件,比如 (**CC ra\fsp\src\bsp\mcu\all\bsp_clocks.o**),输出都是在源码目录,而其他的与ra同级的目录,比如ra_gen都是在build目录往下存放(rt-thread的build tool默认将obj文件放在build目录)。 起初,我以为是ra目录下的SConscript文件和ra_gen目录下的SConscript文件有些区别,但我看了内容了,实在没想明白,为啥ra目录下的源码编译输出的obj文件就在源码目录,而ra_gen目录的源码却不会这样。 bsp顶级目录的SConscript文件内容: ```c # for module compiling import os Import('RTT_ROOT') Import('rtconfig') from building import * cwd = GetCurrentDir() src = [] CPPPATH = [] list = os.listdir(cwd) if rtconfig.PLATFORM in ['iccarm']: print("\nThe current project does not support IAR build\n") Return('group') elif rtconfig.PLATFORM in ['gcc', 'armclang']: if GetOption('target') != 'mdk5': CPPPATH = [cwd + './src'] src = Glob('./src/*.c') group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) for d in list: path = os.path.join(cwd, d) if os.path.isfile(os.path.join(path, 'SConscript')): group = group + SConscript(os.path.join(d, 'SConscript')) Return('group') ``` ra目录下的SConscript文件内容: ```c Import('RTT_ROOT') Import('rtconfig') from building import * cwd = GetCurrentDir() src = [] group = [] CPPPATH = [] if rtconfig.PLATFORM in ['iccarm']: print("\nThe current project does not support IAR build\n") Return('group') elif rtconfig.PLATFORM in ['gcc', 'armclang']: if GetOption('target') != 'mdk5': src += Glob(cwd + '/fsp/src/bsp/mcu/all/*.c') src += [cwd + '/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c'] src += [cwd + '/fsp/src/bsp/cmsis/Device/RENESAS/Source/startup.c'] src += Glob(cwd + '/fsp/src/r_*/*.c') CPPPATH = [ cwd + '/arm/CMSIS_5/CMSIS/Core/Include', cwd + '/fsp/inc', cwd + '/fsp/inc/api', cwd + '/fsp/inc/instances',] group = DefineGroup('ra', src, depend = [''], CPPPATH = CPPPATH) Return('group') ``` ra_gen目录下的SConscript文件内容: ```c Import('RTT_ROOT') Import('rtconfig') from building import * cwd = GetCurrentDir() src = [] group = [] CPPPATH = [] if rtconfig.PLATFORM in ['iccarm']: print("\nThe current project does not support IAR build\n") Return('group') elif rtconfig.PLATFORM in ['gcc', 'armclang']: if GetOption('target') != 'mdk5': src = Glob('*.c') CPPPATH = [cwd, ] group = DefineGroup('ra_gen', src, depend = [''], CPPPATH = CPPPATH) Return('group') ``` ra目录的编译输出存放在源码目录: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230529/81596d99096b8a3cfd5be6332e65313c.png.webp) ra_gen目录的编译输出存放在build目录下: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230529/8bed9ac843cfe329083ae3ad0efd9ea2.png) bsp的目录结构大致长这样: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230529/8074bf7a56f9b4d4b2d3a6d68dc1356e.png.webp) ---- 对此,我有几个疑问: 1. 为啥ra目录和ra_gen目录的会有这个差别?而且我发现,瑞萨这几款bsp都有类似的问题 2. 到底是顶级的SConscript文件决定了上面的现象还是ra目录下的SConscript文件导致的? 3. 要想把ra目录下的生成文件也像ra_gen目录下的编译一样,存放在build目录下,要怎么修改? 以上问题,如果有大佬了解的,还请指导指导,多谢多谢。
查看更多
a1012112796
2023-05-30
这家伙很懒,什么也没写!
一般是由于 `SConscript` 的定义在了外部, 不受到根节点 SConscript 的配置参数限制了, 不过这样又不会影响编译结果,应该可以不用管吧。。。 示例: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230530/95c5bb70e3e9b7ac60da255aa5b7a01d.png.webp) 修改示例: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230530/f4c0402c63b73ea5c1faeb8212549364.png.webp)
2
个回答
默认排序
按发布时间排序
李肯陪你玩赚嵌入式
认证专家
2023-05-30
2022年度和2023年度RT-Thread社区优秀开源布道师,COC深圳城市开发者社区主理人,专注于嵌入式物联网的架构设计
SCons的资料感觉不是很多,学完了一些基础资料后,能够满足部分需求,但是帖子中的这个 “**奇葩**” 的确有些头疼。
撰写答案
登录
注册新账号
关注者
1
被浏览
1.2k
关于作者
李肯陪你玩赚嵌入式
2022年度和2023年度RT-Thread社区优秀开源布道师,COC深圳城市开发者社区主理人,专注于嵌入式物联网的架构设计
提问
5
回答
504
被采纳
82
关注TA
发私信
相关问题
1
scons不支持python3吗?
2
编译又出现问题
3
BSP目录下做好一个项目后,怎么把发给别人的包裁剪的小...
4
为什么重新scons --target=mdk 后,以前在MDK工程里保存的C文
5
Scons 添加Group,SConscript已经执行,源码却没有添加进工程
6
scons如何指定输出目录?
7
新人求助。
8
想用env 工具自己构建编译环境想用vscode 进行一些简单程序
9
关于scons脚本问题
10
使用scons --target=makefile的问题
推荐文章
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
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部