xref: /aosp_15_r20/external/libffi/CMakeLists.txt (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
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