Как я могу продолжить прерванную компиляцию после возникновения ошибки? - PullRequest
0 голосов
/ 02 июня 2018

После того, как произошла ошибка из-за отсутствующего флага или неправильно установленной переменной среды, возможно ли продолжить компиляцию после исправления ошибки?

Iрегулярно использую CMake и make для компиляции наборов инструментов, для компиляции которых требуется много времени, а также регулярно я случайно устанавливаю переменные в процессе.Только сейчас, например, я пытался включить заголовки OpenInventor, которые на моей машине находятся в каталоге /Users/user/software/prod/coin/include/Inventor.

Я ошибочно передал

-DINVENTOR_INCLUDE_DIR=/Users/user/software/prod/coin/include/Inventor

вместо правильного

-DINVENTOR_INCLUDE_DIR=/Users/user/software/prod/coin/include

Это стало проблемой только через 30 минут, когда было завершено около 95% компиляции.Поскольку я знал, что перенастройка с использованием CMake приведет к перекомпиляции с нуля, я попытался добавить -I/Users/user/software/prod/coin/include к CMAKE_CXX_FLAGS в CMakeCache.txt, но безрезультатно - он все равно перекомпилировался с нуля.Поскольку только один исходный файл фактически включает в себя рассматриваемые заголовки, было бы желательно, чтобы я мог начать компиляцию с того места, где он завершился с ошибкой после исправления соответствующего пути.Как я могу это сделать и, кроме того, почему он заставляет компилятор запускаться с нуля?

Я использую CMake версии 3.11.1 и clang (Apple LLVM версия 9.1.0) в macOS 10.13

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

CMake не нужно перекомпилировать все только потому, что он восстанавливает свои make-файлы.Он по-прежнему будет выполнять обычные операции обхода.Однако CMake отслеживает параметры компилятора, используемые для создания каждой цели, поэтому, если вы внесете изменения в параметры компилятора для всех целей, их все нужно будет перестроить.

Если эта опция компилятора нужна толькодля одной цели вы можете добавить ее только к этой цели, а не к другим, с чем-то вроде этого:

set_property(SOURCE my_source.c APPEND PROPERTY
    COMPILE_FLAGS -I/foo/bar)

тогда он должен перестроить только один исходный файл.

0 голосов
/ 02 июня 2018

CMake ищет время «последнего изменения» файлов, чтобы решить, какие файлы нужно перекомпилировать.Но если вы измените входные данные на сам CMake, то он должен будет восстановить файлы Makefile и, следовательно, перекомпилировать все.Но все же, один хак может быть возможен ...

CMake хранит информацию о каталогах включения и библиотеках, которые будут связаны в различных текстовых файлах в каталоге сборки.Таким образом, один хак (не рекомендуется, но работает) может быть для изменения этих текстовых файлов.

В конкретном примере, который вы упомянули, хак будет искать и заменять все вхождения /Users/user/software/prod/coin/include/Inventor с /Users/user/software/prod/coin/include во всех файлах каталога сборки.

(Кроме того, если вы еще не знаете, вы можете использовать make -j <n> для сборки с использованием нескольких потоков, что может значительно уменьшитьвремя сборки.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...