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 COPY_LICENSE= 42set INSTALL_CYGWIN= 43 44:CheckOpts 45if "%1"=="" goto :CheckOptsDone 46if /I "%1"=="-x64" (set BUILD_X64=1) & shift & goto :CheckOpts 47if /I "%1"=="-x86" (set BUILD_X86=1) & shift & goto :CheckOpts 48if /I "%1"=="-win32" (set BUILD_X86=1) & shift & goto :CheckOpts 49if /I "%1"=="-arm32" (set BUILD_ARM32=1) & shift & goto :CheckOpts 50if /I "%1"=="-arm64" (set BUILD_ARM64=1) & shift & goto :CheckOpts 51if /I "%1"=="-pdb" (set BUILD_PDB=-g) & shift & goto :CheckOpts 52if /I "%1"=="-noopt" (set BUILD_NOOPT=CFLAGS='-Od -warn all') & shift & goto :CheckOpts 53if /I "%1"=="-license" (set COPY_LICENSE=1) & shift & goto :CheckOpts 54if /I "%1"=="-?" goto :Usage 55if /I "%1"=="--install-cygwin" (set INSTALL_CYGWIN=1) & shift & goto :CheckOpts 56goto :Usage 57 58:CheckOptsDone 59 60if NOT DEFINED BUILD_X64 if NOT DEFINED BUILD_X86 if NOT DEFINED BUILD_ARM32 if NOT DEFINED BUILD_ARM64 ( 61 set BUILD_X64=1 62 set BUILD_X86=1 63 set BUILD_ARM32=1 64 set BUILD_ARM64=1 65 set COPY_LICENSE=1 66) 67 68if "%INSTALL_CYGWIN%"=="1" call :InstallCygwin 69 70setlocal 71if NOT DEFINED SH if exist c:\cygwin\bin\sh.exe set SH=c:\cygwin\bin\sh.exe 72 73if NOT DEFINED VCVARSALL ( 74 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") 75) 76if ^%VCVARSALL:~0,1% NEQ ^" SET VCVARSALL="%VCVARSALL%" 77 78if NOT DEFINED LIBFFI_SOURCE echo.&&echo ERROR LIBFFI_SOURCE environment variable not set && goto :Usage 79if NOT DEFINED SH echo ERROR SH environment variable not set && goto :Usage 80 81if not exist %SH% echo ERROR %SH% does not exist && goto :Usage 82if not exist %LIBFFI_SOURCE% echo ERROR %LIBFFI_SOURCE% does not exist && goto :Usage 83 84set OLDPWD=%LIBFFI_SOURCE% 85pushd %LIBFFI_SOURCE% 86 87%SH% --login -lc "cygcheck -dc cygwin" 88set GET_MSVCC=%SH% -lc "cd $OLDPWD; export MSVCC=`/usr/bin/find $PWD -name msvcc.sh`; echo ${MSVCC};" 89FOR /F "usebackq delims==" %%i IN (`%GET_MSVCC%`) do @set MSVCC=%%i 90 91echo. 92echo VCVARSALL : %VCVARSALL% 93echo SH : %SH% 94echo LIBFFI_SOURCE: %LIBFFI_SOURCE% 95echo MSVCC : %MSVCC% 96echo. 97 98if not exist Makefile.in ( 99 %SH% -lc "(cd $LIBFFI_SOURCE; ./autogen.sh;)" 100 if errorlevel 1 exit /B 1 101) 102 103if "%BUILD_X64%"=="1" call :BuildOne x64 x86_64-w64-cygwin x86_64-w64-cygwin 104if errorlevel 1 exit /B %ERRORLEVEL% 105if "%BUILD_X86%"=="1" call :BuildOne x86 i686-pc-cygwin i686-pc-cygwin 106if errorlevel 1 exit /B %ERRORLEVEL% 107if "%BUILD_ARM32%"=="1" call :BuildOne x86_arm i686-pc-cygwin arm-w32-cygwin 108if errorlevel 1 exit /B %ERRORLEVEL% 109if "%BUILD_ARM64%"=="1" call :BuildOne x86_arm64 i686-pc-cygwin aarch64-w64-cygwin 110if errorlevel 1 exit /B %ERRORLEVEL% 111if "%COPY_LICENSE%"=="1" copy /y "%LIBFFI_SOURCE%\LICENSE" "%LIBFFI_OUT%\LICENSE" 112 113popd 114endlocal 115exit /b 0 116REM all done 117 118 119REM this subroutine is called once for each architecture 120:BuildOne 121 122setlocal 123 124REM Initialize variables 125set VCVARS_PLATFORM=%1 126set BUILD=%2 127set HOST=%3 128set ASSEMBLER= 129set SRC_ARCHITECTURE=x86 130 131if NOT DEFINED VCVARS_PLATFORM echo ERROR bad VCVARS_PLATFORM&&exit /b 123 132 133if /I "%VCVARS_PLATFORM%" EQU "x64" ( 134 set ARCH=amd64 135 set ARTIFACTS=%LIBFFI_SOURCE%\x86_64-w64-cygwin 136 set ASSEMBLER=-m64 137 set SRC_ARCHITECTURE=x86 138) 139if /I "%VCVARS_PLATFORM%" EQU "x86" ( 140 set ARCH=win32 141 set ARTIFACTS=%LIBFFI_SOURCE%\i686-pc-cygwin 142 set ASSEMBLER= 143 set SRC_ARCHITECTURE=x86 144) 145if /I "%VCVARS_PLATFORM%" EQU "x86_arm" ( 146 set ARCH=arm32 147 set ARTIFACTS=%LIBFFI_SOURCE%\arm-w32-cygwin 148 set ASSEMBLER=-marm 149 set SRC_ARCHITECTURE=ARM 150) 151if /I "%VCVARS_PLATFORM%" EQU "x86_arm64" ( 152 set ARCH=arm64 153 set ARTIFACTS=%LIBFFI_SOURCE%\aarch64-w64-cygwin 154 set ASSEMBLER=-marm64 155 set SRC_ARCHITECTURE=aarch64 156) 157 158if NOT DEFINED LIBFFI_OUT set LIBFFI_OUT=%~dp0\..\externals\libffi 159set _LIBFFI_OUT=%LIBFFI_OUT%\%ARCH% 160 161echo get VS build environment 162call %VCVARSALL% %VCVARS_PLATFORM% 163 164echo clean %_LIBFFI_OUT% 165if exist %_LIBFFI_OUT% (rd %_LIBFFI_OUT% /s/q) 166 167echo ================================================================ 168echo Configure the build to generate fficonfig.h and ffi.h 169echo ================================================================ 170%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;)" 171if errorlevel 1 exit /B %ERRORLEVEL% 172 173echo ================================================================ 174echo Building libffi 175echo ================================================================ 176%SH% -lc "(cd $OLDPWD; export PATH=/usr/bin:$PATH; cp src/%SRC_ARCHITECTURE%/ffitarget.h include; make; find .;)" 177if errorlevel 1 exit /B %ERRORLEVEL% 178 179REM Tests are not needed to produce artifacts 180if "%LIBFFI_TEST%" EQU "1" ( 181 echo "Running tests..." 182 %SH% -lc "(cd $OLDPWD; export PATH=/usr/bin:$PATH; cp `find $PWD -name 'libffi-?.dll'` $HOST/testsuite/; make check; cat `find ./ -name libffi.log`)" 183) else ( 184 echo "Not running tests" 185) 186 187 188echo copying files to %_LIBFFI_OUT% 189if not exist %_LIBFFI_OUT%\include (md %_LIBFFI_OUT%\include) 190copy %ARTIFACTS%\.libs\libffi-*.dll %_LIBFFI_OUT% || exit /B 1 191copy %ARTIFACTS%\.libs\libffi-*.lib %_LIBFFI_OUT% || exit /B 1 192copy %ARTIFACTS%\.libs\libffi-*.pdb %_LIBFFI_OUT% 193copy %ARTIFACTS%\fficonfig.h %_LIBFFI_OUT%\include || exit /B 1 194copy %ARTIFACTS%\include\*.h %_LIBFFI_OUT%\include || exit /B 1 195 196endlocal 197exit /b 198 199:InstallCygwin 200setlocal 201 202if NOT DEFINED CYG_ROOT (set CYG_ROOT=c:/cygwin) 203if NOT DEFINED CYG_CACHE (set CYG_CACHE=C:/cygwin/var/cache/setup) 204if NOT DEFINED CYG_MIRROR (set CYG_MIRROR=http://mirrors.kernel.org/sourceware/cygwin/) 205 206powershell -c "md $env:CYG_ROOT -ErrorAction SilentlyContinue" 207powershell -c "$setup = $env:CYG_ROOT+'/setup.exe'; if (!(Test-Path $setup)){invoke-webrequest https://cygwin.com/setup-x86.exe -outfile $setup} 208%CYG_ROOT%/setup.exe -qnNdO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_CACHE%" -P make -P autoconf -P automake -P libtool -P dejagnu 209 210endlocal 211exit /b 212 213