diff options
author | Mathieu Lirzin <mthl@gnu.org> | 2015-10-17 20:05:08 +0200 |
---|---|---|
committer | Mathieu Lirzin <mthl@gnu.org> | 2016-05-07 23:38:53 +0200 |
commit | 8952d2dc442913f0ecf1fa896d97c882a5daa664 (patch) | |
tree | 11492526f1a25cbdecd40f899f2ba19adfa90433 | |
parent | b59f2f5ea6f99681ca61f9342206c11f3a165b2c (diff) | |
download | mcron-8952d2dc442913f0ecf1fa896d97c882a5daa664.tar.gz mcron-8952d2dc442913f0ecf1fa896d97c882a5daa664.tar.bz2 mcron-8952d2dc442913f0ecf1fa896d97c882a5daa664.zip |
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.
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r-- | Makefile.am | 7 | ||||
-rw-r--r-- | build-aux/pre-inst-env.in | 35 | ||||
-rw-r--r-- | configure.ac | 10 | ||||
-rw-r--r-- | mcron.c | 10 |
5 files changed, 59 insertions, 7 deletions
@@ -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 <mthl@gnu.org> +# +# 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 <http://www.gnu.org/licenses/>. + +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]) @@ -22,6 +22,7 @@ is needed because the crontab personality requires SUID which is not permitted for executable scripts. */ +#include "config.h" #include <libguile.h> #include <signal.h> #include <stdlib.h> @@ -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); |