ExternalProject_Add для ошибки проекта Makefile во время сборки

#cmake #external-project #cmake-modules

#cmake #external-project #cmake-модули

Вопрос:

Я пытаюсь добавить Postgresql в качестве зависимости для своего проекта, для которого я использую модуль ExternalProject для загрузки исходного кода с github и сборки, но этап сборки завершается неудачно при запуске из cmake ( cmake --build . ). Кажется, что шаг настройки выполнен успешно, и если я перейду в каталог сборки EP_BASE и выполню a make , он будет успешно выполнен. Я получаю следующую ошибку во время сборки:

 <...>/Source/postgresql_external/src/common/relpath.c:21:10: fatal error: catalog/pg_tablespace_d.h: No such file or directory
21 | #include "catalog/pg_tablespace_d.h"
  |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[5]: *** [<builtin>: relpath.o] Error 1
make[4]: *** [Makefile:42: all-common-recurse] Error 2
make[3]: *** [GNUmakefile:11: all-src-recurse] Error 2
  

Мой внешний проект add выглядит следующим образом:

 ExternalProject_Add(postgresql_external
  GIT_REPOSITORY    https://github.com/postgres/postgres.git
  GIT_TAG           REL_12_4
  CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR>
  LOG_CONFIGURE 1
  LOG_BUILD 1
  LOG_INSTALL 1
)
  

Это работает на Ubuntu 20.04 LTS с cmake 3.16.3, gcc 9.3.0

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

1. Удалось ли вам решить эту проблему?

Ответ №1:

попробуйте

 ExternalProject_Get_Property(postgresql_external install_dir)
include_directories(${install_dir}/include)
  

Я предполагаю, что вы еще не распространили include каталог на свою цель, но это evtl. известно вашей системе (таким образом, успешный вызов вызываемого вручную make )

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

1. Как это поможет во время сборки (пока нет установки)?

Ответ №2:

Попробуйте следующий код, он работает для меня. PotgreSQL использует переменную MAKELEVEL для генерации заголовочных файлов через perl. Когда вы вызываете make напрямую, он работает так, как ожидалось. Но, похоже, cmake добавляет больше уровней к корневому make в PotgreSQL, поэтому заголовки не генерируются.

 CONFIGURE_COMMAND ./configure <your options>
BUILD_IN_SOURCE 1
BUILD_COMMAND $(MAKE) MAKELEVEL=0