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.
This commit is contained in:
parent
b59f2f5ea6
commit
8952d2dc44
5 changed files with 59 additions and 7 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 > $@
|
||||
|
||||
|
|
|
|||
35
build-aux/pre-inst-env.in
Normal file
35
build-aux/pre-inst-env.in
Normal file
|
|
@ -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 "$@"
|
||||
10
configure.ac
10
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])
|
||||
|
|
|
|||
10
mcron.c
10
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 <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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue