support Windows build on Bash/WSL

original commit: 7e4782db08210cbacd1bbe46b3a5e166d8dbe20f
This commit is contained in:
Matthew Flatt 2017-05-01 20:08:59 -06:00
parent 15343364a9
commit 2d63f03442
16 changed files with 107 additions and 83 deletions

View File

@ -167,15 +167,18 @@ The make file supports several targets:
WINDOWS WINDOWS
Building Chez Scheme under Windows with Cygwin follows the Building Chez Scheme under Windows with Cygwin or Bash/WSL follows the
instructions above except that make install is not supported: instructions above, except that 'make install' is not supported, and
the 'OS' environment variable must be set to 'Windows_NT' on Bash/WSL
(to indicate a build for Windows, as opposed to a build for Linux on
Windows):
./configure env OS=Windows_NT ./configure
make env OS=Windows_NT make
Prerequisites: Prerequisites:
* Cygwin with bash, grep, make, sed, etc. * Cygwin or Bash/WSL with bash, grep, make, sed, etc.
* Microsoft Visual Studio 2015 * Microsoft Visual Studio 2015
* WiX Toolset (for making an install) * WiX Toolset (for making an install)

3
LOG
View File

@ -450,3 +450,6 @@
Also add a simplification for for-each with empty lists Also add a simplification for for-each with empty lists
with optimization level 2. with optimization level 2.
cp0.ss, 4.ms, primdata.ss cp0.ss, 4.ms, primdata.ss
- support Windows build on Bash/WSL
BUILDING, configure, workarea, c/vs.bat (new), mats/vs.bat (new),
c/Mf-*nt, mats/Mf-*, s/Mf-base

View File

