Исключение файлов (пользовательских и временных) из сборки

#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. Мне нравится решение, я попробую его в течение недели или двух, и если нет другой проблемы или решения, я приму ваш любезный ответ, спасибо