xref: /aosp_15_r20/external/sandboxed-api/cmake/libffi.cmake (revision ec63e07ab9515d95e79c211197c445ef84cefa6a)
1*ec63e07aSXin Li# Copyright 2020 Google LLC
2*ec63e07aSXin Li#
3*ec63e07aSXin Li# Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li# you may not use this file except in compliance with the License.
5*ec63e07aSXin Li# You may obtain a copy of the License at
6*ec63e07aSXin Li#
7*ec63e07aSXin Li#     https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li#
9*ec63e07aSXin Li# Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li# distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li# See the License for the specific language governing permissions and
13*ec63e07aSXin Li# limitations under the License.
14*ec63e07aSXin Li
15*ec63e07aSXin LiFetchContent_Declare(libffi
16*ec63e07aSXin Li  URL      https://github.com/libffi/libffi/releases/download/v3.3-rc2/libffi-3.3-rc2.tar.gz
17*ec63e07aSXin Li  URL_HASH SHA256=653ffdfc67fbb865f39c7e5df2a071c0beb17206ebfb0a9ecb18a18f63f6b263
18*ec63e07aSXin Li)
19*ec63e07aSXin LiFetchContent_GetProperties(libffi)
20*ec63e07aSXin Liif(NOT libffi_POPULATED)
21*ec63e07aSXin Li  FetchContent_Populate(libffi)
22*ec63e07aSXin Li  set(libffi_STATUS_FILE "${libffi_SOURCE_DIR}/config.status")
23*ec63e07aSXin Li  if(EXISTS "${libffi_STATUS_FILE}")
24*ec63e07aSXin Li    file(SHA256 "${libffi_STATUS_FILE}" _sapi_CONFIG_STATUS)
25*ec63e07aSXin Li  endif()
26*ec63e07aSXin Li  if(NOT _sapi_CONFIG_STATUS STREQUAL "${libffi_CONFIG_STATUS}")
27*ec63e07aSXin Li    message("-- Running ./configure for libffi...")
28*ec63e07aSXin Li    execute_process(
29*ec63e07aSXin Li      COMMAND ./configure --disable-dependency-tracking
30*ec63e07aSXin Li                          --disable-builddir
31*ec63e07aSXin Li                          --quiet
32*ec63e07aSXin Li      WORKING_DIRECTORY "${libffi_SOURCE_DIR}"
33*ec63e07aSXin Li      RESULT_VARIABLE _sapi_libffi_config_result
34*ec63e07aSXin Li    )
35*ec63e07aSXin Li    if(NOT _sapi_libffi_config_result EQUAL "0")
36*ec63e07aSXin Li      message(FATAL_ERROR "Configuration of libffi dependency failed")
37*ec63e07aSXin Li    endif()
38*ec63e07aSXin Li    file(SHA256 "${libffi_SOURCE_DIR}/config.status" _sapi_CONFIG_STATUS)
39*ec63e07aSXin Li    set(libffi_CONFIG_STATUS "${_sapi_CONFIG_STATUS}" CACHE INTERNAL "")
40*ec63e07aSXin Li  endif()
41*ec63e07aSXin Liendif()
42*ec63e07aSXin Li
43*ec63e07aSXin Liset(libffi_INCLUDE_DIR ${libffi_SOURCE_DIR}/libffi/include)
44*ec63e07aSXin Li
45*ec63e07aSXin Liif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
46*ec63e07aSXin Li  list(APPEND _ffi_platform_srcs
47*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/x86/asmnames.h
48*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/x86/ffi.c
49*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/x86/ffi64.c
50*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/x86/ffiw64.c
51*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/x86/internal.h
52*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/x86/internal64.h
53*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/x86/sysv.S
54*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/x86/unix64.S
55*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/x86/win64.S
56*ec63e07aSXin Li  )
57*ec63e07aSXin Lielseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64")
58*ec63e07aSXin Li  list(APPEND _ffi_platform_srcs
59*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/powerpc/ffi.c
60*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/powerpc/ffi_linux64.c
61*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/powerpc/ffi_sysv.c
62*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/powerpc/linux64.S
63*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/powerpc/linux64_closure.S
64*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/powerpc/ppc_closure.S
65*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/powerpc/sysv.S
66*ec63e07aSXin Li    # Textual headers
67*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/powerpc/ffi_powerpc.h
68*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/powerpc/asm.h
69*ec63e07aSXin Li  )
70*ec63e07aSXin Lielseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
71*ec63e07aSXin Li  list(APPEND _ffi_platform_srcs
72*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/aarch64/ffi.c
73*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/aarch64/internal.h
74*ec63e07aSXin Li    ${libffi_SOURCE_DIR}/src/aarch64/sysv.S
75*ec63e07aSXin Li  )
76*ec63e07aSXin Liendif()
77*ec63e07aSXin Li
78*ec63e07aSXin Liadd_library(ffi STATIC
79*ec63e07aSXin Li  ${libffi_SOURCE_DIR}/fficonfig.h
80*ec63e07aSXin Li  ${libffi_SOURCE_DIR}/include/ffi.h
81*ec63e07aSXin Li  ${libffi_SOURCE_DIR}/include/ffi_cfi.h
82*ec63e07aSXin Li  ${libffi_SOURCE_DIR}/include/ffi_common.h
83*ec63e07aSXin Li  ${libffi_SOURCE_DIR}/include/ffitarget.h
84*ec63e07aSXin Li  ${libffi_SOURCE_DIR}/src/closures.c
85*ec63e07aSXin Li  ${libffi_SOURCE_DIR}/src/debug.c
86*ec63e07aSXin Li  ${libffi_SOURCE_DIR}/src/java_raw_api.c
87*ec63e07aSXin Li  ${libffi_SOURCE_DIR}/src/prep_cif.c
88*ec63e07aSXin Li  ${libffi_SOURCE_DIR}/src/raw_api.c
89*ec63e07aSXin Li  ${libffi_SOURCE_DIR}/src/types.c
90*ec63e07aSXin Li  ${_ffi_platform_srcs}
91*ec63e07aSXin Li)
92*ec63e07aSXin Liadd_library(libffi::libffi ALIAS ffi)
93*ec63e07aSXin Litarget_include_directories(ffi PUBLIC
94*ec63e07aSXin Li  ${libffi_SOURCE_DIR}
95*ec63e07aSXin Li  ${libffi_SOURCE_DIR}/include
96*ec63e07aSXin Li)
97*ec63e07aSXin Litarget_compile_options(ffi PRIVATE
98*ec63e07aSXin Li  -Wno-vla
99*ec63e07aSXin Li  -Wno-unused-result
100*ec63e07aSXin Li)
101*ec63e07aSXin Litarget_link_libraries(ffi PRIVATE
102*ec63e07aSXin Li  sapi::base
103*ec63e07aSXin Li)
104