@ -25,27 +25,11 @@ mdclean=vs.bat make.bat scheme.res ../bin/$m/*.exp mtscheme.exe* mdscheme.exe*
include Mf-base include Mf-base
${Scheme}: make.bat ${Scheme}: make.bat
./make.bat cmd.exe /c make.bat
cp ../bin/$m/scheme.exe ../bin/$m/petite.exe cp ../bin/$m/scheme.exe ../bin/$m/petite.exe
vs.bat:
echo '@echo off' > $@
echo 'if "%VS140COMNTOOLS%" neq "" goto :VS' >> $@
echo 'echo Visual Studio 2015 must be installed.' >> $@
echo 'exit 1' >> $@
echo ':VS' >> $@
echo 'set INCLUDE=' >> $@
echo 'set LIB=' >> $@
echo 'set LIBPATH=' >> $@
echo 'set MACHINETYPE=amd64' >> $@
echo 'if exist "%VS140COMNTOOLS%..\..\VC\bin\x86_amd64\vcvarsx86_amd64.bat" set MACHINETYPE=x86_amd64' >> $@
echo 'if exist "%VS140COMNTOOLS%..\..\VC\bin\amd64\vcvars64.bat" set MACHINETYPE=amd64' >> $@
echo 'call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" %MACHINETYPE%' >> $@
echo '%*' >> $@
chmod +x $@
make.bat: vs.bat make.bat: vs.bat
echo '@echo off' > $@ echo '@echo off' > $@
echo 'set MAKEFLAGS=' >> $@ echo 'set MAKEFLAGS=' >> $@
echo 'call vs.bat nmake /f Makefile.$m /nologo %*' >> $@ echo 'vs.bat x86_amd64 amd64 && nmake /f Makefile.$m /nologo %*' >> $@
chmod +x $@ chmod +x $@

View File

@ -25,24 +25,11 @@ mdclean=vs.bat make.bat scheme.res ../bin/$m/*.exp mtscheme.exe* mdscheme.exe*
include Mf-base include Mf-base
${Scheme}: make.bat ${Scheme}: make.bat
./make.bat cmd.exe /c make.bat
cp ../bin/$m/scheme.exe ../bin/$m/petite.exe cp ../bin/$m/scheme.exe ../bin/$m/petite.exe
vs.bat:
echo '@echo off' > $@
echo 'if "%VS140COMNTOOLS%" neq "" goto :VS' >> $@
echo 'echo Visual Studio 2015 must be installed.' >> $@
echo 'exit 1' >> $@
echo ':VS' >> $@
echo 'set INCLUDE=' >> $@
echo 'set LIB=' >> $@
echo 'set LIBPATH=' >> $@
echo 'call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x86' >> $@
echo '%*' >> $@
chmod +x $@
make.bat: vs.bat make.bat: vs.bat
echo '@echo off' > $@ echo '@echo off' > $@
echo 'set MAKEFLAGS=' >> $@ echo 'set MAKEFLAGS=' >> $@
echo 'call vs.bat nmake /f Makefile.$m /nologo %*' >> $@ echo 'vs.bat x86 && nmake /f Makefile.$m /nologo %*' >> $@
chmod +x $@ chmod +x $@

View File

@ -25,27 +25,11 @@ mdclean=vs.bat make.bat scheme.res ../bin/$m/*.exp mtscheme.exe* mdscheme.exe*
include Mf-base include Mf-base
${Scheme}: make.bat ${Scheme}: make.bat
./make.bat cmd.exe /c make.bat
cp ../bin/$m/scheme.exe ../bin/$m/petite.exe cp ../bin/$m/scheme.exe ../bin/$m/petite.exe
vs.bat:
echo '@echo off' > $@
echo 'if "%VS140COMNTOOLS%" neq "" goto :VS' >> $@
echo 'echo Visual Studio 2015 must be installed.' >> $@
echo 'exit 1' >> $@
echo ':VS' >> $@
echo 'set INCLUDE=' >> $@
echo 'set LIB=' >> $@
echo 'set LIBPATH=' >> $@
echo 'set MACHINETYPE=amd64' >> $@
echo 'if exist "%VS140COMNTOOLS%..\..\VC\bin\x86_amd64\vcvarsx86_amd64.bat" set MACHINETYPE=x86_amd64' >> $@
echo 'if exist "%VS140COMNTOOLS%..\..\VC\bin\amd64\vcvars64.bat" set MACHINETYPE=amd64' >> $@
echo 'call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" %MACHINETYPE%' >> $@
echo '%*' >> $@
chmod +x $@
make.bat: vs.bat make.bat: vs.bat
echo '@echo off' > $@ echo '@echo off' > $@
echo 'set MAKEFLAGS=' >> $@ echo 'set MAKEFLAGS=' >> $@
echo 'call vs.bat nmake /f Makefile.$m /nologo %*' >> $@ echo 'vs.bat x86_amd64 amd64 && nmake /f Makefile.$m /nologo %*' >> $@
chmod +x $@ chmod +x $@

View File

@ -25,24 +25,11 @@ mdclean=vs.bat make.bat scheme.res ../bin/$m/*.exp mtscheme.exe* mdscheme.exe*
include Mf-base include Mf-base
${Scheme}: make.bat ${Scheme}: make.bat
./make.bat cmd.exe /c make.bat
cp ../bin/$m/scheme.exe ../bin/$m/petite.exe cp ../bin/$m/scheme.exe ../bin/$m/petite.exe
vs.bat:
echo '@echo off' > $@
echo 'if "%VS140COMNTOOLS%" neq "" goto :VS' >> $@
echo 'echo Visual Studio 2015 must be installed.' >> $@
echo 'exit 1' >> $@
echo ':VS' >> $@
echo 'set INCLUDE=' >> $@
echo 'set LIB=' >> $@
echo 'set LIBPATH=' >> $@
echo 'call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x86' >> $@
echo '%*' >> $@
chmod +x $@
make.bat: vs.bat make.bat: vs.bat
echo '@echo off' > $@ echo '@echo off' > $@
echo 'set MAKEFLAGS=' >> $@ echo 'set MAKEFLAGS=' >> $@
echo 'call vs.bat nmake /f Makefile.$m /nologo %*' >> $@ echo 'vs.bat x86 && nmake /f Makefile.$m /nologo %*' >> $@
chmod +x $@ chmod +x $@

39
c/vs.bat Normal file
View File

@ -0,0 +1,39 @@
@echo off
:: Set up Visual Studio command line environment variables given a
:: sequence of machine types to try ("x86", "x86_amd64", and "amd64").
:: Note: VS 11.0 (2012) and earlier won't work, because they
:: don't support C99 mid-block declarations. Also, there's no
:: such thing as VS 13.0.
:: Clear environment variables that we might otherwise inherit
set INCLUDE=
set LIB=
set LIBPATH=
:: Find visual studio
set VCDIR=%VS140COMNTOOLS%\..\..\vc
if not exist "%VCDIR%\vcvarsall.bat" set VCDIR=%VS120COMNTOOLS%\..\..\vc
:: Loop to find a requested machine type
if exist "%VCDIR%\vcvarsall.bat" goto :VCDIR
echo Could not find Visual Studio installed.
exit 1
:VCDIR
set MACHINETYPE=%1
if "%MACHINETYPE%" neq "" goto :MACHINE
echo Could not find working machine type.
exit 1
:MACHINE
if "%MACHINETYPE%" == "x86" goto :VS
if exist "%VCDIR%\bin\%MACHINETYPE%\vcvars%MACHINETYPE%.bat" goto :VS
shift
goto :VCDIR
:: Set environment variables
:VS
"%VCDIR%\vcvarsall.bat" %MACHINETYPE%

10
configure vendored
View File

@ -41,7 +41,15 @@ installscriptname="scheme-script"
: ${CFLAGS:=""} : ${CFLAGS:=""}
: ${LDFLAGS:=""} : ${LDFLAGS:=""}
case `uname` in # On WSL, set OS to "Windows_NT" to create a Windows
# build instead of a Linux (on Windows) build:
if [ "$OS" = "Windows_NT" ] ; then
CONFIG_UNAME="CYGWIN_NT-"
else
CONFIG_UNAME=`uname`
fi
case "${CONFIG_UNAME}" in
Linux) Linux)
if uname -a | egrep 'i386|i686|amd64|athlon|x86_64' > /dev/null 2>&1 ; then if uname -a | egrep 'i386|i686|amd64|athlon|x86_64' > /dev/null 2>&1 ; then
m32=i3le m32=i3le

View File

@ -22,7 +22,7 @@ mdclean = cat_flush.exe cat_flush.obj foreign1.exp foreign1.lib foreign1.obj for
include Mf-base include Mf-base
foreign1.so: $(fsrc) foreign1.so: $(fsrc)
../c/vs.bat cl /DWIN32 /DX86_64 /Fe$@ /I${Include} /LD /MD /nologo ../bin/$m/csv941.lib $(fsrc) cmd.exe /c "vs.bat x86_amd64 amd64 && cl /DWIN32 /DX86_64 /Fe$@ /I${Include} /LD /MD /nologo ../bin/$m/csv941.lib $(fsrc)"
cat_flush: cat_flush.c cat_flush: cat_flush.c
../c/vs.bat cl /DWIN32 /DX86_64 /MD /nologo $< cmd.exe /c "vs.bat x86_amd64 amd64 && cl /DWIN32 /DX86_64 /MD /nologo $<"

View File

@ -39,9 +39,17 @@ ifeq (${OS},Windows_NT)
else else
dirsep = : dirsep = :
endif endif
# Explicit ".exe" needed for WSL
ifeq ($(OS),Windows_NT)
ExeSuffix = .exe
else
ExeSuffix =
endif
# Scheme is the scheme executable to test, and SCHEMEHEAPDIRS tells # Scheme is the scheme executable to test, and SCHEMEHEAPDIRS tells
# it where to find its boot files # it where to find its boot files
Scheme = ../bin/$m/scheme Scheme = ../bin/$m/scheme${ExeSuffix}
export SCHEMEHEAPDIRS=.${dirsep}../boot/%m export SCHEMEHEAPDIRS=.${dirsep}../boot/%m
# Include is the directory holding scheme.h. # Include is the directory holding scheme.h.

View File

@ -22,7 +22,7 @@ mdclean = cat_flush.exe cat_flush.obj foreign1.exp foreign1.lib foreign1.obj for
include Mf-base include Mf-base
foreign1.so: $(fsrc) foreign1.so: $(fsrc)
../c/vs.bat cl /DWIN32 /Fe$@ /I${Include} /LD /MD /nologo ../bin/$m/csv941.lib $(fsrc) cmd.exe /c "vs.bat x86 && cl /DWIN32 /Fe$@ /I${Include} /LD /MD /nologo ../bin/$m/csv941.lib $(fsrc)"
cat_flush: cat_flush.c cat_flush: cat_flush.c
../c/vs.bat cl /DWIN32 /MD /nologo $< cmd.exe /c "vs.bat x86 && cl /DWIN32 /MD /nologo $<"

View File

@ -22,7 +22,7 @@ mdclean = cat_flush.exe cat_flush.obj foreign1.exp foreign1.lib foreign1.obj for
include Mf-base include Mf-base
foreign1.so: $(fsrc) foreign1.so: $(fsrc)
../c/vs.bat cl /DWIN32 /DX86_64 /Fe$@ /I${Include} /LD /MD /nologo ../bin/$m/csv941.lib $(fsrc) cmd.exe /c "vs.bat x86_amd64 amd64 && cl /DWIN32 /DX86_64 /Fe$@ /I${Include} /LD /MD /nologo ../bin/$m/csv941.lib $(fsrc)"
cat_flush: cat_flush.c cat_flush: cat_flush.c
../c/vs.bat cl /DWIN32 /DX86_64 /MD /nologo $< cmd.exe /c "vs.bat x86_amd64 amd64 && cl /DWIN32 /DX86_64 /MD /nologo $<"

View File

@ -22,7 +22,7 @@ mdclean = cat_flush.exe cat_flush.obj foreign1.exp foreign1.lib foreign1.obj for
include Mf-base include Mf-base
foreign1.so: $(fsrc) foreign1.so: $(fsrc)
../c/vs.bat cl /DWIN32 /Fe$@ /I${Include} /LD /MD /nologo ../bin/$m/csv941.lib $(fsrc) cmd.exe /c "vs.bat x86 && cl /DWIN32 /Fe$@ /I${Include} /LD /MD /nologo ../bin/$m/csv941.lib $(fsrc)"
cat_flush: cat_flush.c cat_flush: cat_flush.c
../c/vs.bat cl /DWIN32 /MD /nologo $< cmd.exe /c "vs.bat x86 && cl /DWIN32 /MD /nologo $<"

3
mats/vs.bat Normal file
View File

@ -0,0 +1,3 @@
:: Redirect to "..\c\vs.bat" without having to use
:: backslashes in the makefile
..\c\vs.bat %*

View File

@ -67,10 +67,17 @@ gic = f
# pps determines whether pass timings are printed # pps determines whether pass timings are printed
pps = f pps = f
# Explicit ".exe" needed for WSL
ifeq ($(OS),Windows_NT)
ExeSuffix = .exe
else
ExeSuffix =
endif
# The following control where files sit and typically don't need to be changed, except # The following control where files sit and typically don't need to be changed, except
# that Scheme and SCHEMEHEAPDIRS are set by Mf-cross to point to the host Scheme # that Scheme and SCHEMEHEAPDIRS are set by Mf-cross to point to the host Scheme
# implementation # implementation
Scheme = ../bin/$m/scheme Scheme = ../bin/$m/scheme${ExeSuffix}
export SCHEMEHEAPDIRS=../boot/%m export SCHEMEHEAPDIRS=../boot/%m
# Define the libdirs separator character # Define the libdirs separator character
@ -278,7 +285,7 @@ checkboot:
'(#%$$fasl-file-equal? "../boot/$m/sbb" "../boot/$m/petite.boot" #t)'\ '(#%$$fasl-file-equal? "../boot/$m/sbb" "../boot/$m/petite.boot" #t)'\
'(#%$$fasl-file-equal? "../boot/$m/scb" "../boot/$m/scheme.boot" #t)'\ '(#%$$fasl-file-equal? "../boot/$m/scb" "../boot/$m/scheme.boot" #t)'\
'(printf "bootfile comparison succeeded\n"))'\ '(printf "bootfile comparison succeeded\n"))'\
| ../bin/$m/scheme -b ../boot/$m/sbb -q | ../bin/$m/scheme${ExeSuffix} -b ../boot/$m/sbb -q
xcheckboot: ${macroobj} ${patchfile} xcheckboot: ${macroobj} ${patchfile}
@echo '(reset-handler abort)'\ @echo '(reset-handler abort)'\

View File

@ -133,6 +133,12 @@ fi
if [ ! -e $W/c/Mf-config ] ; then if [ ! -e $W/c/Mf-config ] ; then
touch $W/c/Mf-config touch $W/c/Mf-config
fi fi
case $M in
*nt)
(cd $W/c; workln ../../c/vs.bat vs.bat)
;;
esac
workdir $W/s workdir $W/s
(cd $W/s; workln ../../s/Mf-$M Mf-$M) (cd $W/s; workln ../../s/Mf-$M Mf-$M)
@ -147,6 +153,11 @@ workdir $W/mats
(cd $W/mats; forceworkln Mf-$M Makefile) (cd $W/mats; forceworkln Mf-$M Makefile)
(cd $W/mats; workln ../../mats/Mf-base Mf-base) (cd $W/mats; workln ../../mats/Mf-base Mf-base)
(cd $W/mats; workln ../../mats/Mf-exobj Mf-exobj) (cd $W/mats; workln ../../mats/Mf-exobj Mf-exobj)
case $M in
*nt)
(cd $W/mats; workln ../../mats/vs.bat vs.bat)
;;
esac
for dir in `echo examples unicode` ; do for dir in `echo examples unicode` ; do
workdir $W/$dir workdir $W/$dir