aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt68
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
+)