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