Как мне может потребоваться сгенерированный файл в моем SConscript?

#scons

#бра

Вопрос:

Я работаю над добавлением модульного тестирования googletest в большой проект.

У нас есть SConstruct верхнего уровня, который вызывает SConscripts для каждого из подмодулей git, которые в дальнейшем могут вызывать другие SConstructs, содержащиеся в каждом компоненте.

Один из этих SConscripts создаст платформу googletest, которая, среди прочего, создаст файл «gtest.h». Мне нужно включить ‘gtest.h’ в мой исходный файл (test1.cpp), который находится в другом репозитории, имеющем свой собственный SConscript.

Как я могу потребовать gtest.h в тестовом файле SConscript перед test1.cpp потребляет его?

Представьте себе что-то вроде:

БРА верхнего уровня:

 env.SConscript('{path to Gtest}/SConscript') env.SConscript('{path to my unit test}/SConscript')  

SConscript для построения Gtest:

 env2 = env.Clone() def buildGtest(target, source, env):  #Assuming I have a CMake file that does this in the directory...  subprocess.run(['cmake', '../'], cwd='build/')  subprocess.run(['make'], cwd='build/')   env2.Command(['gtest.h', 'build/libgtest.a', 'build/libgtest_main.a'], [], buildGtest)  

SConscript для моего модульного теста:

 env2 = env.Clone() env2.Require('{path to gtest}/build/include/gtest.h') # This doesn't seem to work env2.Append(CPPPATH='{path to gtest}/build/include') env2.Object(target = 'test1.o', source = 'test1.cpp')  

Комментарии:

1. Если команда сборки для googletest создает файл gtest.h, то добавление файла gtest.h для последующих команд должно сработать. Или я чего — то не понимаю

2. Похоже, он пытается скомпилировать test1.cpp до того, как будет установлен gtest.h. Я продолжаю получать ошибку компиляции, из-за которой он не может найти gtest.h, хотя я добавил путь к месту создания gtest.h в SConscript для test1.cpp

3. О, хорошо, я понимаю, gtest.h должен быть передан непосредственно в директиву объекта. (по крайней мере, в соответствии с моими ограниченными знаниями scons) это должно быть сделано так, как это возвращается из командной директивы. Вы должны иметь возможность распечатать его, чтобы увидеть. Скорее всего, это должна быть точно такая же строка

4. Похоже, БРА не выдержат . h в директиве объекта. Я попытался, но затем он пожаловался, что не знает, как создать исходный файл с суффиксом». h», а затем дал мне список допустимых суффиксов (.c,. cpp и т. Д.)

Ответ №1:

Вам необходимо убедиться, что ваш CPP-путь содержит местоположение, в котором googletest создает файл заголовка.

Это не очень здорово. Вы должны указать хотя бы один исходный файл. Я предполагаю, что у вас есть CmakeList.txt и куча исходных файлов, которые вы должны перечислить здесь, чтобы он перестроился, если они изменятся.

 env2.Command(['gtest.h', 'build/libgtest.a', 'build/libgtest_main.a'], [], buildGtest)  

Кроме того, я бы изменил ваш buildGtest на следующий.

buildGtest = [«сборка компакт-диска; cmake ../’,’сборка компакт-диска; сделать’]

И избавьтесь от своей функции.

 env2.Command(['gtest.h', 'build/libgtest.a', 'build/libgtest_main.a'], [], buildGtest)  

Затем SCons отсканирует ваш исходный файл и узнает, что для этого требуется этот файл.

Вы можете проверить дерево зависимостей, о котором известно SCons, запустив как

scons --tree=prune

Это может быть довольно многословно, но вы увидите все зависимости.

Вы также должны иметь возможность работать как

scons --tree=prune {path to my unit test}/test.o

Комментарии:

1. «Современный» C привел к использованию некоторых этих библиотек только для заголовков, поэтому нам приходится иметь с этим дело 🙂 Мне уже приходилось спорить с googletest раньше.