diff --git a/Makefile b/Makefile index 50e2c8ab7f..566f2ecb10 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,8 @@ +ROOT_PROJECT_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) + +# Where to install Postgres, default is ./tmp_install, maybe useful for package managers +POSTGRES_INSTALL_DIR ?= $(ROOT_PROJECT_DIR)/tmp_install + # Seccomp BPF is only available for Linux UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Linux) @@ -55,55 +60,55 @@ zenith: postgres-headers $(CARGO_CMD_PREFIX) cargo build $(CARGO_BUILD_FLAGS) ### PostgreSQL parts -tmp_install/build/config.status: +$(POSTGRES_INSTALL_DIR)/build/config.status: +@echo "Configuring postgres build" - mkdir -p tmp_install/build - (cd tmp_install/build && \ - ../../vendor/postgres/configure CFLAGS='$(PG_CFLAGS)' \ + mkdir -p $(POSTGRES_INSTALL_DIR)/build + (cd $(POSTGRES_INSTALL_DIR)/build && \ + $(ROOT_PROJECT_DIR)/vendor/postgres/configure CFLAGS='$(PG_CFLAGS)' \ $(PG_CONFIGURE_OPTS) \ $(SECCOMP) \ - --prefix=$(abspath tmp_install) > configure.log) + --prefix=$(abspath $(POSTGRES_INSTALL_DIR)) > configure.log) # nicer alias for running 'configure' .PHONY: postgres-configure -postgres-configure: tmp_install/build/config.status +postgres-configure: $(POSTGRES_INSTALL_DIR)/build/config.status -# Install the PostgreSQL header files into tmp_install/include +# Install the PostgreSQL header files into $(POSTGRES_INSTALL_DIR)/include .PHONY: postgres-headers postgres-headers: postgres-configure +@echo "Installing PostgreSQL headers" - $(MAKE) -C tmp_install/build/src/include MAKELEVEL=0 install + $(MAKE) -C $(POSTGRES_INSTALL_DIR)/build/src/include MAKELEVEL=0 install # Compile and install PostgreSQL and contrib/neon .PHONY: postgres postgres: postgres-configure \ postgres-headers # to prevent `make install` conflicts with zenith's `postgres-headers` +@echo "Compiling PostgreSQL" - $(MAKE) -C tmp_install/build MAKELEVEL=0 install + $(MAKE) -C $(POSTGRES_INSTALL_DIR)/build MAKELEVEL=0 install +@echo "Compiling contrib/neon" - $(MAKE) -C tmp_install/build/contrib/neon install + $(MAKE) -C $(POSTGRES_INSTALL_DIR)/build/contrib/neon install +@echo "Compiling contrib/neon_test_utils" - $(MAKE) -C tmp_install/build/contrib/neon_test_utils install + $(MAKE) -C $(POSTGRES_INSTALL_DIR)/build/contrib/neon_test_utils install +@echo "Compiling pg_buffercache" - $(MAKE) -C tmp_install/build/contrib/pg_buffercache install + $(MAKE) -C $(POSTGRES_INSTALL_DIR)/build/contrib/pg_buffercache install +@echo "Compiling pageinspect" - $(MAKE) -C tmp_install/build/contrib/pageinspect install + $(MAKE) -C $(POSTGRES_INSTALL_DIR)/build/contrib/pageinspect install .PHONY: postgres-clean postgres-clean: - $(MAKE) -C tmp_install/build MAKELEVEL=0 clean + $(MAKE) -C $(POSTGRES_INSTALL_DIR)/build MAKELEVEL=0 clean # This doesn't remove the effects of 'configure'. .PHONY: clean clean: - cd tmp_install/build && $(MAKE) clean + cd $(POSTGRES_INSTALL_DIR)/build && $(MAKE) clean $(CARGO_CMD_PREFIX) cargo clean # This removes everything .PHONY: distclean distclean: - rm -rf tmp_install + rm -rf $(POSTGRES_INSTALL_DIR) $(CARGO_CMD_PREFIX) cargo clean .PHONY: fmt @@ -112,4 +117,4 @@ fmt: .PHONY: setup-pre-commit-hook setup-pre-commit-hook: - ln -s -f ../../pre-commit.py .git/hooks/pre-commit + ln -s -f $(ROOT_PROJECT_DIR)/pre-commit.py .git/hooks/pre-commit diff --git a/libs/postgres_ffi/build.rs b/libs/postgres_ffi/build.rs index 0043b9ab58..703d972480 100644 --- a/libs/postgres_ffi/build.rs +++ b/libs/postgres_ffi/build.rs @@ -2,6 +2,7 @@ extern crate bindgen; use std::env; use std::path::PathBuf; +use std::process::Command; use bindgen::callbacks::ParseCallbacks; @@ -45,6 +46,45 @@ fn main() { // Tell cargo to invalidate the built crate whenever the wrapper changes println!("cargo:rerun-if-changed=pg_control_ffi.h"); + // Finding the location of C headers for the Postgres server: + // - if POSTGRES_INSTALL_DIR is set look into it, otherwise look into `/tmp_install` + // - if there's a `bin/pg_config` file use it for getting include server, otherwise use `/tmp_install/include/postgresql/server` + let mut pg_install_dir: PathBuf; + let inc_server_path: String; + + if let Some(postgres_install_dir) = env::var_os("POSTGRES_INSTALL_DIR") { + pg_install_dir = postgres_install_dir.into(); + } else { + pg_install_dir = PathBuf::from("tmp_install") + } + + if pg_install_dir.is_relative() { + let cwd = env::current_dir().unwrap(); + pg_install_dir = cwd.join("..").join("..").join(pg_install_dir); + } + + let pg_config_bin = pg_install_dir.join("bin").join("pg_config"); + if pg_config_bin.exists() { + let output = Command::new(pg_config_bin) + .arg("--includedir-server") + .output() + .expect("failed to execute `pg_config --includedir-server`"); + + if !output.status.success() { + panic!("`pg_config --includedir-server` failed") + } + + inc_server_path = String::from_utf8(output.stdout).unwrap().trim_end().into(); + } else { + inc_server_path = pg_install_dir + .join("include") + .join("postgresql") + .join("server") + .into_os_string() + .into_string() + .unwrap(); + } + // The bindgen::Builder is the main entry point // to bindgen, and lets you build up options for // the resulting bindings. @@ -81,15 +121,7 @@ fn main() { // explicit padding fields. .explicit_padding(true) // - // Path the server include dir. It is in tmp_install/include/server, if you did - // "configure --prefix=". But if you used "configure --prefix=/", - // and used DESTDIR to move it into tmp_install, then it's in - // tmp_install/include/postgres/server - // 'pg_config --includedir-server' would perhaps be the more proper way to find it, - // but this will do for now. - // - .clang_arg("-I../../tmp_install/include/server") - .clang_arg("-I../../tmp_install/include/postgresql/server") + .clang_arg(format!("-I{inc_server_path}")) // // Finish the builder and generate the bindings. //