ping
> [Differences from V1: > - Variables GA68* renamed to A68*.] > > This patch adds support for the Algol 68 programming language to > Autoconf. It is based on the Algol 68 GCC front-end, which is currently > under development [1]. A WIP series got sent to gcc-patches in January > [2], and the front-end is temporarily hosted in the sourceware forge > until integration in GCC is completed [3]. > > The full language is (almost) already implemented, the compiler is > useful and I plan to send official patches for inclusion in GCC 16 very > soon. > > Automake support for Algol 68 has been already pushed as of 2 February > 2025. > > [1] https://gcc.gnu.org/wiki/Algol68FrontEnd > [2] > https://inbox.sourceware.org/gcc-patches/20250101020952.18404-1-jose.march...@oracle.com/T/#t > > [3] https://forge.sourceforge.org/jemarch/a68-gcc > > Add support for the Algol68 programming language. > > * lib/autoconf/a68.m4: New file. > * lib/autoconf/autoconf.m4: Include autoconf/a68.m4. > * lib/autoconf/Makefile.am (dist_autoconflib_DATA): Add a68.m4. > * lib/freeze.mk (autoconf_m4f_dependencies): Add > $(src_libdir)/autoconf/a68.m4. > * doc/autoconf.texi: Rebuild menus. > (Preset Output Variables): Mention Algol 68. Document A68FLAGS. > (Algol 68 Compiler): New subsection. > (Language Choice): Mention Algol 68. > (Generating Sources): Likewise. > (Running the Preprocessor): Likewise. > * tests/a68.at: New file. > * tests/suite.at: Include a68.at and aca68.at. > * tests/local.at (_AT_CHECK_ENV): Add A68 and A68FLAGS. > * tests/Makefile.am (TESTSUITE_GENERATED_AT): Add > $(srcdir)/aca68.at. > (TESTSUITE_HAND_AT): Add a68.at. > (AUTOCONF_FILES): Add $(autoconfdir)/a68.m4. > * NEWS: Update. > > diff --git a/NEWS b/NEWS > index b859fff6..e601b781 100644 > --- a/NEWS > +++ b/NEWS > @@ -2,6 +2,9 @@ GNU Autoconf NEWS - User visible changes. > > * Noteworthy changes in release ?.? (????-??-??) [?] > > +** Support for the Algol 68 programming language has been added. The new > macro > + AC_LANG_A68 sets variables A68 and A68FLAGS. > + > ** Backward incompatibilities > > *** AC_PROG_CC now prefers C23 if available. > diff --git a/doc/autoconf.texi b/doc/autoconf.texi > index 8dffd02c..33df1708 100644 > --- a/doc/autoconf.texi > +++ b/doc/autoconf.texi > @@ -416,6 +416,7 @@ Compilers and Preprocessors > * Erlang Compiler and Interpreter:: Likewise > * Fortran Compiler:: Likewise > * Go Compiler:: Likewise > +* Algol 68 Compiler:: Likewise > > Writing Tests > > @@ -2741,7 +2742,7 @@ programs to test for Fortran 77 features. > Options for the linker. If it is not set > in the environment when @command{configure} runs, the default value is empty. > @command{configure} uses this variable when linking programs to test for > -C, C++, Objective C, Objective C++, Fortran, and Go features. > +C, C++, Objective C, Objective C++, Fortran, Go and Algol 68 features. > > This variable's contents should contain options like @option{-s} and > @option{-L} that affect only the behavior of the linker. Please see the > @@ -2784,6 +2785,13 @@ Debugging and optimization options for the Go > compiler. It acts like > @code{CFLAGS}, but for Go instead of C. > @end defvar > > +@defvar A68FLAGS > +@evindex A68FLAGS > +@ovindex A68FLAGS > +Debugging and optimization options for the Algol 68 compiler. It acts > +like @code{CFLAGS}, but for Algol68 instead of C. > +@end defvar > + > @defvar builddir > @ovindex builddir > Rigorously equal to @samp{.}. Added for symmetry only. > @@ -7088,6 +7096,7 @@ compiling. > * Erlang Compiler and Interpreter:: Likewise > * Fortran Compiler:: Likewise > * Go Compiler:: Likewise > +* Algol 68 Compiler:: Likewise > @end menu > > @node Specific Compiler Characteristics > @@ -8629,6 +8638,31 @@ If output variable @code{GOFLAGS} was not already set, > set it to > @end defmac > > > +@node Algol 68 Compiler > +@subsection Algol 68 Compiler > +@cindex Algol 68 > + > +Autoconf provides basic support for the Algol 68 programming language > +when using the @code{ga68} compiler. > + > +@defmac AC_PROG_A68 (@ovar{compiler-search-list}) > +Find the Algol 68 compiler to use. Check whether the environment > +variable @code{A68} is set; if so, then set output variable @code{A68} > +to its value. > + > +Otherwise, if the macro is invoked without an argument, then search for > +an Algol 68 compiler named @code{ga68}. If it is not found, then as a > +last resort set @code{A68} to @code{ga68}. > + > +This macro may be invoked with an optional first argument which, if > +specified, must be a blank-separated list of Algol 68 compilers to > +search for. > + > +If output variable @code{A68FLAGS} was not already set, set it to > +@option{-g -O2}. If your package does not like this default, > +@code{A68FLAGS} may be set before @code{AC_PROG_A68}l > +@end defmac > + > @node System Services > @section System Services > > @@ -9179,6 +9213,10 @@ extension @file{.mm} for test programs. Use > compilation flags: > @item Go > Do compilation tests using @code{GOC} and use extension @file{.go} for > test programs. Use compilation flags @code{GOFLAGS}. > + > +@item Algol 68 > +Do compilation tests using @code{A68} and use extension @file{.a68} for > +test programs. Use compilation flags @code{A68FLAGS}. > @end table > @end defmac > > @@ -9426,9 +9464,9 @@ on a system with @command{gcc} installed, results in: > const char hw[] = "Hello, World\n"; > @end example > > -When the test language is Fortran, Erlang, or Go, the @code{AC_DEFINE} > -definitions are not automatically translated into constants in the > -source code by this macro. > +When the test language is Fortran, Erlang, Go or Algol 68, the > +@code{AC_DEFINE} definitions are not automatically translated into > +constants in the source code by this macro. > > @defmac AC_LANG_PROGRAM (@var{prologue}, @var{body}) > @acindex{LANG_PROGRAM} > @@ -9551,7 +9589,7 @@ Nevertheless, if you need to run the preprocessor, then > use > @code{AC_PREPROC_IFELSE}. > > The macros described in this section cannot be used for tests in Erlang, > -Fortran, or Go, since those languages require no preprocessor. > +Fortran, Go, or Algol 68 since those languages require no preprocessor. > > @anchor{AC_PREPROC_IFELSE} > @defmac AC_PREPROC_IFELSE (@var{input}, @ovar{action-if-true}, @ > diff --git a/lib/autoconf/a68.m4 b/lib/autoconf/a68.m4 > new file mode 100644 > index 00000000..30d8362e > --- /dev/null > +++ b/lib/autoconf/a68.m4 > @@ -0,0 +1,155 @@ > +# This file is part of Autoconf. -*- Autoconf -*- > +# Algol 68 language support. > +# Copyright (C) 2025 Free Software Foundation, Inc. > + > +# This file is part of Autoconf. This program 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. > +# > +# This program 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. > +# > +# Under Section 7 of GPL version 3, you are granted additional > +# permissions described in the Autoconf Configure Script Exception, > +# version 3.0, as published by the Free Software Foundation. > +# > +# You should have received a copy of the GNU General Public License > +# and a copy of the Autoconf Configure Script Exception along with > +# this program; see the files COPYINGv3 and COPYING.EXCEPTION > +# respectively. If not, see <https://www.gnu.org/licenses/> and > +# > <https://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=blob_plain;f=COPYING.EXCEPTION>. > + > +# Algol 68 support contributed by Jose E. Marchesi. > + > +# ------------------- # > +# Language selection. > +# ------------------- # > + > +# AC_LANG(a68) > +# ----------- > +AC_LANG_DEFINE([A68], [a68], [A68], [A68], [], > +[ac_ext=a68 > +ac_compile='$A68 -c $A68FLAGS conftest.$ac_ext >&AS_MESSAGE_LOG_FD' > +ac_link='$A68 -o conftest$ac_exeext $A68FLAGS $LDFLAGS conftest.$ac_ext > $LIBS >&AS_MESSAGE_LOG_FD' > +ac_compiler_gnu=yes > +]) > + > +# AC_LANG_A68 > +# ----------- > +AU_DEFUN([AC_LANG_A68], [AC_LANG(A68)]) > + > +# ------------------- # > +# Producing programs. > +# ------------------- # > + > +# AC_LANG_PROGRAM(A68)([PROLOGUE], [BODY]) > +# ---------------------------------------- > +m4_define([AC_LANG_PROGRAM(A68)], > +[PROGRAM > +$1 > +BEGIN > +$2 > + 0 > +END]) > + > +# _AC_LANG_IO_PROGRAM(A68) > +# ------------------------ > +# Produce source that performs I/O. > +m4_define([_AC_LANG_IO_PROGRAM(A68)], > +[AC_LANG_PROGRAM([], > +[IF INT fd = fcreate ("conftest.out", 8r0777); fd = -1 > + THEN perror ("error creating conftest.out") > + ELIF fclose (fd) = -1 THEN perror ("error closing conftest.out"); > + FI; > +])]) > + > +# AC_LANG_CALL(A68)(PROLOGUE, FUNCTION) > +# ------------------------------------- > +# Avoid conflicting decl of main. > +m4_define([AC_LANG_CALL(A68)], > +[AC_LANG_PROGRAM([],[])]) > + > +# AC_LANG_FUNC_LINK_TRY(A68)(FUNCTION) > +# ------------------------------------ > +# Try to link a program which calls FUNCTION. > +m4_define([AC_LANG_FUNC_LINK_TRY(A68)], > +[AC_LANG_PROGRAM([],[])]) > + > +# AC_LANG_BOOL_COMPILE_TRY(A68)(PROLOGUE, EXPRESSION) > +# --------------------------------------------------- > +# Return a program which is valid if EXPRESSION is nonzero. > +m4_define([AC_LANG_BOOL_COMPILE_TRY(A68)], > +[AC_LANG_PROGRAM([], [@<:@$2@:>@INT test multiple; > + 0])]) > + > +# AC_LANG_INT_SAVE(A68)(PROLOGUE, EXPRESSION) > +# ------------------------------------------ > +m4_define([AC_LANG_INT_SAVE(A68)], > +[AC_LANG_PROGRAM([ > +PROC itoa = (INT i) STRING: > + BEGIN IF i = 0 > + THEN "0" > + ELSE INT n := ABS i; > + STRING res; > + WHILE n /= 0 > + DO INT rem = n %* 10; > + res := REPR (rem > 9 | (rem - 10) + ABS "a" | rem + ABS > "0") + res; > + n %:= 10 > + OD; > + (i < 0 | "-" + res | res) > + FI > + END; > + > +INT ret := 0; > +INT fd = fopen ("conftest.val", file o wronly)/ > +IF fd = -1 THEN ret := 1; stop FI; > +IF fputs (fd, itoa ($2)) = 0 THEN ret := 1; stop FI; > +stop: > +; > +])]) > + > +# ---------------------- # > +# Looking for compilers. # > +# ---------------------- # > + > +# AC_LANG_COMPILER(A68) > +# --------------------- > +AC_DEFUN([AC_LANG_COMPILER(A68)], > +[AC_REQUIRE([AC_PROG_A68])]) > + > +# AC_PROG_A68 > +# ----------- > +AN_MAKEVAR([A68], [AC_PROG_A68]) > +AN_PROGRAM([ga68], [AC_PROG_A68]) > +AC_DEFUN([AC_PROG_A68], > +[AC_LANG_PUSH(A68)dnl > +AC_ARG_VAR([A68], [Algol 68 compiler command])dnl > +AC_ARG_VAR([A68FLAGS], [Algol 68 compiler flags])dnl > +_AC_ARG_VAR_LDFLAGS()dnl > +m4_ifval([$1], > + [AC_CHECK_TOOLS(A68, [$1])], > +[AC_CHECK_TOOL(A68, ga68) > +if test -z "$A68"; then > + if test -n "$ac_tool_prefix"; then > + AC_CHECK_PROG(A68, [${ac_tool_prefix}ga68], [$ac_tool_prefix}ga68]) > + fi > +fi > +if test -z "$A68"; then > + AC_CHECK_PROG(A68, ga68, ga68, , , false) > +fi > +]) > + > +# Provide some information about the compiler. > +_AS_ECHO_LOG([checking for _AC_LANG compiler version]) > +set X $ac_compile > +ac_compiler=$[2] > +_AC_DO_LIMIT([$ac_compiler --version >&AS_MESSAGE_LOG_FD]) > +m4_expand_once([_AC_COMPILER_EXEEXT])[]dnl > +m4_expand_once([_AC_COMPILER_OBJEXT])[]dnl > +A68FLAGS="-g -O2" > +AC_LANG_POP(A68)dnl > +])# AC_PROG_A68 > diff --git a/lib/autoconf/autoconf.m4 b/lib/autoconf/autoconf.m4 > index c2b6aea3..d79888e9 100644 > --- a/lib/autoconf/autoconf.m4 > +++ b/lib/autoconf/autoconf.m4 > @@ -44,6 +44,7 @@ m4_include([autoconf/c.m4]) > m4_include([autoconf/erlang.m4]) > m4_include([autoconf/fortran.m4]) > m4_include([autoconf/go.m4]) > +m4_include([autoconf/a68.m4]) > m4_include([autoconf/functions.m4]) > m4_include([autoconf/headers.m4]) > m4_include([autoconf/types.m4]) > diff --git a/lib/freeze.mk b/lib/freeze.mk > index 8239080e..e65c128a 100644 > --- a/lib/freeze.mk > +++ b/lib/freeze.mk > @@ -89,6 +89,7 @@ autoconf_m4f_dependencies = \ > $(src_libdir)/autoconf/fortran.m4 \ > $(src_libdir)/autoconf/erlang.m4 \ > $(src_libdir)/autoconf/go.m4 \ > + $(src_libdir)/autoconf/a68.m4 \ > $(src_libdir)/autoconf/functions.m4 \ > $(src_libdir)/autoconf/headers.m4 \ > $(src_libdir)/autoconf/types.m4 \ > diff --git a/lib/local.mk b/lib/local.mk > index 98a7f36a..62440dd0 100644 > --- a/lib/local.mk > +++ b/lib/local.mk > @@ -95,6 +95,7 @@ dist_autoconflib_DATA = \ > lib/autoconf/fortran.m4 \ > lib/autoconf/functions.m4 \ > lib/autoconf/go.m4 \ > + lib/autoconf/a68.m4 \ > lib/autoconf/headers.m4 \ > lib/autoconf/types.m4 \ > lib/autoconf/libs.m4 \ > diff --git a/tests/a68.at b/tests/a68.at > new file mode 100644 > index 00000000..b99b50d2 > --- /dev/null > +++ b/tests/a68.at > @@ -0,0 +1,33 @@ > +# -*- Autotest -*- > + > +AT_BANNER([Algol 68 low level compiling and utility macros.]) > + > +# Copyright (C) 2025 Free Software Foundation, Inc. > +# > +# This program 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. > +# > +# This program 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 <https://www.gnu.org/licenses/>. > + > + > +# Since the macros which compile are required by most tests, check > +# them first. But remember that looking for a compiler is even more > +# primitive, so check those first. > + > + > +## ------------------- ## > +## Algol 68 Compiler. ## > +## ------------------- ## > + > +AT_CHECK_MACRO([A68], > +[[AC_LANG(A68) > +AC_LANG_COMPILER > +]]) > diff --git a/tests/local.mk b/tests/local.mk > index 6a2c06a8..77808f7d 100644 > --- a/tests/local.mk > +++ b/tests/local.mk > @@ -92,6 +92,7 @@ TESTSUITE_GENERATED_AT = \ > tests/acerlang.at \ > tests/acfortran.at \ > tests/acgo.at \ > + tests/aca68.at \ > tests/acgeneral.at \ > tests/acstatus.at \ > tests/acautoheader.at \ > @@ -116,6 +117,7 @@ TESTSUITE_HAND_AT = \ > tests/erlang.at \ > tests/fortran.at \ > tests/go.at \ > + tests/a68.at \ > tests/semantics.at \ > tests/autoscan.at \ > tests/foreign.at > @@ -198,6 +200,7 @@ AUTOCONF_FILES = $(autoconfdir)/general.m4 \ > $(autoconfdir)/erlang.m4 \ > $(autoconfdir)/fortran.m4 \ > $(autoconfdir)/go.m4 \ > + $(autoconfdir)/a68.m4 \ > $(autoconfdir)/headers.m4 \ > $(autoconfdir)/libs.m4 \ > $(autoconfdir)/types.m4 \ > diff --git a/tests/suite.at b/tests/suite.at > index 17fca508..1600bf32 100644 > --- a/tests/suite.at > +++ b/tests/suite.at > @@ -55,6 +55,8 @@ m4_include([erlang.at]) > m4_include([acerlang.at]) > m4_include([go.at]) > m4_include([acgo.at]) > +m4_include([a68.at]) > +m4_include([aca68.at]) > > # Checking that AC_CHECK_FOO macros work properly. > m4_include([semantics.at])