# Copyright 2021 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Build libffi for Windows x86_64 using MSVC. # project(libffi LANGUAGES C ASM_MASM) cmake_minimum_required(VERSION 3.18.1) set(src ${CMAKE_CURRENT_SOURCE_DIR}) set(out ${CMAKE_CURRENT_BINARY_DIR}) set(TARGET X86_WIN64) set(HAVE_LONG_DOUBLE 0) set(FFI_EXEC_TRAMPOLINE_TABLE 0) configure_file(include/ffi.h.in ${out}/ffi.h @ONLY) add_library(libffi SHARED src/prep_cif.c src/types.c src/raw_api.c src/java_raw_api.c src/closures.c src/x86/ffiw64.c ${out}/win64_intel.asm ) configure_file(src/x86/ffitarget.h ${out}/dist/include/ffitarget.h COPYONLY) configure_file(${out}/ffi.h ${out}/dist/include/ffi.h COPYONLY) set(defines -DHAVE_CONFIG_H=1 -DFFI_BUILDING_DLL=1 ) set(include_dirs ${src}/include ${src}/windows-msvc-x86_64 ${src}/src/x86 ${out} ) target_compile_definitions(libffi PRIVATE ${defines}) target_include_directories(libffi PUBLIC ${include_dirs}) list(TRANSFORM include_dirs PREPEND -I OUTPUT_VARIABLE include_dir_args) # Preprocess this .S file before assembling it with ml64. It's not clear to me whether CMake is # supposed to support this inherently. The msvc_build/aarch64/Ffi_staticLib.vcxproj project also # uses a CustomBuild step. This step won't rebuild if an included file changes, which might be # fixable (someday), perhaps using the DEPFILE argument to add_custom_command. add_custom_command( OUTPUT ${out}/win64_intel.asm COMMAND cl /EP ${src}/src/x86/win64_intel.S ${defines} ${include_dir_args} >${out}/win64_intel.asm DEPENDS src/x86/win64_intel.S ${out}/ffi.h )