1*1fd5a2e1SPrashanth Swaminathan# Copyright 2021 The Android Open Source Project 2*1fd5a2e1SPrashanth Swaminathan# 3*1fd5a2e1SPrashanth Swaminathan# Licensed under the Apache License, Version 2.0 (the "License"); 4*1fd5a2e1SPrashanth Swaminathan# you may not use this file except in compliance with the License. 5*1fd5a2e1SPrashanth Swaminathan# You may obtain a copy of the License at 6*1fd5a2e1SPrashanth Swaminathan# 7*1fd5a2e1SPrashanth Swaminathan# http://www.apache.org/licenses/LICENSE-2.0 8*1fd5a2e1SPrashanth Swaminathan# 9*1fd5a2e1SPrashanth Swaminathan# Unless required by applicable law or agreed to in writing, software 10*1fd5a2e1SPrashanth Swaminathan# distributed under the License is distributed on an "AS IS" BASIS, 11*1fd5a2e1SPrashanth Swaminathan# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*1fd5a2e1SPrashanth Swaminathan# See the License for the specific language governing permissions and 13*1fd5a2e1SPrashanth Swaminathan# limitations under the License. 14*1fd5a2e1SPrashanth Swaminathan 15*1fd5a2e1SPrashanth Swaminathan# 16*1fd5a2e1SPrashanth Swaminathan# Build libffi for Windows x86_64 using MSVC. 17*1fd5a2e1SPrashanth Swaminathan# 18*1fd5a2e1SPrashanth Swaminathan 19*1fd5a2e1SPrashanth Swaminathanproject(libffi LANGUAGES C ASM_MASM) 20*1fd5a2e1SPrashanth Swaminathancmake_minimum_required(VERSION 3.18.1) 21*1fd5a2e1SPrashanth Swaminathan 22*1fd5a2e1SPrashanth Swaminathanset(src ${CMAKE_CURRENT_SOURCE_DIR}) 23*1fd5a2e1SPrashanth Swaminathanset(out ${CMAKE_CURRENT_BINARY_DIR}) 24*1fd5a2e1SPrashanth Swaminathan 25*1fd5a2e1SPrashanth Swaminathanset(TARGET X86_WIN64) 26*1fd5a2e1SPrashanth Swaminathanset(HAVE_LONG_DOUBLE 0) 27*1fd5a2e1SPrashanth Swaminathanset(FFI_EXEC_TRAMPOLINE_TABLE 0) 28*1fd5a2e1SPrashanth Swaminathanconfigure_file(include/ffi.h.in ${out}/ffi.h @ONLY) 29*1fd5a2e1SPrashanth Swaminathan 30*1fd5a2e1SPrashanth Swaminathanadd_library(libffi SHARED 31*1fd5a2e1SPrashanth Swaminathan src/prep_cif.c 32*1fd5a2e1SPrashanth Swaminathan src/types.c 33*1fd5a2e1SPrashanth Swaminathan src/raw_api.c 34*1fd5a2e1SPrashanth Swaminathan src/java_raw_api.c 35*1fd5a2e1SPrashanth Swaminathan src/closures.c 36*1fd5a2e1SPrashanth Swaminathan src/x86/ffiw64.c 37*1fd5a2e1SPrashanth Swaminathan ${out}/win64_intel.asm 38*1fd5a2e1SPrashanth Swaminathan) 39*1fd5a2e1SPrashanth Swaminathan 40*1fd5a2e1SPrashanth Swaminathanconfigure_file(src/x86/ffitarget.h ${out}/dist/include/ffitarget.h COPYONLY) 41*1fd5a2e1SPrashanth Swaminathanconfigure_file(${out}/ffi.h ${out}/dist/include/ffi.h COPYONLY) 42*1fd5a2e1SPrashanth Swaminathan 43*1fd5a2e1SPrashanth Swaminathanset(defines 44*1fd5a2e1SPrashanth Swaminathan -DHAVE_CONFIG_H=1 45*1fd5a2e1SPrashanth Swaminathan -DFFI_BUILDING_DLL=1 46*1fd5a2e1SPrashanth Swaminathan) 47*1fd5a2e1SPrashanth Swaminathan 48*1fd5a2e1SPrashanth Swaminathanset(include_dirs 49*1fd5a2e1SPrashanth Swaminathan ${src}/include 50*1fd5a2e1SPrashanth Swaminathan ${src}/windows-msvc-x86_64 51*1fd5a2e1SPrashanth Swaminathan ${src}/src/x86 52*1fd5a2e1SPrashanth Swaminathan ${out} 53*1fd5a2e1SPrashanth Swaminathan) 54*1fd5a2e1SPrashanth Swaminathan 55*1fd5a2e1SPrashanth Swaminathantarget_compile_definitions(libffi PRIVATE ${defines}) 56*1fd5a2e1SPrashanth Swaminathantarget_include_directories(libffi PUBLIC ${include_dirs}) 57*1fd5a2e1SPrashanth Swaminathan 58*1fd5a2e1SPrashanth Swaminathanlist(TRANSFORM include_dirs PREPEND -I OUTPUT_VARIABLE include_dir_args) 59*1fd5a2e1SPrashanth Swaminathan 60*1fd5a2e1SPrashanth Swaminathan# Preprocess this .S file before assembling it with ml64. It's not clear to me whether CMake is 61*1fd5a2e1SPrashanth Swaminathan# supposed to support this inherently. The msvc_build/aarch64/Ffi_staticLib.vcxproj project also 62*1fd5a2e1SPrashanth Swaminathan# uses a CustomBuild step. This step won't rebuild if an included file changes, which might be 63*1fd5a2e1SPrashanth Swaminathan# fixable (someday), perhaps using the DEPFILE argument to add_custom_command. 64*1fd5a2e1SPrashanth Swaminathanadd_custom_command( 65*1fd5a2e1SPrashanth Swaminathan OUTPUT ${out}/win64_intel.asm 66*1fd5a2e1SPrashanth Swaminathan COMMAND cl /EP ${src}/src/x86/win64_intel.S ${defines} ${include_dir_args} >${out}/win64_intel.asm 67*1fd5a2e1SPrashanth Swaminathan DEPENDS src/x86/win64_intel.S ${out}/ffi.h 68*1fd5a2e1SPrashanth Swaminathan) 69