On Tuesday 27 of May 2014 08:58:22 Pavel Raiskup wrote: > On Monday 26 of May 2014 21:14:23 Eric Blake wrote: > > That said, I'll probably apply this once I know more about why it is > > needed. > > Please don't, the patch is not correct. I'll repost better one. When > man pages are generated by help2man, the man page target should not be > dependant on generated binary (when help2man is also not distributed, > which is IMO bad idea in principle).
Sorry for the delay. I tried to fix yet another problem blocking me from building that in Copr [1]. Patch 0000: I see that the code I wanted to post was already in source code. The code was (basically) reverted out by the commit a43fd66dc18. This commit caused that there are no guarantees doc directory (and man page then) are generated after the source is built. This causes problems especially after git clone. According to automake.info, we should either ship help2man (which is IMO bad because - as described in docs - it breaks cross-compilation builds of manual pages) or just guarantee that docs are generated later than source. --- Patch 0001 enables module loading and file inclusions on my machine (and also enables me to run testsuite). What did not work previously: * ./src/m4 libtool wrapper * include(AUTHORS) when M4PATH was defined * m4_module_load of 'm4' when m4 directory was in search path I'd be glad to prepare testsuite for those issues ^^ but I would like to receive ack that we could go this way. [1] http://copr.fedoraproject.org/coprs/praiskup/autotools/builds/ Pavel
>From 29aaca21c98b7eff51c56e608fd5053831d42ea3 Mon Sep 17 00:00:00 2001 From: Pavel Raiskup <[email protected]> Date: Mon, 26 May 2014 07:18:28 +0200 Subject: [PATCH 1/2] build: fix bootstrap fail Moving the 'doc' related Makefile targets into doc/Makefile.am to avoid building manual page before the m4 binary itself (suggested by automake.info). Also use LT_LIB_DLLOAD macro to perform proper check for dynamic loading API. References: a43fd66dc18 (revert) * Makefile.am (SUBDIRS): Add doc subdir. (m4_libm4_la_LIBADD): Remove redundant $(LIBADD_DL). * Makefile.am. Move to docs-related rules to .. * doc/Makefile.am: .. here. * configure.ac (LT_LIB_DLLOAD): Added, needed for linking dlopen(), dlerror() and dlsym(). * po/Makevars: Regenerate. * build-aux/m4/gnulib-cache.m4: Likewise. * build-aux/gnulib: Pull newest version. --- Makefile.am | 23 ++--------------------- build-aux/gnulib | 2 +- build-aux/m4/gnulib-cache.m4 | 2 +- configure.ac | 4 ++++ doc/Makefile.am | 35 +++++++++++++++++++++++++++++++++++ po/Makevars | 6 +++--- 6 files changed, 46 insertions(+), 26 deletions(-) create mode 100644 doc/Makefile.am diff --git a/Makefile.am b/Makefile.am index c752ff2..d378b76 100644 --- a/Makefile.am +++ b/Makefile.am @@ -20,10 +20,9 @@ ## ## Written by Gary V. Vaughan <[email protected]> -config_aux_dir = build-aux config_macro_dir= $(config_aux_dir)/m4 -SUBDIRS = po m4/gnu . tests/gnu +SUBDIRS = po m4/gnu . doc tests/gnu ACLOCAL_AMFLAGS = -I build-aux/m4 AUTOMAKE_OPTIONS = nostdinc @@ -232,7 +231,7 @@ m4_libm4_la_SOURCES = \ m4/syntax.c \ m4/utility.c m4_libm4_la_LIBADD = m4/gnu/libgnu.la \ - $(LIBLTDL) $(LTLIBINTL) $(LIBADD_DL) + $(LIBLTDL) $(LTLIBINTL) m4_libm4_la_DEPENDENCIES = $(LTDLDEPS) m4/gnu/libgnu.la # This file needs to be regenerated at configure time. @@ -241,24 +240,6 @@ dist-hook: EXTRA_DIST += m4/system_.h -## -------------- ## -## Documentation. ## -## -------------- ## -info_TEXINFOS = doc/m4.texi -m4_TEXINFOS = doc/regexprops-generic.texi doc/fdl-1.3.texi doc/gpl-3.0.texi -dist_man_MANS = $(srcdir)/doc/m4.1 -EXTRA_DIST += doc/gendocs_template -MAINTAINERCLEANFILES += doc/gendocs_template -HELP2MAN = $(SHELL) $(top_srcdir)/$(config_aux_dir)/missing --run help2man - -# Build the man page once in the srcdir, rather than in every VPATH build -# dir, to match how automake builds info pages. This is safe for 'make -# distcheck' since it is distributed pre-built. -$(srcdir)/doc/m4.1: .version $(srcdir)/src/main.c - @echo "Updating the \`man' page \`$@'"; \ - $(HELP2MAN) --name="macro processor" --source=FSF \ - --info-page=m4 --output=$@ src/m4$(EXEEXT) - TAGS_FILES = $(infos_TEXINFOS) TAGS_DEPENDENCIES = $(TAGS_FILES) ETAGS_ARGS = --language=none --regex='/@node \([^,]*\)/\1/' $(TAGS_FILES) diff --git a/build-aux/gnulib b/build-aux/gnulib index a4482b6..98ca2c0 160000 --- a/build-aux/gnulib +++ b/build-aux/gnulib @@ -1 +1 @@ -Subproject commit a4482b667f8c6ba6e89eacb876fab7ff4775dab4 +Subproject commit 98ca2c063cfe019b673fd0ce81448c919e9c989c diff --git a/build-aux/m4/gnulib-cache.m4 b/build-aux/m4/gnulib-cache.m4 index a31e566..145b3da 100644 --- a/build-aux/m4/gnulib-cache.m4 +++ b/build-aux/m4/gnulib-cache.m4 @@ -1,4 +1,4 @@ -# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/configure.ac b/configure.ac index 2fe6d9e..23bddfc 100644 --- a/configure.ac +++ b/configure.ac @@ -83,6 +83,7 @@ M4_CHECK_DEBUGGING ## ----------------------- ## LT_PREREQ([2.2]) LT_INIT([shared dlopen win32-dll]) +LT_LIB_DLLOAD AC_ARG_ENABLE([gcc-warnings], [AS_HELP_STRING([--enable-gcc-warnings], @@ -95,6 +96,8 @@ AC_ARG_ENABLE([gcc-warnings], [gl_gcc_warnings=no] ) +AC_SUBST([config_aux_dir], [build-aux]) + if test "$gl_gcc_warnings" = yes; then gl_WARN_ADD([-Werror], [WERROR_CFLAGS]) AC_SUBST([WERROR_CFLAGS]) @@ -280,6 +283,7 @@ M4_SYSCMD ## -------- ## AC_CONFIG_FILES([ Makefile +doc/Makefile m4/gnu/Makefile m4/system.h:m4/system_.h tests/atlocal diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..614a91a --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,35 @@ +## Makefile.am - template for generating Makefile via Automake +## +## Copyright (C) 2014 Free Software Foundation, Inc. +## +## This file is part of GNU M4. +## +## GNU M4 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 M4 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 this program. If not, see <http://www.gnu.org/licenses/>. +## +## Written by Gary V. Vaughan <[email protected]> + +info_TEXINFOS = m4.texi +m4_TEXINFOS = regexprops-generic.texi fdl-1.3.texi gpl-3.0.texi +dist_man_MANS = m4.1 +EXTRA_DIST = gendocs_template +MAINTAINERCLEANFILES = gendocs_template +HELP2MAN = $(SHELL) $(top_srcdir)/$(config_aux_dir)/missing --run help2man + +# Build the man page once in the srcdir, rather than in every VPATH build +# dir, to match how automake builds info pages. This is safe for 'make +# distcheck' since it is distributed pre-built. +m4.1: $(top_srcdir)/.version $(top_srcdir)/src/main.c + @echo "Updating the \`man' page \`$@'"; \ + $(HELP2MAN) --name="macro processor" --source=FSF \ + --info-page=m4 --output=$@ $(top_srcdir)/src/m4$(EXEEXT) diff --git a/po/Makevars b/po/Makevars index 118868e..6f3cd63 100644 --- a/po/Makevars +++ b/po/Makevars @@ -9,9 +9,9 @@ top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ \ ---flag=_:1:pass-c-format \ ---flag=N_:1:pass-c-format \ -$${end_of_xgettext_options+} + --flag=_:1:pass-c-format \ + --flag=N_:1:pass-c-format \ + $${end_of_xgettext_options+} # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding -- 1.9.3
>From 60af89a04825c502ac374b3cf3c077e6427451c8 Mon Sep 17 00:00:00 2001 From: Pavel Raiskup <[email protected]> Date: Wed, 28 May 2014 12:25:52 +0200 Subject: [PATCH 2/2] modules,inclusions: fix path searching issues When 'm4' directory occurred in M4PATH or current directory, the m4 processor ended up with message 'Is a directory' and did not continue to search for 'm4.so' somewhere else in path. Expanding 'include(Makefile)' for example failed when M4PATH was set because the current directory was not searched. * m4/path.c (try_prefixes): New function. (m4_path_search): Deduplicate suffix trying by try_prefixes. (m4__include_init): Always prepend current directory. * tests/testsuite.at (AT_CHECK_M4): Filter out test output dependant on user's setup. * tests/options.at: Adjust expected stderr output. * doc/m4.texi: likewise. --- doc/m4.texi | 2 + m4/path.c | 111 +++++++++++++++++++++++++++-------------------------- tests/options.at | 6 ++- tests/testsuite.at | 1 + 4 files changed, 64 insertions(+), 56 deletions(-) diff --git a/doc/m4.texi b/doc/m4.texi index 8d40cae..95eb083 100644 --- a/doc/m4.texi +++ b/doc/m4.texi @@ -4682,6 +4682,8 @@ @comment options: -dip @example $ @kbd{m4 -dip -I doc/examples} +@error{}m4debug: path search for 'm4' found 'm4.so' +@error{}m4debug: path search for 'gnu' found 'gnu.so' @error{}m4debug: input read from 'stdin' define(`foo', `m4wrap(`wrapped text ')dnl') diff --git a/m4/path.c b/m4/path.c index 3a93289..66e460b 100644 --- a/m4/path.c +++ b/m4/path.c @@ -143,6 +143,53 @@ m4_add_include_directory (m4 *context, const char *dir, bool prepend) #endif } +/* FILENAME must contain directory path also */ +static char * +try_prefixes (m4 *context, const char *dirname, const char *filename, + size_t max_suffix_len, const char **suffixes) +{ + int e = 0, i; + char *filepath = dirname ? file_name_concat (dirname, filename, NULL) + : strdup (filename); + size_t mem = strlen (filepath); + filepath = xrealloc (filepath, mem + max_suffix_len + 1); + + /* Try appending each of the suffixes we were given. */ +#ifdef DEBUG_INCL + xfprintf (stderr, "path_search (%s) -- trying %s\n", filename, filepath); +#endif + + + /* If search fails, we'll use the error we got from the first try + access (usually with no suffix). */ + for (i = 0; suffixes && suffixes[i]; !i && (e = errno), ++i) + { + struct stat st; + int rc; + strcpy (filepath + mem, suffixes[i]); + + if (stat (filepath, &st)) + continue; + + if (S_ISREG (st.st_mode)) + { + m4_debug_message (context, M4_DEBUG_TRACE_PATH, + _("path search for %s found %s"), + quotearg_style (locale_quoting_style, filename), + quotearg_n_style (1, locale_quoting_style, + filepath)); + return filepath; + } + if (S_ISDIR (st.st_mode)) + errno = EISDIR; + } + free (filepath); + + /* No such file. */ + errno = e; + return NULL; +} + /* Search for FILENAME according to -B options, `.', -I options, then M4PATH environment. If successful, return the open file, and if @@ -181,61 +228,18 @@ m4_path_search (m4 *context, const char *filename, const char **suffixes) /* If file is absolute, or if we are not searching a path, a single lookup will do the trick. */ if (IS_ABSOLUTE_FILE_NAME (filename)) - { - size_t mem = strlen (filename); - - /* Try appending each of the suffixes we were given. */ - filepath = strncpy (xmalloc (mem + max_suffix_len +1), filename, mem); - for (i = 0; suffixes && suffixes[i]; ++i) - { - strcpy (filepath + mem, suffixes[i]); - if (access (filepath, R_OK) == 0) - return filepath; - - /* If search fails, we'll use the error we got from the first - access (usually with no suffix). */ - if (i == 0) - e = errno; - } - free (filepath); - - /* No such file. */ - errno = e; - return NULL; - } + return try_prefixes (context, NULL, filename, max_suffix_len, suffixes); - for (incl = m4__get_search_path (context)->list; - incl != NULL; incl = incl->next) + for (incl = m4__get_search_path (context)->list, i = 0; + incl != NULL; incl = incl->next, ++i) { - char *pathname = file_name_concat (incl->dir, filename, NULL); - size_t mem = strlen (pathname); - -#ifdef DEBUG_INCL - xfprintf (stderr, "path_search (%s) -- trying %s\n", filename, pathname); -#endif - - if (access (pathname, R_OK) == 0) - { - m4_debug_message (context, M4_DEBUG_TRACE_PATH, - _("path search for %s found %s"), - quotearg_style (locale_quoting_style, filename), - quotearg_n_style (1, locale_quoting_style, pathname)); - return pathname; - } - else if (!incl->len) - /* Capture errno only when searching `.'. */ - e = errno; - - filepath = strncpy (xmalloc (mem + max_suffix_len +1), pathname, mem); - free (pathname); + char *pathname = try_prefixes (context, incl->dir, filename, + max_suffix_len, suffixes); + if (pathname) + return pathname; - for (i = 0; suffixes && suffixes[i]; ++i) - { - strcpy (filepath + mem, suffixes[i]); - if (access (filepath, R_OK) == 0) - return filepath; - } - free (filepath); + if (i == 0) + e = errno; } errno = e; @@ -336,8 +340,7 @@ m4__include_init (m4 *context) /* If M4PATH was not set, then search just the current directory by default. */ assert (info); - if (info->list_end == NULL) - search_path_add (info, "", false); + search_path_add (info, "", true); /* Non-core modules installation directory. */ search_path_add (info, PKGLIBDIR, false); diff --git a/tests/options.at b/tests/options.at index 8503f8f..574ed3f 100644 --- a/tests/options.at +++ b/tests/options.at @@ -422,10 +422,12 @@ m4debug: input from m4wrap exhausted dnl Test all flags. AT_CHECK_M4([-dV in], [0], [[3 0 -]], [[m4debug: module m4: opening file +]], [[m4debug: path search for 'm4' found 'm4.so' +m4debug: module m4: opening file m4debug: module m4: init hook called m4debug: module m4: opened m4debug: module m4: builtins loaded +m4debug: path search for 'gnu' found 'gnu.so' m4debug: module gnu: opening file m4debug: module gnu: init hook called m4debug: module gnu: opened @@ -700,7 +702,7 @@ AT_CHECK_M4([-I post -B pre in], [1], [[in pre/foo in ./bar in post/blah -]], [[m4:in:3: include: cannot open file 'bad': No such file or directory +]], [[m4:in:3: include: cannot open file 'bad': Too many levels of symbolic links ]]) AT_CLEANUP diff --git a/tests/testsuite.at b/tests/testsuite.at index 26d8346..66bb70b 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -88,6 +88,7 @@ m4_case([$4], [], [], [ignore], [], /^m4debug: module/s/opening file.*/opening file/ s/\(cannot open module [^:]*\):.*/\1/ s/Bad file number/Bad file descriptor/ + s|search for \([^ ]*\) found '\''.*\/\([^\.]*\.so\)|search for \1 found '\''\2| s/^m4:.* option .*/m4: bad option/ ' stderr >&2]], [0], [], [$4])]) ]) -- 1.9.3
testsuite.log.xz
Description: application/xz
_______________________________________________ M4-patches mailing list [email protected] https://lists.gnu.org/mailman/listinfo/m4-patches
