| # | |
| # Minimal autoconf support for the D language. | |
| # Adapted from the Go language support files. | |
| # | |
| # ------------------- # | |
| # Language selection. | |
| # ------------------- # | |
| # AC_LANG(D) | |
| # ----------- | |
| AC_LANG_DEFINE([D], [d], [GDC], [GDC], [], | |
| [ac_ext=d | |
| ac_compile='$GDC -c $GDCFLAGS conftest.$ac_ext >&AS_MESSAGE_LOG_FD' | |
| ac_link='$GDC -o conftest$ac_exeext $GDCFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&AS_MESSAGE_LOG_FD' | |
| ac_compiler_gnu=yes | |
| ]) | |
| # AC_LANG_D | |
| # ---------- | |
| AU_DEFUN([AC_LANG_D], [AC_LANG(D)]) | |
| # ------------------- # | |
| # Producing programs. | |
| # ------------------- # | |
| # AC_LANG_PROGRAM(D)([PROLOGUE], [BODY]) | |
| # --------------------------------------- | |
| m4_define([AC_LANG_PROGRAM(D)], | |
| [module object; | |
| $1 | |
| extern(C) int main() { | |
| $2 | |
| }]) | |
| # _AC_LANG_IO_PROGRAM(D) | |
| # ----------------------- | |
| # Produce source that performs I/O. | |
| m4_define([_AC_LANG_IO_PROGRAM(D)], | |
| [AC_LANG_PROGRAM([import core.stdc.stdio;], | |
| [FILE *f = fopen ("conftest.out", "w"); | |
| return ferror (f) || fclose (f) != 0; | |
| ])]) | |
| # AC_LANG_CALL(D)(PROLOGUE, FUNCTION) | |
| # ------------------------------------ | |
| # TODO: Avoid conflicting decl of main? | |
| # Used by AC_SEARCH_LIBS. | |
| m4_define([AC_LANG_CALL(D)], | |
| [AC_LANG_PROGRAM([$1 extern(C) int $2();], [$2(); return 0;])]) | |
| # AC_LANG_FUNC_LINK_TRY(D)(FUNCTION) | |
| # ----------------------------------- | |
| # Try to link a program which calls FUNCTION. | |
| # This only works for extern(C) functions. | |
| m4_define([AC_LANG_FUNC_LINK_TRY(D)], | |
| [AC_LANG_PROGRAM([extern(C) int $1();], [return $1();])]) | |
| # AC_LANG_BOOL_COMPILE_TRY(D)(PROLOGUE, EXPRESSION) | |
| # -------------------------------------------------- | |
| # Return a program which is valid if EXPRESSION is nonzero. | |
| # Probably not that useful for D, we can extract any information | |
| # we need using CTFE. | |
| m4_define([AC_LANG_BOOL_COMPILE_TRY(D)], | |
| [AC_LANG_PROGRAM([$1], | |
| [static assert($2); return 0;])]) | |
| # AC_LANG_INT_SAVE(D)(PROLOGUE, EXPRESSION) | |
| # ------------------------------------------ | |
| m4_define([AC_LANG_INT_SAVE(D)], | |
| [AC_LANG_PROGRAM([$1 | |
| import core.stdc.stdio, core.stdc.stdlib; | |
| ], | |
| [ | |
| FILE *f = fopen ("conftest.val", "w"); | |
| if (! f) | |
| return 1; | |
| if (($2) < 0) | |
| { | |
| fprintf (f, "%ld", $2); | |
| } | |
| else | |
| { | |
| fprintf (f, "%lu", $2); | |
| } | |
| /* Do not output a trailing newline, as this causes \r\n confusion | |
| on some platforms. */ | |
| return ferror (f) || fclose (f) != 0; | |
| ])]) | |
| # ---------------------- # | |
| # Looking for compilers. # | |
| # ---------------------- # | |
| # AC_LANG_COMPILER(D) | |
| # -------------------- | |
| AC_DEFUN([AC_LANG_COMPILER(D)], | |
| [AC_REQUIRE([AC_PROG_GDC])]) | |
| # AC_PROG_GDC | |
| # ---------- | |
| AN_MAKEVAR([GDC], [AC_PROG_GDC]) | |
| AN_PROGRAM([gdc], [AC_PROG_GDC]) | |
| AC_DEFUN([AC_PROG_GDC], | |
| [AC_LANG_PUSH(D)dnl | |
| AC_ARG_VAR([GDC], [D compiler command])dnl | |
| AC_ARG_VAR([GDCFLAGS], [D compiler flags])dnl | |
| _AC_ARG_VAR_LDFLAGS()dnl | |
| m4_ifval([$1], | |
| [AC_CHECK_TOOLS(GDC, [$1])], | |
| [AC_CHECK_TOOL(GDC, gdc) | |
| if test -z "$GDC"; then | |
| if test -n "$ac_tool_prefix"; then | |
| AC_CHECK_PROG(GDC, [${ac_tool_prefix}gdc], [$ac_tool_prefix}gdc]) | |
| fi | |
| fi | |
| if test -z "$GDC"; then | |
| AC_CHECK_PROG(GDC, gdc, gdc, , , 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 | |
| AC_LANG_POP(D)dnl | |
| ])# AC_PROG_D | |