1@echo off
2goto :Run
3
4:Usage
5echo.
6echo Before running prepare_libffi.bat
7echo   LIBFFI_SOURCE environment variable must be set to the location of
8echo     of python-source-deps clone of libffi branch
9echo   VCVARSALL must be set to location of vcvarsall.bat
10echo   cygwin must be installed (see below)
11echo   SH environment variable must be set to the location of sh.exe
12echo.
13echo Tested with cygwin-x86 from https://www.cygwin.com/install.html
14echo Select http://mirrors.kernel.org as the download site
15echo Include the following cygwin packages in cygwin configuration:
16echo     make, autoconf, automake, libtool, dejagnu
17echo.
18echo NOTE: dejagnu is only required for running tests.
19echo       set LIBFFI_TEST=1 to run tests (optional)
20echo.
21echo Based on https://github.com/libffi/libffi/blob/master/.appveyor.yml
22echo.
23echo.
24echo.Available flags:
25echo.  -x64    enable x64 build
26echo.  -x86    enable x86 build
27echo.  -arm32  enable arm32 build
28echo.  -arm64  enable arm64 build
29echo.  -?      this help
30echo.  --install-cygwin  install cygwin to c:\cygwin
31exit /b 127
32
33:Run
34
35set BUILD_X64=
36set BUILD_X86=
37set BUILD_ARM32=
38set BUILD_ARM64=
39set BUILD_PDB=
40set BUILD_NOOPT=
41set INSTALL_CYGWIN=
42
43:CheckOpts
44if "%1"=="" goto :CheckOptsDone
45if /I "%1"=="-x64" (set BUILD_X64=1) & shift & goto :CheckOpts
46if /I "%1"=="-x86" (set BUILD_X86=1) & shift & goto :CheckOpts
47if /I "%1"=="-win32" (set BUILD_X86=1) & shift & goto :CheckOpts
48if /I "%1"=="-arm32" (set BUILD_ARM32=1) & shift & goto :CheckOpts
49if /I "%1"=="-arm64" (set BUILD_ARM64=1) & shift & goto :CheckOpts
50if /I "%1"=="-pdb" (set BUILD_PDB=-g) & shift & goto :CheckOpts
51if /I "%1"=="-noopt" (set BUILD_NOOPT=CFLAGS='-Od -warn all') & shift & goto :CheckOpts
52if /I "%1"=="-?" goto :Usage
53if /I "%1"=="--install-cygwin" (set INSTALL_CYGWIN=1) & shift & goto :CheckOpts
54goto :Usage
55
56:CheckOptsDone
57
58if NOT DEFINED BUILD_X64 if NOT DEFINED BUILD_X86 if NOT DEFINED BUILD_ARM32 if NOT DEFINED BUILD_ARM64 (
59    set BUILD_X64=1
60    set BUILD_X86=1
61    set BUILD_ARM32=1
62    set BUILD_ARM64=1
63)
64
65if "%INSTALL_CYGWIN%"=="1" call :InstallCygwin
66
67setlocal
68if NOT DEFINED SH if exist c:\cygwin\bin\sh.exe set SH=c:\cygwin\bin\sh.exe
69
70if NOT DEFINED VCVARSALL (
71    for /F "tokens=*" %%i in ('"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -property installationPath -latest -prerelease -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64') DO @(set VCVARSALL="%%i\VC\Auxiliary\Build\vcvarsall.bat")
72)
73if ^%VCVARSALL:~0,1% NEQ ^" SET VCVARSALL="%VCVARSALL%"
74
75if NOT DEFINED LIBFFI_SOURCE echo.&&echo ERROR LIBFFI_SOURCE environment variable not set && goto :Usage
76if NOT DEFINED SH echo ERROR SH environment variable not set && goto :Usage
77
78if not exist %SH% echo ERROR %SH% does not exist && goto :Usage
79if not exist %LIBFFI_SOURCE% echo ERROR %LIBFFI_SOURCE% does not exist && goto :Usage
80
81set OLDPWD=%LIBFFI_SOURCE%
82pushd %LIBFFI_SOURCE%
83
84%SH% --login -lc "cygcheck -dc cygwin"
85set GET_MSVCC=%SH% -lc "cd $OLDPWD; export MSVCC=`/usr/bin/find $PWD -name msvcc.sh`; echo ${MSVCC};"
86FOR /F "usebackq delims==" %%i IN (`%GET_MSVCC%`) do @set MSVCC=%%i
87
88echo.
89echo VCVARSALL    : %VCVARSALL%
90echo SH           : %SH%
91echo LIBFFI_SOURCE: %LIBFFI_SOURCE%
92echo MSVCC        : %MSVCC%
93echo.
94
95if not exist Makefile.in (
96    %SH% -lc "(cd $LIBFFI_SOURCE; ./autogen.sh;)"
97    if errorlevel 1 exit /B 1
98)
99
100if "%BUILD_X64%"=="1" call :BuildOne x64 x86_64-w64-cygwin x86_64-w64-cygwin
101if "%BUILD_X86%"=="1" call :BuildOne x86 i686-pc-cygwin i686-pc-cygwin
102if "%BUILD_ARM32%"=="1" call :BuildOne x86_arm i686-pc-cygwin arm-w32-cygwin
103if "%BUILD_ARM64%"=="1" call :BuildOne x86_arm64 i686-pc-cygwin aarch64-w64-cygwin
104
105popd
106endlocal
107exit /b 0
108REM all done
109
110
111REM this subroutine is called once for each architecture
112:BuildOne
113
114setlocal
115
116REM Initialize variables
117set VCVARS_PLATFORM=%1
118set BUILD=%2
119set HOST=%3
120set ASSEMBLER=
121set SRC_ARCHITECTURE=x86
122
123if NOT DEFINED VCVARS_PLATFORM echo ERROR bad VCVARS_PLATFORM&&exit /b 123
124
125if /I "%VCVARS_PLATFORM%" EQU "x64" (
126    set ARCH=amd64
127    set ARTIFACTS=%LIBFFI_SOURCE%\x86_64-w64-cygwin
128    set ASSEMBLER=-m64
129    set SRC_ARCHITECTURE=x86
130)
131if /I "%VCVARS_PLATFORM%" EQU "x86" (
132    set ARCH=win32
133    set ARTIFACTS=%LIBFFI_SOURCE%\i686-pc-cygwin
134    set ASSEMBLER=
135    set SRC_ARCHITECTURE=x86
136)
137if /I "%VCVARS_PLATFORM%" EQU "x86_arm" (
138    set ARCH=arm32
139    set ARTIFACTS=%LIBFFI_SOURCE%\arm-w32-cygwin
140    set ASSEMBLER=-marm
141    set SRC_ARCHITECTURE=ARM
142)
143if /I "%VCVARS_PLATFORM%" EQU "x86_arm64" (
144    set ARCH=arm64
145    set ARTIFACTS=%LIBFFI_SOURCE%\aarch64-w64-cygwin
146    set ASSEMBLER=-marm64
147    set SRC_ARCHITECTURE=aarch64
148)
149
150if NOT DEFINED LIBFFI_OUT set LIBFFI_OUT=%~dp0\..\externals\libffi
151set _LIBFFI_OUT=%LIBFFI_OUT%\%ARCH%
152
153echo get VS build environment
154call %VCVARSALL% %VCVARS_PLATFORM%
155
156echo clean %_LIBFFI_OUT%
157if exist %_LIBFFI_OUT% (rd %_LIBFFI_OUT% /s/q)
158
159echo ================================================================
160echo Configure the build to generate fficonfig.h and ffi.h
161echo ================================================================
162%SH% -lc "(cd $OLDPWD; ./configure CC='%MSVCC% %ASSEMBLER% %BUILD_PDB%' CXX='%MSVCC% %ASSEMBLER% %BUILD_PDB%' LD='link' CPP='cl -nologo -EP' CXXCPP='cl -nologo -EP' CPPFLAGS='-DFFI_BUILDING_DLL' %BUILD_NOOPT% NM='dumpbin -symbols' STRIP=':' --build=$BUILD --host=$HOST;)"
163if errorlevel 1 exit /B %ERRORLEVEL%
164
165echo ================================================================
166echo Building libffi
167echo ================================================================
168%SH% -lc "(cd $OLDPWD; export PATH=/usr/bin:$PATH; cp src/%SRC_ARCHITECTURE%/ffitarget.h include; make; find .;)"
169if errorlevel 1 exit /B %ERRORLEVEL%
170
171REM Tests are not needed to produce artifacts
172if "%LIBFFI_TEST%" EQU "1" (
173    echo "Running tests..."
174    %SH% -lc "(cd $OLDPWD; export PATH=/usr/bin:$PATH; cp `find $PWD -name 'libffi-?.dll'` $HOST/testsuite/; make check; cat `find ./ -name libffi.log`)"
175) else (
176    echo "Not running tests"
177)
178
179
180echo copying files to %_LIBFFI_OUT%
181if not exist %_LIBFFI_OUT%\include (md %_LIBFFI_OUT%\include)
182copy %ARTIFACTS%\.libs\libffi-7.dll %_LIBFFI_OUT%
183copy %ARTIFACTS%\.libs\libffi-7.lib %_LIBFFI_OUT%
184copy %ARTIFACTS%\.libs\libffi-7.pdb %_LIBFFI_OUT%
185copy %ARTIFACTS%\fficonfig.h %_LIBFFI_OUT%\include
186copy %ARTIFACTS%\include\*.h %_LIBFFI_OUT%\include
187
188endlocal
189exit /b
190
191:InstallCygwin
192setlocal
193
194if NOT DEFINED CYG_ROOT (set CYG_ROOT=c:/cygwin)
195if NOT DEFINED CYG_CACHE (set CYG_CACHE=C:/cygwin/var/cache/setup)
196if NOT DEFINED CYG_MIRROR (set CYG_MIRROR=http://mirrors.kernel.org/sourceware/cygwin/)
197
198powershell -c "md $env:CYG_ROOT -ErrorAction SilentlyContinue"
199powershell -c "$setup = $env:CYG_ROOT+'/setup.exe'; if (!(Test-Path $setup)){invoke-webrequest https://cygwin.com/setup-x86.exe -outfile $setup}
200%CYG_ROOT%/setup.exe -qnNdO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_CACHE%" -P make -P autoconf -P automake -P libtool -P dejagnu
201
202endlocal
203exit /b
204
205