[Changes from V4: - A68C and A68CFLAGS renamed back to A68 and A68FLAGS as per discussion in: https://lists.gnu.org/archive/html/autoconf-patches/2025-05/msg00013.html Changes from V3: - Rename A68FLAGS to A68CFLAGS as mandated by the GCS. Automake support has been updated accordingly upstream. Changes from V2: - Call the language 'Algol 68', not 'A68'. - Rename A68 shell variable to A68C. - Rename macro AC_PROG_A68 to AC_PROG_A68C. - Clarify where to get ga68 in the manual. - Adapt to latest language changes. Changes 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]. The front-end is temporarily hosted in the sourceware forge until integration in GCC is completed [3]. Note that the GCC Algol 68 front-end is not yet integrated in the main compiler, so it is developed and distributed off-tree. See https://gcc.gnu.org/wiki/Algol68FrontEnd. Additional information about the Algol 68 programming language, and how it is being evolved by the GNU Algol 68 Working Group can be found at https://algol68-lang.org. 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/gcc/gcc-a68 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. * tests/local.at (_AT_CHECK_ENV): Add A68 and A68FLAGS. * NEWS: Update. --- NEWS | 3 + doc/autoconf.texi | 52 ++++++++++++- lib/autoconf/a68.m4 | 153 +++++++++++++++++++++++++++++++++++++++ lib/autoconf/autoconf.m4 | 1 + lib/freeze.mk | 1 + lib/local.mk | 1 + tests/a68.at | 33 +++++++++ tests/local.at | 2 +- tests/local.mk | 3 + tests/suite.at | 2 + 10 files changed, 247 insertions(+), 4 deletions(-) create mode 100644 lib/autoconf/a68.m4 create mode 100644 tests/a68.at diff --git a/NEWS b/NEWS index 1e4e513e..b0d26beb 100644 --- a/NEWS +++ b/NEWS @@ -28,6 +28,9 @@ GNU Autoconf NEWS - User visible changes. The autom4te, autoscan and ifnames programs now recognize the two preprocessor directives, which were introduced in C23 and C++23. +*** Support for the Algol 68 programming language has been added. + The new macro AC_LANG_A68 sets variables A68 and A68FLAGS. + *** AC_PROG_AWK now also checks for busybox awk. *** AC_USE_SYSTEM_EXTENSIONS now defines _COSMO_SOURCE for Cosmopolitan Libc. diff --git a/doc/autoconf.texi b/doc/autoconf.texi index 12734446..00aeaaf5 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 @@ -2742,7 +2743,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. +features in C, C++, Objective C, Objective C++, Fortran, Go, and Algol 68. This variable's contents should contain options like @option{-s} and @option{-L} that affect only the behavior of the linker. Please see the @@ -2785,6 +2786,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 Algol 68 instead of C. +@end defvar + @defvar builddir @ovindex builddir Rigorously equal to @samp{.}. Added for symmetry only. @@ -7094,6 +7102,7 @@ compiling. * Erlang Compiler and Interpreter:: Likewise * Fortran Compiler:: Likewise * Go Compiler:: Likewise +* Algol 68 Compiler:: Likewise @end menu @node Specific Compiler Characteristics @@ -8635,6 +8644,38 @@ 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. + +Note that the GCC Algol 68 front-end is not yet integrated in the main +compiler, so it is developed and distributed off-tree. See +@url{https://gcc.gnu.org/wiki/Algol68FrontEnd}. Additional information +about the Algol 68 programming language, and how it is being evolved by +the GNU Algol 68 Working Group can be found at +@url{https://algol68-lang.org}. + +@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 @@ -9185,6 +9226,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 @@ -9432,7 +9477,8 @@ 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} +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. @@ -9557,7 +9603,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..12d366c9 --- /dev/null +++ b/lib/autoconf/a68.m4 @@ -0,0 +1,153 @@ +# This file is part of Autoconf. -*- Autoconf -*- +# Algol 68 language support. +# Copyright 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(Algol 68) +# ----------------- +AC_LANG_DEFINE([Algol 68], [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(Algol 68)]) + +# ------------------- # +# Producing programs. +# ------------------- # + +# AC_LANG_PROGRAM(Algol 68)([PROLOGUE], [BODY]) +# --------------------------------------------- +m4_define([AC_LANG_PROGRAM(Algol 68)], +[$1 +begin $2 m4_ifnblank([$2],[;]) + skip +end]) + +# _AC_LANG_IO_PROGRAM(Algol 68) +# ----------------------------- +# Produce source that performs I/O. +m4_define([_AC_LANG_IO_PROGRAM(Algol 68)], +[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(Algol 68)(PROLOGUE, FUNCTION) +# ------------------------------------------ +# Avoid conflicting decl of main. +m4_define([AC_LANG_CALL(Algol 68)], +[AC_LANG_PROGRAM([],[])]) + +# AC_LANG_FUNC_LINK_TRY(Algol 68)(FUNCTION) +# ----------------------------------------- +# Try to link a program which calls FUNCTION. +m4_define([AC_LANG_FUNC_LINK_TRY(Algol 68)], +[AC_LANG_PROGRAM([],[])]) + +# AC_LANG_BOOL_COMPILE_TRY(Algol 68)(PROLOGUE, EXPRESSION) +# -------------------------------------------------------- +# Return a program which is valid if EXPRESSION is nonzero. +m4_define([AC_LANG_BOOL_COMPILE_TRY(Algol 68)], +[AC_LANG_PROGRAM([], [@<:@$2@:>@INT test multiple; + 0])]) + +# AC_LANG_INT_SAVE(Algol 68)(PROLOGUE, EXPRESSION) +# ------------------------------------------------ +m4_define([AC_LANG_INT_SAVE(Algol 68)], +[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)/ +(fd = -1 | ret := 1; stop); +(fputs (fd, itoa ($2)) = 0 | ret := 1; stop) +])]) + +# ---------------------- # +# Looking for compilers. # +# ---------------------- # + +# AC_LANG_COMPILER(Algol 68) +# -------------------------- +AC_DEFUN([AC_LANG_COMPILER(Algol 68)], +[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(Algol 68)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(Algol 68)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..9535306f 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..e9ac00fc --- /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([Algol 68], +[[AC_LANG(Algol 68) +AC_LANG_COMPILER +]]) diff --git a/tests/local.at b/tests/local.at index 6bf31ab3..05cfdb39 100644 --- a/tests/local.at +++ b/tests/local.at @@ -581,7 +581,7 @@ if test -f state-env.before && test -f state-env.after; then ($EGREP -v '^(m4_join([|], [a[cs]_.*], [(exec_)?prefix|DEFS|CONFIG_STATUS], - [CC|CFLAGS|CPPFLAGS|CPP|GCC|CXX|CXXFLAGS|CXXCPP|GXX|F77|FFLAGS|FLIBS|G77], + [A68|A68FLAGS|CC|CFLAGS|CPPFLAGS|CPP|GCC|CXX|CXXFLAGS|CXXCPP|GXX|F77|FFLAGS|FLIBS|G77], [ERL|ERLC|ERLCFLAGS|ERLANG_PATH_ERL|ERLANG_ROOT_DIR|ERLANG_LIB_DIR], [ERLANG_LIB_DIR_.*|ERLANG_LIB_VER_.*|ERLANG_INSTALL_LIB_DIR], [ERLANG_INSTALL_LIB_DIR_.*|ERLANG_ERTS_VER|OBJC|OBJCPP|OBJCFLAGS], 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]) -- 2.30.2