SCons не находит заголовочные файлы при использовании option_dir - PullRequest
0 голосов
/ 15 октября 2019

Здравствуйте, я запускаю проблему с использованием относительных путей и изменений в component_dir. У меня есть иерархическая конструкция SCons. Из основного SConstruct я вызываю sub SConcripts, представляющие слои моего проекта:

mcal_build_dir              = os.path.join(env.subst('$OUTPUT_DIR'), 'objs', 'MCAL')
infra_build_dir             = os.path.join(env.subst('$OUTPUT_DIR'), 'objs', 'INFRA')

mcal_path             = os.path.join('../../Targets/TC275/MCAL/SConscript')
infra_path            = os.path.join('../../INFRA/SConscript')


mcal_objs = SConscript(mcal_path, exports='env env_base', variant_dir=mcal_build_dir, duplicate=0)
infra_objs = SConscript(infra_path, exports='env env_base', variant_dir=infra_build_dir, duplicate=0)

внутри INFRA / Sconscript

includes = [
  '../MCAL/api',
  ........
  ........
]
# SOURCE FILES
sources = [
    'src/ECU_StartupTask.c',
  ....
]
for include in includes:
    own_env.Append(CPPPATH=[Dir(include).abspath])

Когда он компилирует заголовочные файлы в MCAL /API находятся:

gcc ....... -fno-peephole2 -D_GNU_C_TRICORE_=1 -Ioutput\objs\MCAL\api -IC:\Repositories\fcm3_ssb_sk\Targets\TC275\MCAL\api -Ioutput\objs\ASW\swc_PyroControl\code\api .....

теперь мне нужно иметь 2 разных варианта сборки для mcal, поэтому я попытался выполнить 2 компиляции одного и того же кода в другой сборке dir

mcal_build_dir              = os.path.join(env.subst('$OUTPUT_DIR'), 'objs', 'MCAL/hw_3x')
mcal_build_dir2                 = os.path.join(env.subst('$OUTPUT_DIR'), 'objs', 'MCAL/hw_4x')

The point is that only changing this the INFRA SConscript does not compile, the headers MCAL/api are not found. 

gcc ....... -fno-peephole2 -D_GNU_C_TRICORE_=1 -Ioutput\objs\MCAL\api -Ioutput\objs\ASW\swc_PyroControl\code\api .....

"" "обратите внимание, что абсолютный путь к MCAL \ api не добавляется в строку компиляции" ""

Так что кажется, что по какой-то причине абсолютный путь к -IC: \ Repositories \ fcm3_ssb_sk \ Targets\ TC275 \ MCAL \ api не найден. Я не понимаю связи INFRA / SConstruct с изменением mcal_build_dir. Разве не предполагается быть независимым? Я имею в виду, когда я создаю слой INFRA, который я использую, включает в себя относительные пути к INFRA / SConscript. Я думаю, что когда вы изменяете build_dir, каталог SConscript копируется в build_dir и компилируется там, но как насчет заголовочных файлов самого слоя INFRA? они скопированы? как INFRA / SConscript узнает абсолютный путь к MCAL / api в первый раз, а не во второй раз.

1 Ответ

1 голос
/ 15 октября 2019

Это не решает вашу главную проблему, но у вас много неправильного использования SCons, которое я комментирую и показываю лучший способ здесь.

Ух ты какой-то запутанный код здесь: Смотрите комментарии

# No need to use env.subst or os.path.join here.
mcal_build_dir              = os.path.join(env.subst('$OUTPUT_DIR'), 'objs', 'MCAL')
infra_build_dir             = os.path.join(env.subst('$OUTPUT_DIR'), 'objs', 'INFRA')
# should be 
mcal_build_dir              = '$OUTPUT_DIR/objs/MCAL'
infra_build_dir             = '$OUTPUT_DIR/objs/INFRA'

# These os.path.join's do nothing
mcal_path             = os.path.join('../../Targets/TC275/MCAL/SConscript')
infra_path            = os.path.join('../../INFRA/SConscript')
# So change to this
mcal_path             = '../../Targets/TC275/MCAL/SConscript'
infra_path            = '../../INFRA/SConscript'

# don't see any issues with this so far..
mcal_objs = SConscript(mcal_path, exports='env env_base', variant_dir=mcal_build_dir, duplicate=0)
infra_objs = SConscript(infra_path, exports='env env_base', variant_dir=infra_build_dir, duplicate=0)

Из вашего INFRA / Sconscript

includes = [
  '../MCAL/api',
  ........
  ........
]
# SOURCE FILES
sources = [
    'src/ECU_StartupTask.c',
  ....
]

# This does nothing (adding via Dir().abspath does not cause SCons to use absolute paths.
for include in includes:
    own_env.Append(CPPPATH=[Dir(include).abspath])

# So do this instead
own_env.Append(CPPPATH=includes)

Следующий фрагмент кода, который имеет проблемы:

# The subst and os.path.join once again isn't needed.
mcal_build_dir              = os.path.join(env.subst('$OUTPUT_DIR'), 'objs', 'MCAL/hw_3x')
mcal_build_dir2             = os.path.join(env.subst('$OUTPUT_DIR'), 'objs', 'MCAL/hw_4x')
# Do this instead (no need to pre-substitute and SCons will convert the /'s to \'s if necessary
mcal_build_dir              = '$OUTPUT_DIR/objs/MCAL/hw_3x'
mcal_build_dir2             = '$OUTPUT_DIR/objs/MCAL/hw_4x'

Все ссылки на файлы / каталоги относятся к каталогуSConstruct или SConscript находится в (и / или variable_dir)

Я заметил, что вы используете ../ .. как начальный путь во многих местах. Почему бы не найти там свой SConstruct? Это сделало бы намного более типичное расположение макета / SConstruct.

...