-
Notifications
You must be signed in to change notification settings - Fork 230
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
simplified finding libffi and its version
- Loading branch information
Showing
5 changed files
with
50 additions
and
76 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,81 +1,57 @@ | ||
# Attempts to discover ffi library with a linkable ffi_call function. | ||
# See https://sourceware.org/libffi/ | ||
# | ||
# Example usage: | ||
# This module defines an imported target FFI:ffi when called: | ||
# find_package(FFI) | ||
# FFI_ROOT may be set to define search paths for the ffi library. | ||
# | ||
# find_package(FFI) | ||
# Once done this will define | ||
# | ||
# FFI_REQUIRE_INCLUDE may be set to consider ffi found if the includes | ||
# are present in addition to the library. This is useful to keep off | ||
# for the imported package on platforms that install the library but | ||
# not the headers. | ||
# | ||
# FFI_LIBRARY_DIR may be set to define search paths for the ffi library. | ||
# | ||
# If successful, the following variables will be defined: | ||
# FFI_FOUND | ||
# FFI_INCLUDE_DIRS | ||
# FFI_LIBRARIES | ||
# HAVE_FFI_CALL | ||
# | ||
# HAVE_FFI_H or HAVE_FFI_FFI_H is defined depending on the ffi.h include path. | ||
# | ||
# Additionally, the following import target will be defined: | ||
# FFI::ffi | ||
# FFI_FOUND - system has the FFI library with correct version | ||
# FFI_INCLUDE_DIRS - the FFI include directory | ||
# FFI_LIBRARIES - the FFI library | ||
# FFI_VERSION - FFI version | ||
# HAVE_FFI_CALL - whether ffi_call is linkable | ||
|
||
find_path(FFI_INCLUDE_DIRS ffi.h PATHS ${FFI_INCLUDE_DIR}) | ||
if( EXISTS "${FFI_INCLUDE_DIRS}/ffi.h" ) | ||
set(FFI_HEADER ffi.h CACHE INTERNAL "") | ||
set(HAVE_FFI_H 1 CACHE INTERNAL "") | ||
else() | ||
find_path(FFI_INCLUDE_DIRS ffi/ffi.h PATHS ${FFI_INCLUDE_DIR}) | ||
if( EXISTS "${FFI_INCLUDE_DIRS}/ffi/ffi.h" ) | ||
set(FFI_HEADER ffi/ffi.h CACHE INTERNAL "") | ||
set(HAVE_FFI_FFI_H 1 CACHE INTERNAL "") | ||
if(NOT FFI_FOUND) | ||
# First look for hints through pkg-config | ||
find_package(PkgConfig QUIET) | ||
if(PKG_CONFIG_FOUND) | ||
pkg_check_modules(FFI QUIET libffi) | ||
endif() | ||
endif() | ||
unset(FFI_INCLUDE_DIRS CACHE) | ||
unset(FFI_LIBRARIES CACHE) | ||
|
||
find_library(FFI_LIBRARIES ffi PATHS ${FFI_LIBRARY_DIR}) | ||
# Then find the paths using CMake routines | ||
find_path(FFI_INCLUDE_DIRS ffi.h HINTS ${FFI_INCLUDEDIR}) | ||
find_library(FFI_LIBRARIES ffi HINTS ${FFI_LIBDIR}) | ||
|
||
if(FFI_LIBRARIES) | ||
include(CMakePushCheckState) | ||
include(CheckCSourceCompiles) | ||
cmake_push_check_state() | ||
list(APPEND CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARIES}) | ||
check_c_source_compiles(" | ||
struct ffi_cif; | ||
typedef struct ffi_cif ffi_cif; | ||
void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); | ||
int main() { ffi_call(0, 0, 0, 0); }" | ||
HAVE_FFI_CALL) | ||
cmake_pop_check_state() | ||
endif() | ||
# Ensure that ffi_call is linkable | ||
if(FFI_LIBRARIES) | ||
include(CMakePushCheckState) | ||
include(CheckCSourceCompiles) | ||
cmake_push_check_state() | ||
list(APPEND CMAKE_REQUIRED_INCLUDES "${FFI_INCLUDE_DIRS}") | ||
list(APPEND CMAKE_REQUIRED_LIBRARIES "${FFI_LIBRARIES}") | ||
check_c_source_compiles([[struct ffi_cif; | ||
typedef struct ffi_cif ffi_cif; | ||
void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); | ||
int main() { ffi_call(0, 0, 0, 0); }]] HAVE_FFI_CALL) | ||
cmake_pop_check_state() | ||
endif() | ||
|
||
unset(required_includes) | ||
if(FFI_REQUIRE_INCLUDE) | ||
set(required_includes FFI_INCLUDE_DIRS) | ||
endif() | ||
if(NOT FFI_VERSION) | ||
set(FFI_VERSION "version not specified") | ||
endif() | ||
|
||
include(FindPackageHandleStandardArgs) | ||
find_package_handle_standard_args(FFI | ||
FOUND_VAR | ||
FFI_FOUND | ||
REQUIRED_VARS | ||
FFI_LIBRARIES | ||
${required_includes} | ||
HAVE_FFI_CALL) | ||
mark_as_advanced(FFI_LIBRARIES | ||
FFI_INCLUDE_DIRS | ||
HAVE_FFI_CALL | ||
FFI_HEADER | ||
HAVE_FFI_H | ||
HAVE_FFI_FFI_H) | ||
include(FindPackageHandleStandardArgs) | ||
find_package_handle_standard_args(FFI DEFAULT_MSG FFI_INCLUDE_DIRS FFI_LIBRARIES HAVE_FFI_CALL) | ||
|
||
mark_as_advanced(FFI_LIBRARIES FFI_INCLUDE_DIRS FFI_LIBRARIES HAVE_FFI_CALL) | ||
endif() | ||
|
||
if(FFI_FOUND) | ||
if(NOT TARGET FFI::ffi) | ||
add_library(FFI::ffi UNKNOWN IMPORTED) | ||
set_target_properties(FFI::ffi PROPERTIES IMPORTED_LOCATION "${FFI_LIBRARIES}") | ||
if(FFI_INCLUDE_DIRS) | ||
set_target_properties(FFI::ffi PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFI_INCLUDE_DIRS}") | ||
endif() | ||
endif() | ||
add_library(FFI::ffi UNKNOWN IMPORTED) | ||
set_target_properties(FFI::ffi PROPERTIES IMPORTED_LOCATION "${FFI_LIBRARIES}") | ||
set_target_properties(FFI::ffi PROPERTIES INTERFACE_INCLUDE_DIRSECTORIES "${FFI_INCLUDE_DIRS}") | ||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters