В нашей сборке мы создаем исполняемый файл с такими тестами:
tests = env.Program(os.path.join(env['testDir'], name + '_test'),
src + createManifest(env),
LIBS = libs,
LIBPATH = buildLibPath(env),
LINKFLAGS = env['LINKFLAGS'],
CPPPATH = cppPath)
Это правильно создает исполняемый файл, который позже запускается следующим компоновщиком:
action = tests[0].abspath + '&& echo %DATE% %TIME% > ${TARGET}'
runTests = env.Command(source = tests,
target = 'test_'+name+'.tmp',
action = action)
До этого момента все работало нормально: тесты запускались во время сборки.
Я недавно нашел Визуальный детектор утечки инструмент и хотел включить это в сборку. Итак, я изменил среду для строителей следующим образом:
vldInclude = os.path.join(os.path.normpath(env['vldIncDir']), 'vld.h')
env.Append(CPPFLAGS='/FI' + vldInclude)
env.Append(LIBPATH = env['vldLibDir'])
vldLib = os.path.join(env['vldLibDir'], 'vld.lib')
libs.append(vldLib) # used in the Program call for the LIBS parameter, see above
scons: *** [build \ debug \ libname \ test_libname.dummy] Ошибка 309
Это сообщение об ошибке не очень полезно. Что это значит и как это исправить?
Оказывается, магическое число 309
Больше googleable когда написано как: 0xC0000135
(понятия не имею, почему C
, но 135
HEX == 309
DEC), и это идентификатор STATUS_DLL_NOT_FOUND
ошибка.
Таким образом, это не ошибка SCons, а ошибка Windows, которая просачивается через SCons.
Это означает, что отсутствуют некоторые библиотеки DLL, необходимые для VLD. В каталоге установки VLD (обычно это C: \ Program Files (x86) \ Visual Leak Detector) два DLL-файла и один файл манифеста можно найти в подкаталоге bin \ Win32.
Чтобы сборка не зависела от среды компьютера, вы можете добавить каталог в env['ENV']['PATH']
или скопируйте файлы в каталог, где проводятся тесты.
Чтобы сделать последнее:
Вам нужен другой вариант конфигурации VLD, кроме каталога библиотеки, а именно каталога binaries. Давайте назовем это vldBinDir
, При запуске сборки вы можете скопировать эти файлы в каталог сборки:
def setupVld(env):
sourcePath = env['vldBinDir']
targetPath = env['testDir']
toCopy = ['dbghelp.dll',
'vld_x86.dll',
'Microsoft.DTfW.DHL.manifest']
nodes = []
for c in toCopy:
n = env.Command(os.path.join(targetPath, c),
os.path.join(sourcePath, c),
SCons.Defaults.Copy("${TARGET}", "${SOURCE}"))
nodes.append(n)
env['vldDeps'] = nodes
А затем, при создании конкретных тестов, обязательно добавьте зависимость:
for n in env['vldDeps']:
env.Depends(tests, n)