Add support for building with Tiny C for MS-Windows

* src/config.h.W32.template (HAVE_DIRECT_H, HAVE_STRCASECMP)
(HAVE_STRNCASECMP, HAVE_UMASK): Add __TINYC__ to MinGW condition.
(BATCH_MODE_ONLY_SHELL): Make this the default for Tiny C.

* build_w32.bat: Support building with Tiny C's tcc compiler.
diff --git a/build_w32.bat b/build_w32.bat
index 553e9d9..da77022 100755
--- a/build_w32.bat
+++ b/build_w32.bat
@@ -37,6 +37,7 @@
 set O=obj

 set ARCH=x64

 set DEBUG=N

+set DIRENT=Y

 

 if exist maintMakefile (

     set MAINT=Y

@@ -49,6 +50,7 @@
 if "%1" == "--without-guile" goto NoGuile

 if "%1" == "--x86" goto Set32Bit

 if "%1" == "gcc" goto SetCC

+if "%1" == "tcc" goto SetTCC

 if "%1" == "" goto DoneSW

 goto Usage

 

@@ -77,10 +79,18 @@
 shift

 goto ParseSW

 

+:SetTCC

+set COMPILER=tcc

+set O=o

+echo - Building with TinyC

+shift

+goto ParseSW

+

 :DoneSW

 if "%MAINT%" == "Y" echo - Enabling maintainer mode

 

 if "%COMPILER%" == "gcc" goto FindGcc

+if "%COMPILER%" == "tcc" goto FindTcc

 

 :: Find a compiler.  Visual Studio requires a lot of effort to locate :-/.

 %COMPILER% >nul 2>&1

@@ -172,6 +182,7 @@
 set OUTDIR=.\GccRel

 set LNKOUT=./GccRel

 set OPTS=-O2

+set DIRENT=N

 if "%DEBUG%" == "Y" set OPTS=-O0

 if "%DEBUG%" == "Y" set OUTDIR=.\GccDebug

 if "%DEBUG%" == "Y" set LNKOUT=./GccDebug

@@ -183,6 +194,21 @@
 echo No %COMPILER% found.

 exit 1

 

+:FindTcc

+set OUTDIR=.\TccRel

+set LNKOUT=./TccRel

+set OPTS=-O2

+if "%DEBUG%" == "Y" set OPTS=-O0

+if "%DEBUG%" == "Y" set OUTDIR=.\TccDebug

+if "%DEBUG%" == "Y" set LNKOUT=./TccDebug

+if "%MAINT%" == "Y" set "OPTS=%OPTS% -DMAKE_MAINTAINER_MODE"

+:: Show the compiler version that we found

+echo.

+%COMPILER% -v

+if not ERRORLEVEL 1 goto Build

+echo No %COMPILER% found.

+exit 1

+

 :Build

 :: Clean the directory if it exists

 if exist %OUTDIR%\nul rmdir /S /Q %OUTDIR%

@@ -246,7 +272,8 @@
 call :Compile lib/glob

 call :Compile lib/getloadavg

 

-if not "%COMPILER%" == "gcc" call :Compile src\w32\compat\dirent

+:: Compile dirent unless it is supported by compiler library (like with gcc).

+if "%DIRENT%" == "Y" call :Compile src\w32\compat\dirent

 

 call :Link

 

@@ -272,6 +299,7 @@
 if "%2" == "GUILE" set "EXTRAS=%GUILECFLAGS%"

 if exist "%OUTDIR%\%1.%O%" del "%OUTDIR%\%1.%O%"

 if "%COMPILER%" == "gcc" goto GccCompile

+if "%COMPILER%" == "tcc" goto TccCompile

 

 :: MSVC Compile

 echo on

@@ -284,6 +312,14 @@
 echo on

 %COMPILER% -mthreads -Wall -std=gnu99 -gdwarf-2 -g3 %OPTS% -I%OUTDIR%/src -I./src -I%OUTDIR%/lib -I./lib -I./src/w32/include -DWINDOWS32 -DHAVE_CONFIG_H %EXTRAS% -o %OUTDIR%/%1.%O% -c %1.c

 @echo off

+goto CompileDone

+

+:TccCompile

+:: TCC Compile

+echo on

+%COMPILER% -mthreads -Wall -std=c11 %OPTS% -I%OUTDIR%/src -I./src -I%OUTDIR%/lib -I./lib -I./src/w32/include -D_cdecl= -D_MSC_VER -DWINDOWS32 -DHAVE_CONFIG_H %EXTRAS% -o %OUTDIR%/%1.%O% -c %1.c

+@echo off

+goto CompileDone

 

 :CompileDone

 if not exist "%OUTDIR%\%1.%O%" exit 1

@@ -293,6 +329,7 @@
 echo.

 echo Linking %LNKOUT%/%MAKE%.exe

 if "%COMPILER%" == "gcc" goto GccLink

+if "%COMPILER%" == "tcc" goto TccLink

 

 :: MSVC Link

 echo %GUILELIBS% kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib >>%OUTDIR%\link.sc

@@ -309,6 +346,14 @@
 @echo off

 goto :EOF

 

+:TccLink

+:: TCC Link

+echo on

+echo %GUILELIBS% -lkernel32 -luser32 -lgdi32 -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lodbc32 -lodbccp32 >>%OUTDIR%\link.sc

+%COMPILER% -mthreads %OPTS% -o %LNKOUT%/%MAKE%.exe @%LNKOUT%/link.sc 

+@echo off

+goto :EOF

+

 :ConfigSCM

 echo Generating config from SCM templates

 sed -n "s/^AC_INIT(\[GNU make\],\[\([^]]\+\)\].*/s,%%VERSION%%,\1,g/p" configure.ac > %OUTDIR%\src\config.h.W32.sed

@@ -375,12 +420,14 @@
 goto :EOF

 

 :Usage

-echo Usage: %0 [options] [gcc]

+echo Usage: %0 [options] [gcc] OR [tcc]

 echo Options:

 echo.  --without-guile   Do not compile Guile support even if found

 echo.  --debug           Make a Debug build--default is Release

 echo.  --x86             Make a 32bit binary--default is 64bit

 echo.  --help            Display these instructions and exit

+echo.

+echo. "gcc" means compile with GCC, "tcc" means compile with Tiny C's TCC

 goto :EOF

 

 :Reset

diff --git a/src/config.h.W32.template b/src/config.h.W32.template
index 9a9ccfe..347f420 100644
--- a/src/config.h.W32.template
+++ b/src/config.h.W32.template
@@ -102,7 +102,7 @@
 /* Define to 1 if you have the <direct.h> header file, and it defines getcwd()
    and chdir().
    */
-#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(__INTERIX)
+#if (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__TINYC__)) && !defined(__INTERIX)
 # define HAVE_DIRECT_H 1
 #endif
 
@@ -247,7 +247,7 @@
 #define HAVE_STDLIB_H 1
 
 /* Define to 1 if you have the 'strcasecmp' function. */
-#ifdef __MINGW32__
+#if defined(__MINGW32__) || defined(__TINYC__)
 #define HAVE_STRCASECMP 1
 #endif
 
@@ -273,7 +273,7 @@
 #define HAVE_STRING_H 1
 
 /* Define to 1 if you have the 'strncasecmp' function. */
-#ifdef __MINGW32__
+#if defined(__MINGW32__) || defined(__TINYC__)
 #define HAVE_STRNCASECMP 1
 #endif
 
@@ -305,7 +305,7 @@
 char *ttyname (int);
 
 /* Define to 1 if you have the `umask' function. */
-#ifdef __MINGW32__
+#if defined(__MINGW32__) || defined(__TINYC__)
 # define HAVE_UMASK 1
 #endif
 
@@ -525,10 +525,14 @@
 
 /*
  * If you have a shell that does not grok 'sh -c quoted-command-line'
- * correctly, you need this setting. Please see below for specific
- * shell support.
+ * correctly, you need this setting; it is the default for tcc.
+ * Please see below for specific shell support.
  */
+#if defined(__TINYC__)
+#define BATCH_MODE_ONLY_SHELL 1
+#else
 /*#define BATCH_MODE_ONLY_SHELL 1 */
+#endif
 
 /*
  * Define if you have the Cygnus "Cygwin" GNU Windows32 tool set.