diff options
author | Oscar Fuentes <ofv@wanadoo.es> | 2011-01-21 15:42:54 +0000 |
---|---|---|
committer | Oscar Fuentes <ofv@wanadoo.es> | 2011-01-21 15:42:54 +0000 |
commit | 596937914548c181f2504aad3b709189e87a561b (patch) | |
tree | 6801a4e7f8ae8442350c025c6523fa6f60a091e8 | |
parent | 030160073d8ec7d5fc1d928d9c8b6173d3a5e0cc (diff) | |
download | external_llvm-596937914548c181f2504aad3b709189e87a561b.zip external_llvm-596937914548c181f2504aad3b709189e87a561b.tar.gz external_llvm-596937914548c181f2504aad3b709189e87a561b.tar.bz2 |
Handles libffi on the CMake build.
Patch by arrowdodger!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123976 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | CMakeLists.txt | 4 | ||||
-rwxr-xr-x | cmake/config-ix.cmake | 29 | ||||
-rw-r--r-- | docs/CMake.html | 6 | ||||
-rw-r--r-- | include/llvm/Config/config.h.cmake | 6 | ||||
-rw-r--r-- | lib/ExecutionEngine/Interpreter/CMakeLists.txt | 16 |
5 files changed, 58 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 52f0a58..9878c79 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,6 +114,10 @@ if(LLVM_ENABLE_TIMESTAMPS) set(ENABLE_TIMESTAMPS 1) endif() +option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF) +set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so") +set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h") + set(C_INCLUDE_DIRS "" CACHE STRING "Colon separated list of directories clang will search for headers.") diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake index e19cb34..4a87a23 100755 --- a/cmake/config-ix.cmake +++ b/cmake/config-ix.cmake @@ -190,6 +190,35 @@ llvm_find_program(fdp) llvm_find_program(dot) llvm_find_program(dotty) +if( LLVM_ENABLE_FFI ) + find_path(FFI_INCLUDE_PATH ffi.h PATHS ${FFI_INCLUDE_DIR}) + if( FFI_INCLUDE_PATH ) + set(FFI_HEADER ffi.h CACHE INTERNAL "") + set(HAVE_FFI_H 1 CACHE INTERNAL "") + else() + find_path(FFI_INCLUDE_PATH ffi/ffi.h PATHS ${FFI_INCLUDE_DIR}) + if( FFI_INCLUDE_PATH ) + set(FFI_HEADER ffi/ffi.h CACHE INTERNAL "") + set(HAVE_FFI_FFI_H 1 CACHE INTERNAL "") + endif() + endif() + + if( NOT FFI_HEADER ) + message(FATAL_ERROR "libffi includes are not found.") + endif() + + find_library(FFI_LIBRARY_PATH ffi PATHS ${FFI_LIBRARY_DIR}) + if( NOT FFI_LIBRARY_PATH ) + message(FATAL_ERROR "libffi is not found.") + endif() + + list(APPEND CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARY_PATH}) + list(APPEND CMAKE_REQUIRED_INCLUDES ${FFI_INCLUDE_PATH}) + check_symbol_exists(ffi_call ${FFI_HEADER} HAVE_FFI_CALL) + list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES ${FFI_INCLUDE_PATH}) + list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARY_PATH}) +endif( LLVM_ENABLE_FFI ) + # Define LLVM_MULTITHREADED if gcc atomic builtins exists. include(CheckAtomic) diff --git a/docs/CMake.html b/docs/CMake.html index 0bafedd..fc729af 100644 --- a/docs/CMake.html +++ b/docs/CMake.html @@ -338,6 +338,12 @@ By default, <tt>"-sv --no-progress-bar"</tt> on Visual C++ and Xcode, <tt>"-sv"</tt> on others.</dd> + + <dt><b>LLVM_ENABLE_FFI</b>:BOOL</dt> + <dd>Indicates whether LLVM Interpreter will be linked with Foreign + Function Interface library. If the library or its headers are + installed on a custom location, you can set the variables + FFI_INCLUDE_DIR and FFI_LIBRARY_DIR. Defaults to OFF.</dd> </dl> </div> diff --git a/include/llvm/Config/config.h.cmake b/include/llvm/Config/config.h.cmake index 16270ff..e017dd9 100644 --- a/include/llvm/Config/config.h.cmake +++ b/include/llvm/Config/config.h.cmake @@ -130,13 +130,13 @@ #cmakedefine HAVE_FENV_H ${HAVE_FENV_H} /* Define if libffi is available on this platform. */ -#undef HAVE_FFI_CALL +#cmakedefine HAVE_FFI_CALL ${HAVE_FFI_CALL} /* Define to 1 if you have the <ffi/ffi.h> header file. */ -#undef HAVE_FFI_FFI_H +#cmakedefine HAVE_FFI_FFI_H ${HAVE_FFI_FFI_H} /* Define to 1 if you have the <ffi.h> header file. */ -#undef HAVE_FFI_H +#cmakedefine HAVE_FFI_H ${HAVE_FFI_H} /* Set to 1 if the finite function is found in <ieeefp.h> */ #cmakedefine HAVE_FINITE_IN_IEEEFP_H ${HAVE_FINITE_IN_IEEEFP_H} diff --git a/lib/ExecutionEngine/Interpreter/CMakeLists.txt b/lib/ExecutionEngine/Interpreter/CMakeLists.txt index dff97fa..39df555 100644 --- a/lib/ExecutionEngine/Interpreter/CMakeLists.txt +++ b/lib/ExecutionEngine/Interpreter/CMakeLists.txt @@ -1,5 +1,21 @@ +# If the user required a custom path for ffi headers, use it on its +# abolute form (see config-ix.cmake): +if( FFI_INCLUDE_DIR ) + include_directories( ${FFI_INCLUDE_PATH} ) +endif() + +# If the user required a custom path for libffi, use it on its abolute +# form (see config-ix.cmake): +if( FFI_LIBRARY_DIR ) + link_directories( ${FFI_LIBRARY_PATH} ) +endif() + add_llvm_library(LLVMInterpreter Execution.cpp ExternalFunctions.cpp Interpreter.cpp ) + +if( LLVM_ENABLE_FFI ) + target_link_libraries( LLVMInterpreter ffi ) +endif() |