[完全に解決されました] ヘルプのための scons 問題: コンパイル出力ディレクトリを設定する方法 それを理解した後、一部のコンパイルされた出力 obj ファイルは、設定された出力ディレクトリではなくソース コード ディレクトリにあります。

[完全に解決されました] ヘルプのための scons 問題: コンパイル出力ディレクトリを設定する方法 それを理解した後、一部のコンパイルされた出力 obj ファイルは、設定された出力ディレクトリではなくソース コード ディレクトリにあります。

正面背景 1 枚

最近、既存の rt スレッド構築フレームワークに基づいて、一連の新しいソフトウェア アーキテクチャと構築が変換および設計され、BSP の RA シリーズに基づいて、scons の構築方法が Windows の env 環境での進歩を実現するために使用されています。

この期間中、 scons で出力ディレクトリを指定する方法に関するコミュニティの投稿を参照すると、基本的に、コンパイルされた出力 obj ファイルを、元のソース コード ディレクトリではなくコンパイルされた出力ディレクトリにインポートできます。

ただし、 bsp\renesas\ra2l1-cpk を例として挙げると、この問題はネイティブの rt-thread env 構築プロセスにも存在することがわかりました

scon のコンパイルを実行するには、以下を参照してください。

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_locks.o ) に注意してください。出力はソース コード ディレクトリ、および ra と同じレベルの他のディレクトリにあります。 ra_gen など、これらはすべてビルド ディレクトリに保存されます ( rt-thread のビルド ツールは、デフォルトで obj ファイルをビルド ディレクトリに置きます)。

最初は、ra ディレクトリの SConscript ファイルと ra_gen ディレクトリの SConscript ファイルの間に何らかの違いがあるのではないかと思いましたが、内容を読んでみると、obj ファイルがなぜコンパイルされて ra_gen ディレクトリから出力されるのか理解したくありませんでした。 ra ディレクトリのソースコードは、source code ディレクトリにありますが、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_gen ディレクトリ内のコンパイルと同様に、生成されたファイルを build ディレクトリ内の ra ディレクトリに保存したい場合、それらをどのように変更しますか?

上記の質問に詳しい方がいらっしゃいましたら、ご指導をお願いいたします、よろしくお願いいたします。

3 片手でダイヤルする

投稿後すぐに上司からアドバイスをもらいましたが、
ここに画像の説明を挿入
ここに画像の説明を挿入
同時に上司からも熱い議論が巻き起こり、私も参加すること「絶対パスと相対パス」の問題。
ここに画像の説明を挿入
ここに画像の説明を挿入

ここに画像の説明を挿入

4 問題解決

上記の偉い人のアドバイスを受けて、ra ディレクトリ内の SConscript ファイル相対パスではなく絶対パスを使用して src を定義しており、これが問題の原因であることを基本的に確認しました。

アドバイスをくれた上司に改めて感謝します。夢を見た人は、たった一言で本当に目が覚めました。コミュニティの力は強力で、小さな意図でも常に利益が得られます。

現在、問題は解決しておりますので、以下の記録をご参照ください。

変更された場所は、ra ディレクトリ内の SConscript ファイルです。

スクリーンショット_画像.png

変更されたコンパイル出力:

スクリーンショット_画像.png

obj ファイル生成の検証:

スクリーンショット_画像.png

完全に手作り。

@リキャン

おすすめ

転載: blog.csdn.net/szullc/article/details/130957073