From 42807fa75746d991d0d4cae907c86cf52f973044 Mon Sep 17 00:00:00 2001 From: Louie Shprung Date: Sun, 1 Jan 2023 16:50:24 -0800 Subject: Working Windows builds under MinGW --- aclocal.m4 | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ config.h.in | 6 ++++ configure | 52 ++++++++++++++++++++++++++++++- configure.ac | 5 ++- src/body.c | 2 ++ src/draw.c | 7 +++++ 6 files changed, 170 insertions(+), 2 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index f05b441..d0d5c05 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -20,6 +20,106 @@ You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_func_mkdir.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_FUNC_MKDIR +# +# DESCRIPTION +# +# Check whether mkdir() is mkdir or _mkdir, and whether it takes one or +# two arguments. +# +# This macro can define HAVE_MKDIR, HAVE__MKDIR, and MKDIR_TAKES_ONE_ARG, +# which are expected to be used as follows: +# +# #if HAVE_MKDIR +# # if MKDIR_TAKES_ONE_ARG +# /* MinGW32 */ +# # define mkdir(a, b) mkdir(a) +# # endif +# #else +# # if HAVE__MKDIR +# /* plain Windows 32 */ +# # define mkdir(a, b) _mkdir(a) +# # else +# # error "Don't know how to create a directory on this system." +# # endif +# #endif +# +# LICENSE +# +# Copyright (c) 2008 Alexandre Duret-Lutz +# +# 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 2 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 . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 6 + +AU_ALIAS([AC_FUNC_MKDIR], [AX_FUNC_MKDIR]) +AC_DEFUN([AX_FUNC_MKDIR], +[AC_CHECK_FUNCS([mkdir _mkdir]) +AC_CACHE_CHECK([whether mkdir takes one argument], + [ac_cv_mkdir_takes_one_arg], +[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#if HAVE_UNISTD_H +# include +#endif +]], [[mkdir (".");]])], +[ac_cv_mkdir_takes_one_arg=yes], [ac_cv_mkdir_takes_one_arg=no])]) +if test x"$ac_cv_mkdir_takes_one_arg" = xyes; then + AC_DEFINE([MKDIR_TAKES_ONE_ARG], 1, + [Define if mkdir takes only one argument.]) +fi +]) + +dnl Note: +dnl ===== +dnl I have not implemented the following suggestion because I don't have +dnl access to such a broken environment to test the macro. So I'm just +dnl appending the comments here in case you have, and want to fix +dnl AX_FUNC_MKDIR that way. +dnl +dnl |Thomas E. Dickey (dickey@herndon4.his.com) said: +dnl | it doesn't cover the problem areas (compilers that mistreat mkdir +dnl | may prototype it in dir.h and dirent.h, for instance). +dnl | +dnl |Alexandre: +dnl | Would it be sufficient to check for these headers and #include +dnl | them in the AC_COMPILE_IFELSE block? (and is AC_HEADER_DIRENT +dnl | suitable for this?) +dnl | +dnl |Thomas: +dnl | I think that might be a good starting point (with the set of recommended +dnl | ifdef's and includes for AC_HEADER_DIRENT, of course). + # =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_require_defined.html # =========================================================================== diff --git a/config.h.in b/config.h.in index 3062b76..3cd09d7 100644 --- a/config.h.in +++ b/config.h.in @@ -73,6 +73,12 @@ /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL +/* Define to 1 if you have the `_mkdir' function. */ +#undef HAVE__MKDIR + +/* Define if mkdir takes only one argument. */ +#undef MKDIR_TAKES_ONE_ARG + /* Name of package */ #undef PACKAGE diff --git a/configure b/configure index 3878556..2abf9ce 100755 --- a/configure +++ b/configure @@ -4506,7 +4506,7 @@ done ac_config_files="$ac_config_files Makefile src/Makefile" -# Additional Macro Checks +# Check that curses.h exists @@ -5671,6 +5671,56 @@ if test "x$ax_cv_curses" != xyes; then as_fn_error $? "requires an X/Open-compatible Curses library with color" "$LINENO" 5 fi +# Check if mkdir takes one or more arguments +for ac_func in mkdir _mkdir +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mkdir takes one argument" >&5 +$as_echo_n "checking whether mkdir takes one argument... " >&6; } +if ${ac_cv_mkdir_takes_one_arg+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if HAVE_UNISTD_H +# include +#endif + +int +main () +{ +mkdir ("."); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_mkdir_takes_one_arg=yes +else + ac_cv_mkdir_takes_one_arg=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_mkdir_takes_one_arg" >&5 +$as_echo "$ac_cv_mkdir_takes_one_arg" >&6; } +if test x"$ac_cv_mkdir_takes_one_arg" = xyes; then + +$as_echo "#define MKDIR_TAKES_ONE_ARG 1" >>confdefs.h + +fi + + cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure diff --git a/configure.ac b/configure.ac index 86ed508..e9e1da1 100644 --- a/configure.ac +++ b/configure.ac @@ -23,10 +23,13 @@ AC_CHECK_FUNCS([mkdir]) AC_CONFIG_FILES([Makefile src/Makefile]) -# Additional Macro Checks +# Check that curses.h exists AX_WITH_CURSES if test "x$ax_cv_curses" != xyes; then AC_MSG_ERROR([requires an X/Open-compatible Curses library with color]) fi +# Check if mkdir takes one or more arguments +AX_FUNC_MKDIR + AC_OUTPUT diff --git a/src/body.c b/src/body.c index ad06411..36a81ce 100644 --- a/src/body.c +++ b/src/body.c @@ -1,3 +1,5 @@ +#include "config.h" + #include #include #include diff --git a/src/draw.c b/src/draw.c index 55f9013..e49d636 100644 --- a/src/draw.c +++ b/src/draw.c @@ -1,3 +1,5 @@ +#include "config.h" + #include #include #include @@ -12,6 +14,11 @@ #include "include/body.h" +#ifdef MKDIR_TAKES_ONE_ARG /* MinGW32 */ +#undef mkdir +#define mkdir(a, b) mkdir(a) +#endif + #define START_SIZE 4 //TODO consider having speed be affected by window size #define SPEED 50000 //global refresh rate (for usleep()) -- cgit