LINUX.ORG.RU

Объясните как работает связка cmake + make

 ,


0

2

Здравствуйте. Есть большой проект, который конфигурируется cmake и собирается make. В проект входит некий компонент, который не переписан на конфигурирование cmake, там обычный Makefile и переписывать его не хочется.

Из cmake я просто создаю отдельный таргет, командой add_custom_target. Внутри этого таргета копирую проект в билд-папку. И собираю его там простым вызовом make внутри этого таргета.

То есть, чтобы нагляднее было:

    add_custom_target(${CUSTOM_TARGET} ALL
      COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}" "${CUSTOM_BUILD_DIR}"
      COMMAND $(MAKE) clean
      COMMAND $(MAKE) 
      COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${PRODUCT} "${PRODUCT_DIR}"
      WORKING_DIRECTORY "${CUSTOM_BUILD_DIR}"
      VERBATIM
      )
 

Проект отлично собирается. Все хорошо. Но! Если выполнить снова make -j8 на уже собранном проекте, то получается следующее:

make[5]: Предупреждение: время изменения файла "blablabla.c" находится в будущем (0.0011)
make[5]: предупреждение: Неправильный ход часов.  Сборка может быть неполной.

Похоже это значит, make -j8 распараллеивает команды еще и внутри таргета. Видимо make исполнилось раньше, чем copy_directory.

Прав ли я? И как это пофиксить? Заранее спасибо за ответы. :-)

★★★★★

Последнее исправление: hibou (всего исправлений: 2)

И как это пофиксить?

touch

Crocodoom ★★★★★
()

Похоже это значит, make -j8 распараллеивает команды еще и внутри таргета. Видимо make исполнилось раньше, чем copy_directory.

Нет, не распараллеливает, в документации про это написано первым делом.

slovazap ★★★★★
()
Ответ на: комментарий от hibou

Не знаю, не могу придумать как такое могло появиться из-за такого определения таргета. Может косяки в Makefile (лучше бы вам от него в любом случае отказаться), может косяки с часами.

slovazap ★★★★★
()

Я бы посмотрел, что там cmake нагенерировал. Косяк может быть там.

И не понятно, это ошибка из какого make: основного проекта или второго? Может второй не умеет параллельно собираться нормально.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Спасибо большое!

Пособирал так несколько раз, предупреждение вроде не повторяется. Пока посчитаем, что какой-нить глюк часов.

Да, по хорошему, надо бы и тот компонентик тоже на cmake переводить, но это сложно. Да и к тому же, там модуль ядра. Я пока не знаю как модули ядра собирать cmake’ом.

hibou ★★★★★
() автор топика
Ответ на: комментарий от hibou

имхо было бы лучше, если бы указать выхлоп сборки как OUTPUT, потом этот оутпут к какой-нибудь цели пркрепить. так cmake сможет знать что от чего зависит. если например обновится make файл, то cmake пересоберет цель. а так это просто выполняется каждый раз (все комманда). там может быть так, что какой-нибудь файл, в ходе этого, обновлется и время сбивается каждый раз.

zerhud
()

А ты файлы (исходники) не перемещал откуда-нибудь из другой среды или ОС? Может архив с ними распаковывал?

EXL ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.