【已完美解决】scons问题求助:如何设置编译输出目录搞清楚后,有些编译输出的obj文件却在源码目录,而不是设置的输出目录。
文章目录
- 1 前置背景
- 2 我的疑问
- 3 一手点拨
- 4 问题解决
1 前置背景
最近在基于目前已有的rt-thread构建框架,改造设计一套新的软件架构及构建,基于RA系列的BSP,使用scons的构建方式在windows的env环境下推进。
在这期间,参考了社区帖子 scons如何指定输出目录 , 基本能够实现将编译输出的obj文件导到编译输出目录,而不是在原来的源码目录。
但是,我发现了一个个例,以 bsp\renesas\ra2l1-cpk 为例,在它的原生的rt-thread env构建流程中也是存在这样的问题。
见下面执行scons的编译出:
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文件内容:
# 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文件内容:
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文件内容:
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目录的编译输出存放在源码目录:
ra_gen目录的编译输出存放在build目录下:
bsp的目录结构大致长这样:
2 我的疑问
对此,我有几个疑问:
- 为啥ra目录和ra_gen目录的会有这个差别?而且我发现,瑞萨这几款bsp都有类似的问题
- 到底是顶级的SConscript文件决定了上面的现象还是ra目录下的SConscript文件导致的?
- 要想把ra目录下的生成文件也像ra_gen目录下的编译一样,存放在build目录下,要怎么修改?
以上问题,如果有大佬了解的,还请指导指导,多谢多谢。
3 一手点拨
帖子一经发出,就得到了大佬的点拨:
同时也引来了大佬的热议,包括我也参与了进去,从大佬的回复,我突然想到可能是 绝对路径和相对路径 的问题。
4 问题解决
非常高兴,经上面大佬们的点拨,基本确认了,果然就是ra目录下SConscript文件定义src使用了 绝对路径, 而不是 相对路径,从而引发问题的。
再次感谢大佬们的点拨,真的是一语惊醒梦中人。社区力量就是强大,总有意向不大的收获!
目前问题已经得到解决,参考下面的记录。
修改的地方正是 ra目录下的SConscript文件:
修改后的编译输出:
obj文件生成的验证:
完美手工。
@recan