#c #visual-studio-2015 #cmake #googletest
#c #visual-studio-2015 #cmake #googletest
Вопрос:
В моем решении много исходных файлов C ( Google Test
) Visual Studio
, и я хочу иметь возможность сохранить только несколько файлов для сборки (чтобы сосредоточиться на проблеме), но также достаточно быстро возвращаться (два раза в день) к начальной конфигурации.
Мы используем, более или менее, около трех решений: Visual Studio
, CMake
и QT
(но я мог бы добавить еще одно). Я никогда не использовал QT
, поэтому два других решения, которые я вижу, следующие:
Visual Studio
: папки бесполезны, но я могу выбирать файлы и исключать их из сборки. Но эти изменения сохраняются в vcproj, поэтому я должен обратить внимание на то, чтобы не сохранять их в системе управления версиями, что раздражает.CMake
: легко изменитьCMakeLists.txt
(строки комментариев с исходными папками), но у меня всегда есть проблема с контролем версий… возможно, я могу настроить исключенные файлы в пользовательском (пользовательском) файле. Преимущество: я могу генерировать только то, что хочу, более гибкое и не такое скучное, как предыдущее.
Например, если я не хочу, чтобы исходные файлы были в src_2:
file(GLOB_RECURSE SRC_FILES_1
${SOURCE_BASE_DIR}/src_1/*.cpp
${SOURCE_BASE_DIR}/src_1/*.h
)
file(GLOB_RECURSE SRC_FILES_2
${SOURCE_BASE_DIR}/src_2/*.cpp
${SOURCE_BASE_DIR}/src_2/*.h
)
file(GLOB_RECURSE SRC_FILES_3
${SOURCE_BASE_DIR}/src_3/*.cpp
${SOURCE_BASE_DIR}/src_3/*.h
)
add_executable(${PROJECT_TEST_NAME}
${SRC_FILES_1}
# next line is commented
# ${SRC_FILES_2}
${SRC_FILES_3}
)
Есть ли другое решение или способ улучшить одно из предложенных здесь?
Комментарии:
1. Итак, есть файлы cpp, которые вы иногда не хотите компилировать? и иногда вы это делаете? будет ли в порядке переменная, добавленная в команду cmake? Таким образом, вы можете включать / выключать их.
2. Я добавил образец … добавление примера здесь — вот это задача!
Ответ №1:
Вы можете управлять этим с помощью переменной cmake.
option(BUILD_TESTS "builds test cpp files" ON)
Это добавляет опцию для вашего файла cmake. В этом случае по умолчанию используется значение ON, однако вы можете это изменить. Теперь давайте продолжим:
if(BUILD_TESTS)
set(TEST_CPP_FILES test1.cpp test2.cpp)
endif(BUILD_TESTS)
add_executabe(foo bar.cpp bar1.cpp $(TEST_CPP_FILES))
Здесь вы определяете переменную с исходным файлом ваших тестов (или любыми исходными файлами, которые вы хотите создать, когда BUILD_TESTS
есть ON
. Затем они добавляются к цели. Если BUILD_TESTS
значение выключено, эта переменная будет пустой.
теперь, чтобы изменить значение, вы можете запустить
cmake <...> -DBUILD_TESTS=OFF
Или с ON
помощью, если вы хотите снова включить их. Вы также можете сохранить это изменение в системе управления версиями, потому что по умолчанию оно будет ON
равно, и вам нужно явно отключить его.
Вы также можете исключить целые подкаталоги или целевые объекты с помощью этого в инструкции if, если вы не просто хотите исключить исходные файлы.
Редактировать:
Для вашего примера это может выглядеть так:
if(BUILD_TESTS)
file(GLOB_RECURSE SRC_FILES_2
${SOURCE_BASE_DIR}/src_2/*.cpp
${SOURCE_BASE_DIR}/src_2/*.h
)
endif(BUILD_TESTS)
SRC_FILES_2
после этого должно быть пустым.
Комментарии:
1. Да, я мог бы добавить переменную для каждой «папки» с тестовыми файлами, и проблема контроля версий решена. Единственная проблема в том, что мне нужны десятки из них.
2. У вас может быть только 1 переменная, которая просто отключает их все, если это имеет смысл.
3. @Liviu Я отредактировал свой ответ так, как это могло бы выглядеть в вашем примере
4. Я не могу отключить их все, потому что хочу запустить некоторые тесты (мое решение / проект состоит из тестов), но я могу их сгруппировать (src_1, src_2, src_3). И если я действительно хочу сохранить только один файл внутри группы, тогда я могу изменить CMakeLists.txt , сгенерируйте мое решение и отмените изменение.
5. Мне нравится решение, я попробую его в течение недели или двух, и если нет другой проблемы или решения, я приму ваш любезный ответ, спасибо