2016-11-01 13 views
0

Я в процессе переноса проекта makefile в scons, и я не могу понять, как создать уникальный #define для каждого файла. Я хотел бы иметь базовое имя файла для каждого файла, определенного для поддержки некоторых настраиваемых макросов отладки. В make-файле я могу сделать это со следующим определением.Как я могу добавить per-file для проекта scons

-DBASE_FILE_NAME=\"$(<F)\" 

Я не уверен, как это сделать, или если это возможно в случае с бразильцами, и будет признателен за любую обратную связь.

ответ

0

После некоторых экспериментов, похоже, работает.

import os 
from glob import glob 

# use Python glob, not scons Glob! 
CPP_FILES = glob('./src/*.cpp') 

env = Environment(CPPPATH='./include', etc...) 

for f in CPP_FILES: 
    env.Object(f, CPPDEFINES={'BASE_FILENAME' : "\\\"" + os.path.basename(f) + "\\\""}) 

O_FILES = [os.path.splitext(f)[0] + '.o' for f in CPP_FILES] 

env.Program('myprogram', O_FILES) 

Это позволяет мне определять вещи на основе каждого файла, не перечисляя файлы отдельно.

+0

Почему бы не использовать SCons Glob? – bdbaddog

+0

Изменить: на: O_FILES = [], затем O_FILE.extend (env.Object (.... – bdbaddog

+0

Поскольку glob дает мне список имен файлов, с которыми я могу манипулировать при создании списка O_FILES. Scons Glob возвращает список объектов Pyhton –

0

Возможно, следующее? (Не пробовал, но что-то в этом направлении должно работать)

env.Program('filename.c',CPPDEFINES='-DBASE_FILE_NAME=\"$SOURCE\"') 
+0

Спасибо. Я дам ему попробовать. –

+0

Это не работает, потому что в настоящее время я использую «Glob ('*. Cpp»), чтобы заставить scons создавать каждый .cpp-файл в исходной папке, а не перечислять их отдельно. Добавление CPPDEFINES в среду не работает в этой ситуации. Я полагаю, что я мог бы использовать Python для создания списка всех .cpp-файлов, а затем цикл над этим списком, вызывающий env.Object для каждого из них. Я просто надеялся, что у scons может быть встроенный механизм для обработки этой ситуации. –

+0

Как вы их компилируете сейчас? Подача их в SharedLibrary() или Program()? или другой? – bdbaddog