scons помогает найти альтернативные инструменты сборки
Вопрос
Я использую компилятор для DSP TI, поэтому инструменты CC, LINK и AS по умолчанию не имеют смысла.Ниже приведен файл SConstruct, который мне подходит. Мне интересно, есть ли у кого-нибудь предложения по его улучшению.Некоторые проблемы:
- Я хотел бы каким-то образом сообщить ему, что мои файлы .obj должны находиться в другом каталоге, чем исходные файлы .c.(он должен знать где, чтобы выяснить ИСТОЧНИКИ для этапа компоновки и зависимости для компиляции/компоновки). Было бы неплохо связать это с аргументами "-fr" и "-fs" для компилятора. , но я не против сделать это вручную.
- В файле SConstruct ниже есть несколько стандартных файлов C, все они начинаются с префикса DSP2804x_.Прямо сейчас scons не может выяснить зависимости для них, потому что я предполагаю, что он ожидает, что файлы .obj будут находиться в одном и том же каталоге, тогда как мое использование "-fr" и "-fs" для компилятора означает, что эти файлы .obj оказаться в том же каталоге, что и файл SConstruct.Есть лучший способ сделать это?Я предполагаю, что мне, вероятно, следует создать этап сборки, который копирует эти справочные файлы в локальный каталог:если я их изменю, я хочу, чтобы изменения распространились на все проекты, которые их используют.
вздох....
env = Environment(
CC = 'C:/appl/ti/ccs/3.3/C2000/cgtools/bin/cl2000',
CCCOM = '$CC $CFLAGS $CCFLAGS $SOURCES',
CCFLAGS = Split('-g -q -pdr -d"_DEBUG" -d"LARGE_MODEL" -ml -mt -v28'),
LINKCOM = '$LINK $LINKFLAGS ${SOURCES.file} -o ${TARGET.base}.out',
LINK = 'C:/appl/ti/ccs/3.3/C2000/cgtools/bin/cl2000',
LINKFLAGS = Split('-z -q -c -ecode_start -stack0x200 -w -x'),
ASCOM = '$CC $CFLAGS $CCFLAGS $SOURCES',
#Bizarre but true. assembly is just like compiling C.
);
includes = {'CCFLAGS' : [
'-i../common/headers/include',
'-i../common/include',
'-fr.',
'-fs.'
]};
env.MergeFlags(includes);
links = {'LINKFLAGS' : [
'-m./Debug/Example_2804xGpioToggle.map',
'-i../common/headers/include',
'-iC:/appl/ti/ccs/3.3/C2000/xdais/lib',
'-iC:/appl/ti/ccs/3.3/C2000/cgtools/lib',
'-lrts2800_ml.lib',
'../common/cmd/28044_RAM_lnk.cmd',
'../common/headers/cmd/DSP2804x_Headers_nonBIOS.cmd'
]};
env.MergeFlags(links);
print "CCCOM is:", env['CCCOM'], "\n", env['LINKCOM'], '\n', env['ASCOM'];
env.Program('blink_gpio', [
'Example_2804xGpioToggle.c',
'../common/headers/source/DSP2804x_GlobalVariableDefs.c',
'../common/source/DSP2804x_CodeStartBranch.asm',
'../common/source/DSP2804x_DefaultIsr.c',
'../common/source/DSP2804x_PieCtrl.c',
'../common/source/DSP2804x_PieVect.c',
'../common/source/DSP2804x_SysCtrl.c'
]);
Решение
Я решил обе проблемы, выполнив иерархическая сборка и использование -fr=${TARGET.dir}
в моих флагах компилятора.
Не связан с StackOverflow