16
  • Ubuntu 12.04
  • CMake 2.8.9
  • Postgresql 9.2.2

I'm trying to get the FindPostgreSQL module to find /usr/include/postgresql/libpq-fe.h.

Here's what I have in my CMakeLists.txt:

find_package(PostgreSQL REQUIRED)

This is the error I get:

CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (MESSAGE):
  Could NOT find PostgreSQL (missing: PostgreSQL_TYPE_INCLUDE_DIR) (found
  version "9.2.2")
Call Stack (most recent call first):
  /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:288 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-2.8/Modules/FindPostgreSQL.cmake:155 (find_package_handle_standard_args)
  CMakeLists.txt:7 (find_package)

I added the following lines before calling find_package but it didn't seem to have any effect.

set(PostgreSQL_ADDITIONAL_VERSIONS "9.2.2")
set(PostgreSQL_ADDITIONAL_SEARCH_PATHS ${PostgreSQL_ADDITIONAL_SEARCH_PATHS} "/usr/include/postgresql")

I also tried googling for PostgreSQL_TYPE_INCLUDE_DIR but didn't find anything. What else can I try?

Ilia Choly
  • 18,070
  • 14
  • 92
  • 160
  • 6
    For anyone getting this error it also happens when you have `libpq-dev` installed but not `postgresql-server-dev-9.3` – PeterT Jul 30 '14 at 10:36

4 Answers4

39

Make sure you've installed both libpq-dev\ and postgresql-server-dev-all (or specific version e.g. postgresql-server-dev-9.4)

$ dpkg --get-selections | grep -e "libpq-dev\|postgresql-server-dev"

in case you're missing some package

apt-get install libpq-dev postgresql-server-dev-all

should fix it.

Tombart
  • 30,520
  • 16
  • 123
  • 136
8

On Ubuntu you can also work around that issue by calling cmake with having PostgreSQL_TYPE_INCLUDE_DIR defined like this:

cmake -DPostgreSQL_TYPE_INCLUDE_DIR=/usr/include/postgresql/

See the bug report [1] for this issue and a potential fix [2]. Álso see the discussion about the reasoning behind the move on the debian mailinglist at [3].

On Ubuntu/Debian, starting with PostgreSQL 9.3 the header file pg_type.h is moved to a separate package (from libpq-dev to postgresql-server-dev) and consequently the file pg_type.h is moved to a new location

Martin Gerhardy
  • 1,860
  • 22
  • 13
7

After a bit more debugging I figured out that it's getting stuck trying to find pg_type.h

This file is located in /usr/include/postgresql/catalog/pg_types.h but the module is expecting to find it in /usr/include/postgresql/server/catalog/pg_types.h

find_path(PostgreSQL_TYPE_INCLUDE_DIR
  NAMES catalog/pg_type.h
  PATHS
   # Look in other places.
   ${PostgreSQL_ROOT_DIRECTORIES}
  PATH_SUFFIXES
    pgsql/server
    postgresql/server
    include/server
  # Help the user find it if we cannot.
  DOC "The ${PostgreSQL_INCLUDE_DIR_MESSAGE}"
)

It works if I add postgresql to the PATH_SUFFIXES

find_path(PostgreSQL_TYPE_INCLUDE_DIR
  NAMES catalog/pg_type.h
  PATHS
   # Look in other places.
   ${PostgreSQL_ROOT_DIRECTORIES}
  PATH_SUFFIXES
    postgresql
    pgsql/server
    postgresql/server
    include/server
  # Help the user find it if we cannot.
  DOC "The ${PostgreSQL_INCLUDE_DIR_MESSAGE}"
)
Ilia Choly
  • 18,070
  • 14
  • 92
  • 160
  • This almost helps me. Cmake runs but it doesn't seem to set up the include directory paths correctly. Are you having issues with your source code not finding `libpq-fe.h`? I'm disappointed that PostgreSQL is so problematic. – johnzachary Feb 21 '13 at 22:12
  • 1
    @johnzachary It's working for me. Where does your `libpq-fe.h` live? – Ilia Choly Mar 11 '13 at 18:48
  • To help anyone else running into this: Since I first didn't understand, just wanted to point out this change is needed not in our own CMake files, but to the following CMake module: /usr/share/cmake-2.8/Modules/FindPostgreSQL.cmake. Around line #119 for cmake 2.8.9. – Stéphane Apr 15 '13 at 06:46
  • @Stéphane yes I should have clarified that. – Ilia Choly Apr 15 '13 at 13:14
2

From Linux Mint 17.3 ("Rosa") with PostgreSQL 9.3, I had to adjust ilia choly's solution (interestingly, the suggested postgres entry in the list was already present in the file, but wasn't enough to fix things).

I had to edit /usr/share/cmake-2.8/Modules/FindPostgreSQL.cmake around line 114 and add postgresql/9.3 so that the find_path call looks like

find_path(PostgreSQL_TYPE_INCLUDE_DIR
  NAMES catalog/pg_type.h
  PATHS
   # Look in other places.
   ${PostgreSQL_ROOT_DIRECTORIES}
  PATH_SUFFIXES
    postgresql/9.3
    postgresql
    pgsql/server
    postgresql/server
    include/server
  # Help the user find it if we cannot.
  DOC "The ${PostgreSQL_INCLUDE_DIR_MESSAGE}"
)
Max Barraclough
  • 214
  • 2
  • 6