diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..41239f0b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,68 @@ +# 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 +) |