diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d7ab47e2..fe5a4efe2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,19 +29,45 @@ message(STATUS "Build type is ${CMAKE_BUILD_TYPE}") # Search paths for Postgres binaries if (WIN32) -set(POSTGRES_PATHS - "C:/PostgreSQL" - "C:/PostgreSQL/pg96/bin") + find_path(PG_PATH + bin/postgres + HINTS + "C:/PostgreSQL" + "C:/Program Files/PostgreSQL" + PATH_SUFFIXES + bin + 10/bin + 96/bin + pg96/bin + DOC + "The path to a PostgreSQL installation") endif (WIN32) if (UNIX) -set(POSTGRES_PATHS - "/usr/local/pgsql/bin") + find_path(PG_PATH + bin/postgres + HINTS + $ENV{HOME} + /opt/local/pgsql + /usr/local/pgsql + /usr/lib/postgresql + PATH_SUFFIXES + bin + 10/bin + 9.6/bin + 96/bin + pg96/bin + DOC + "The path to a PostgreSQL installation") endif (UNIX) find_program(PG_CONFIG pg_config - PATHS ${POSTGRES_PATHS} - DOC "The path to the pg_config of the PostgreSQL version to compile against" + HINTS + ${PG_PATH} + PATH_SUFFIXES + bin + DOC + "The path to the pg_config of the PostgreSQL version to compile against" REQUIRED) if (NOT PG_CONFIG) @@ -122,13 +148,33 @@ execute_process( OUTPUT_VARIABLE PG_LIBS OUTPUT_STRIP_TRAILING_WHITESPACE) -add_subdirectory(sql) -add_subdirectory(src) +find_path(PG_SOURCE_DIR + src/include/pg_config.h.in + HINTS + $ENV{HOME} + $ENV{HOME}/projects + $ENV{HOME}/Projects + $ENV{HOME}/development + $ENV{HOME}/Development + PATH_SUFFIXES + postgres + postgresql + pgsql + DOC + "The path to the PostgreSQL source tree") + +if (PG_SOURCE_DIR) + message(STATUS "Found PostgreSQL source in ${PG_SOURCE_DIR}") +endif (PG_SOURCE_DIR) if (UNIX) add_subdirectory(test) + add_subdirectory(scripts) endif (UNIX) +add_subdirectory(sql) +add_subdirectory(src) + set(EXT_CONTROL_FILE ${PROJECT_NAME}.control) configure_file(${EXT_CONTROL_FILE}.in ${EXT_CONTROL_FILE}) diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt new file mode 100644 index 000000000..0efc8666a --- /dev/null +++ b/scripts/CMakeLists.txt @@ -0,0 +1,14 @@ +if (APPLE) + # We strictly need gobjdump on macs, because objdump is usually + # llvm's incompatible objdump + find_program(OBJDUMP NAMES gobjdump PATHS /usr/local/bin /opt/local/bin) +else () + find_program(OBJDUMP NAMES gobjdump objdump) +endif (APPLE) + +if (OBJDUMP) + message(STATUS "Using objdump ${OBJDUMP}") + configure_file(generate_typedefs.sh.in generate_typedefs.sh @ONLY) +else () + message(STATUS "Install objdump or gobjdump to be able to run pgindent") +endif (OBJDUMP) diff --git a/scripts/docker-build.sh b/scripts/docker-build.sh index 2e9ed597d..291191d77 100755 --- a/scripts/docker-build.sh +++ b/scripts/docker-build.sh @@ -31,7 +31,7 @@ else fi # Build and install the extension with debug symbols and assertions -docker exec -u root -it ${BUILD_CONTAINER_NAME} /bin/bash -c "cp -a /src/{src,sql,test,version.config,CMakeLists.txt,timescaledb.control.in} /build/ && cd build/debug && cmake -DCMAKE_BUILD_TYPE=Debug .. && make && make install && echo \"shared_preload_libraries = 'timescaledb'\" >> /usr/local/share/postgresql/postgresql.conf.sample && cd / && rm -rf /build" +docker exec -u root -it ${BUILD_CONTAINER_NAME} /bin/bash -c "cp -a /src/{src,sql,test,scripts,version.config,CMakeLists.txt,timescaledb.control.in} /build/ && cd build/debug && cmake -DCMAKE_BUILD_TYPE=Debug .. && make && make install && echo \"shared_preload_libraries = 'timescaledb'\" >> /usr/local/share/postgresql/postgresql.conf.sample && cd / && rm -rf /build" docker commit -a $USER -m "TimescaleDB development image" ${BUILD_CONTAINER_NAME} ${IMAGE_NAME}:${TAG_NAME} diff --git a/scripts/generate_typedef.sh b/scripts/generate_typedef.sh deleted file mode 100755 index cf930d664..000000000 --- a/scripts/generate_typedef.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -OBJDUMP=${OBJDUMP:-gobjdump} - -case "$OSTYPE" in - linux*) OBJDUMP=objdump ;; - darwin*) ;; - bsd*) ;; - *) ;; -esac - -${OBJDUMP} -W src/*.o |egrep -A3 DW_TAG_typedef |perl -e 'while (<>) { chomp; @flds = split;next unless (1 < @flds);\ - next if $flds[0] ne "DW_AT_name" && $flds[1] ne "DW_AT_name";\ - next if $flds[-1] =~ /^DW_FORM_str/;\ - print $flds[-1],"\n"; }' |sort |uniq > typedef.list.local -wget -q -O - "http://www.pgbuildfarm.org/cgi-bin/typedefs.pl?branch=HEAD" |\ - cat - typedef.list.local | sort | uniq > typedef.list -rm typedef.list.local diff --git a/scripts/generate_typedefs.sh.in b/scripts/generate_typedefs.sh.in new file mode 100755 index 000000000..fed65894a --- /dev/null +++ b/scripts/generate_typedefs.sh.in @@ -0,0 +1,16 @@ +#!/bin/bash + +TMPDIR=${TMPDIR:-$(mktemp -d 2>/dev/null || mktemp -d -t 'timescaledb_typedef')} + +trap cleanup EXIT + +cleanup() { + rm -rf ${TMPDIR} +} + +@OBJDUMP@ -W @CMAKE_BINARY_DIR@/src/CMakeFiles/timescaledb.dir/*.o |egrep -A3 DW_TAG_typedef |perl -e 'while (<>) { chomp; @flds = split;next unless (1 < @flds);\ + next if $flds[0] ne "DW_AT_name" && $flds[1] ne "DW_AT_name";\ + next if $flds[-1] =~ /^DW_FORM_str/;\ + print $flds[-1],"\n"; }' |sort |uniq > ${TMPDIR}/typedefs.list.local +wget -q -O - "http://www.pgbuildfarm.org/cgi-bin/typedefs.pl?branch=HEAD" |\ + cat - ${TMPDIR}/typedefs.list.local | sort | uniq diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fa033f5e1..482a6114d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -114,6 +114,27 @@ add_custom_command( COMMENT "Generating gitcommit.h" VERBATIM) +find_program(PGINDENT pgindent + HINTS ${PG_SOURCE_DIR} + PATH_SUFFIXES src/tools/pgindent + DOC "Format C code according to PostgreSQL standards") + +if (PGINDENT) + message(STATUS "Using pgindent ${PGINDENT}") +else () + message(STATUS "Install pgindent to be able to format C code: https://github.com/postgres/postgres/tree/master/src/tools/pgindent") +endif (PGINDENT) + +# Configuration for running pgindent +if (OBJDUMP AND PGINDENT) + add_custom_command(OUTPUT typedefs.list + DEPENDS ${PROJECT_NAME} + COMMAND sh ${CMAKE_BINARY_DIR}/scripts/generate_typedefs.sh > typedefs.list) + add_custom_target(pgindent + COMMAND ${PGINDENT} -typedefs typedefs.list -code-base ${CMAKE_SOURCE_DIR}/src + DEPENDS typedefs.list) +endif (OBJDUMP AND PGINDENT) + add_library(${PROJECT_NAME} MODULE ${SOURCES} ${HEADERS} ${GITCOMMIT_H}) set_target_properties(${PROJECT_NAME} PROPERTIES diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index ff14fb216..5d0e5e230 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,6 +1,6 @@ # Testing support find_program(PG_REGRESS pg_regress - PATHS + HINTS "${PG_PKGLIBDIR}/pgxs/src/test/regress/" REQUIRED)