ping
> 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])