From 8952d2dc442913f0ecf1fa896d97c882a5daa664 Mon Sep 17 00:00:00 2001 From: Mathieu Lirzin Date: Sat, 17 Oct 2015 20:05:08 +0200 Subject: build: Support VPATH builds. This allows using 'mcron' before it is installed without hardcoding the local build environment in the executable. * build-aux/pre-inst-env.in: New script. * configure.ac (AC_CONFIG_FILES): Create it. (AC_CONFIG_HEADER): Add 'config.h'. (moduledir): New variable. (PACKAGE_LOAD_PATH): new C preprocessor macro. * mcron.c: Include "config.h". (main): Don't overwrite Guile load paths. (inner_main): Prepend Mcron modules load paths. * Makefile.am (.scm.go, doc/mcron.1): Use 'pre-inst-env'. (mcron_CFLAGS): Remove GUILE_LOAD_PATH macro. (noinst_SCRIPTS): New variable. * .gitignore: Update. --- .gitignore | 4 ++++ Makefile.am | 7 ++++--- build-aux/pre-inst-env.in | 35 +++++++++++++++++++++++++++++++++++ configure.ac | 10 +++++++--- mcron.c | 10 +++++++++- 5 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 build-aux/pre-inst-env.in diff --git a/.gitignore b/.gitignore index 3aa3599..17829a7 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,8 @@ aclocal.m4 autom4te.cache compile config.cache +config.h +config.h.in config.log config.scm config.status @@ -33,4 +35,6 @@ core.scm depcomp install-sh missing +pre-inst-env +stamp-h1 texinfo.tex diff --git a/Makefile.am b/Makefile.am index 8c7b4d0..c2d42b4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -18,7 +18,7 @@ bin_PROGRAMS = mcron mcron_SOURCES = mcron.c -mcron_CFLAGS = @GUILE_CFLAGS@ -DGUILE_LOAD_PATH=\"$(datadir):./scm:...\" +mcron_CFLAGS = @GUILE_CFLAGS@ mcron_DEPENDENCIES = $(GOBJECTS) # Build Guile modules before linking. mcron_LDADD = @GUILE_LIBS@ @@ -65,13 +65,14 @@ dist_mcronmodule_DATA = \ $(AM_V_GUILEC)$(MKDIR_P) `dirname "$@"` ; \ unset GUILE_LOAD_COMPILED_PATH ; \ LC_ALL=C \ - $(GUILD) compile \ + $(top_builddir)/pre-inst-env $(GUILD) compile \ --load-path="$(top_builddir)/scm" \ --load-path="$(top_srcdir)/scm" \ --warn=format --warn=unbound-variable --warn=arity-mismatch \ --target="$(host)" --output="$@" "$<" SUFFIXES = .go +noinst_SCRIPTS = pre-inst-env dist-hook: gen-ChangeLog @@ -128,7 +129,7 @@ dist_man_MANS = doc/mcron.1 # elemental man page. Will only work once the mcron program is installed. doc/mcron.1: mcron.c -$(AM_V_HELP2MAN)$(MKDIR_P) `dirname "$@"` ; \ - $(HELP2MAN) \ + $(top_builddir)/pre-inst-env $(HELP2MAN) \ -n 'a program to run tasks at regular (or not) intervals' \ ./mcron > $@ diff --git a/build-aux/pre-inst-env.in b/build-aux/pre-inst-env.in new file mode 100644 index 0000000..7e69b44 --- /dev/null +++ b/build-aux/pre-inst-env.in @@ -0,0 +1,35 @@ +#!/bin/sh + +# Copyright © 2015, 2016 Mathieu Lirzin +# +# This file is part of GNU Mcron. +# +# GNU Mcron is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# GNU Mcron is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Mcron. If not, see . + +abs_top_srcdir="`cd "@abs_top_srcdir@" > /dev/null; pwd`" +abs_top_builddir="`cd "@abs_top_builddir@" > /dev/null; pwd`" + +GUILE_LOAD_COMPILED_PATH="$abs_top_builddir/scm${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_LOAD_COMPILED_PATH" +GUILE_LOAD_PATH="$abs_top_builddir/scm:$abs_top_srcdir/scm${GUILE_LOAD_PATH:+:}:$GUILE_LOAD_PATH" +export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH + +PATH="$abs_top_builddir:$PATH" +export PATH + +# Define $MCRON_UNINSTALLED to prevent 'mcron' from prepending @moduledir@ to +# the Guile load paths. +MCRON_UNINSTALLED=1 +export MCRON_UNINSTALLED + +exec "$@" diff --git a/configure.ac b/configure.ac index 9972ad5..d6262f2 100644 --- a/configure.ac +++ b/configure.ac @@ -23,13 +23,15 @@ AC_PREREQ(2.61) AC_INIT([GNU Mcron], [1.0.8], [bug-mcron@gnu.org]) +AC_CONFIG_HEADER([config.h]) AC_CONFIG_AUX_DIR([build-aux]) AM_INIT_AUTOMAKE([subdir-objects]) AM_SILENT_RULES([yes]) # enables silent rules by default -mcronmoduledir="${datarootdir}/guile/site/2.0/mcron" -AC_SUBST([mcronmoduledir]) - +moduledir="${datarootdir}/guile/site/2.0" +AC_SUBST([mcronmoduledir], ["${moduledir}/mcron"]) +AC_DEFINE_UNQUOTED([PACKAGE_LOAD_PATH], ["${moduledir}"], + [Define to the guile modules location of this package.]) AC_MSG_CHECKING([whether debugging is requested]) AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], @@ -181,6 +183,8 @@ AC_SUBST(CONFIG_TMP_DIR) real_program_prefix=`echo $program_prefix | sed s/NONE//` AC_SUBST(real_program_prefix) +AC_CONFIG_FILES([pre-inst-env:build-aux/pre-inst-env.in], + [chmod +x pre-inst-env]) AC_CONFIG_FILES([doc/config.texi Makefile scm/mcron/config.scm]) diff --git a/mcron.c b/mcron.c index 0c62ec8..92e1a37 100644 --- a/mcron.c +++ b/mcron.c @@ -22,6 +22,7 @@ is needed because the crontab personality requires SUID which is not permitted for executable scripts. */ +#include "config.h" #include #include #include @@ -35,7 +36,6 @@ static SCM set_cron_signals (void); int main (int argc, char **argv) { - setenv ("GUILE_LOAD_PATH", GUILE_LOAD_PATH, 1); scm_boot_guile (argc, argv, inner_main, 0); return EXIT_SUCCESS; @@ -45,6 +45,14 @@ main (int argc, char **argv) static void inner_main (void *closure, int argc, char **argv) { + /* Set Guile load paths to ensure that Mcron modules will be found. */ + if (getenv ("MCRON_UNINSTALLED") == NULL) + { + scm_c_eval_string ("(set! %load-path (cons \"" + PACKAGE_LOAD_PATH "\" %load-path))"); + scm_c_eval_string ("(set! %load-compiled-path (cons \"" + PACKAGE_LOAD_PATH "\" %load-compiled-path))"); + } scm_set_current_module (scm_c_resolve_module ("mcron main")); /* Register set_cron_signals to be called from Guile. */ scm_c_define_gsubr ("c-set-cron-signals", 0, 0, 0, set_cron_signals); -- cgit v1.2.3