From 0772d71264f76130df45734f70f15bc424cce2bd Mon Sep 17 00:00:00 2001 From: Christian Blichmann Date: Sun, 22 Mar 2020 16:44:39 +0100 Subject: [PATCH] Download libffi at CMake config time (fixes #35) Drive-by: - Make Bazel config action more robust - Disable dependency tracking in libunwind configure Signed-off-by: Christian Blichmann --- cmake/SapiDeps.cmake | 8 ++- cmake/SapiOptions.cmake | 1 - cmake/libffi/CMakeLists.txt.in | 30 ++++++++++++ cmake/libffi/Download.cmake | 73 ++++++++++++++++++++++++++++ cmake/libunwind/CMakeLists.txt.in | 1 + sandboxed_api/bazel/repositories.bzl | 2 +- 6 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 cmake/libffi/CMakeLists.txt.in create mode 100644 cmake/libffi/Download.cmake diff --git a/cmake/SapiDeps.cmake b/cmake/SapiDeps.cmake index baf141c..461825b 100644 --- a/cmake/SapiDeps.cmake +++ b/cmake/SapiDeps.cmake @@ -49,6 +49,13 @@ else() find_package(Libcap REQUIRED) endif() +if(SAPI_DOWNLOAD_LIBFFI) + include(cmake/libffi/Download.cmake) + check_target(libffi::libffi) +else() + find_package(Libffi REQUIRED) +endif() + if(SAPI_DOWNLOAD_LIBUNWIND) include(cmake/libunwind/Download.cmake) endif() @@ -73,7 +80,6 @@ else() find_package(Protobuf REQUIRED) endif() -find_package(Libffi REQUIRED) if(SAPI_ENABLE_EXAMPLES) find_package(ZLIB REQUIRED) endif() diff --git a/cmake/SapiOptions.cmake b/cmake/SapiOptions.cmake index acd35f9..4e93d58 100644 --- a/cmake/SapiOptions.cmake +++ b/cmake/SapiOptions.cmake @@ -27,7 +27,6 @@ option(SAPI_DOWNLOAD_GLOG "Download glog at config time" ON) option(SAPI_DOWNLOAD_PROTOBUF "Download protobuf at config time" ON) option(SAPI_DOWNLOAD_LIBUNWIND "Download libunwind at config time" ON) option(SAPI_DOWNLOAD_LIBCAP "Download libcap at config time" ON) -# TODO(cblichmann): Not currently implemented option(SAPI_DOWNLOAD_LIBFFI "Download libffi at config time" ON) option(SAPI_ENABLE_EXAMPLES "Build example code" ON) diff --git a/cmake/libffi/CMakeLists.txt.in b/cmake/libffi/CMakeLists.txt.in new file mode 100644 index 0000000..cb0aec1 --- /dev/null +++ b/cmake/libffi/CMakeLists.txt.in @@ -0,0 +1,30 @@ +# Copyright 2020 Google LLC +# +# 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. + +cmake_minimum_required(VERSION 3.12) +project(libffi-download NONE) + +include(ExternalProject) +ExternalProject_Add(libffi + URL https://github.com/libffi/libffi/releases/download/v3.3-rc2/libffi-3.3-rc2.tar.gz + URL_HASH SHA256=653ffdfc67fbb865f39c7e5df2a071c0beb17206ebfb0a9ecb18a18f63f6b263 # 2019-11-02 + SOURCE_DIR "${CMAKE_BINARY_DIR}/libffi-src" + CONFIGURE_COMMAND sh -c "./configure \ + --disable-dependency-tracking \ + && (mv -t configure-cmake-gen `sh config.guess` || true)" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" + BUILD_IN_SOURCE TRUE +) diff --git a/cmake/libffi/Download.cmake b/cmake/libffi/Download.cmake new file mode 100644 index 0000000..77eb32b --- /dev/null +++ b/cmake/libffi/Download.cmake @@ -0,0 +1,73 @@ +# Copyright 2020 Google LLC +# +# 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. + +# Downloads and unpacks libunwind at configure time + +set(workdir "${CMAKE_BINARY_DIR}/libffi-download") + +configure_file("${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt.in" + "${workdir}/CMakeLists.txt") +execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . + RESULT_VARIABLE error + WORKING_DIRECTORY "${workdir}") +if(error) + message(FATAL_ERROR "CMake step for ${PROJECT_NAME} failed: ${error}") +endif() + +execute_process(COMMAND ${CMAKE_COMMAND} --build . + RESULT_VARIABLE error + WORKING_DIRECTORY "${workdir}") +if(error) + message(FATAL_ERROR "Build step for ${PROJECT_NAME} failed: ${error}") +endif() + +set(_ffi_src "${CMAKE_BINARY_DIR}/libffi-src") + +set(libffi_INCLUDE_DIR ${_ffi_src}/libffi/include) + +add_library(ffi STATIC + ${_ffi_src}/configure-cmake-gen/fficonfig.h + ${_ffi_src}/configure-cmake-gen/include/ffi.h + ${_ffi_src}/configure-cmake-gen/include/ffitarget.h + ${_ffi_src}/include/ffi_cfi.h + ${_ffi_src}/include/ffi_common.h + ${_ffi_src}/src/closures.c + ${_ffi_src}/src/debug.c + ${_ffi_src}/src/java_raw_api.c + ${_ffi_src}/src/prep_cif.c + ${_ffi_src}/src/raw_api.c + ${_ffi_src}/src/types.c + ${_ffi_src}/src/x86/asmnames.h + ${_ffi_src}/src/x86/ffi.c + ${_ffi_src}/src/x86/ffi64.c + ${_ffi_src}/src/x86/ffiw64.c + ${_ffi_src}/src/x86/internal.h + ${_ffi_src}/src/x86/internal64.h + ${_ffi_src}/src/x86/sysv.S + ${_ffi_src}/src/x86/unix64.S + ${_ffi_src}/src/x86/win64.S +) +add_library(libffi::libffi ALIAS ffi) +target_include_directories(ffi PUBLIC + ${_ffi_src}/configure-cmake-gen + ${_ffi_src}/configure-cmake-gen/include + ${_ffi_src}/include +) +target_compile_options(ffi PRIVATE + -Wno-vla + -Wno-unused-result +) +target_link_libraries(ffi PRIVATE + sapi::base +) diff --git a/cmake/libunwind/CMakeLists.txt.in b/cmake/libunwind/CMakeLists.txt.in index c73db8e..3a5f2ff 100644 --- a/cmake/libunwind/CMakeLists.txt.in +++ b/cmake/libunwind/CMakeLists.txt.in @@ -21,6 +21,7 @@ ExternalProject_Add(libunwind URL_HASH SHA256=3f3ecb90e28cbe53fba7a4a27ccce7aad188d3210bb1964a923a731a27a75acb SOURCE_DIR "${CMAKE_BINARY_DIR}/libunwind-src" CONFIGURE_COMMAND ./configure + --disable-dependency-tracking --disable-documentation --disable-minidebuginfo --disable-shared diff --git a/sandboxed_api/bazel/repositories.bzl b/sandboxed_api/bazel/repositories.bzl index 9114928..74b6452 100644 --- a/sandboxed_api/bazel/repositories.bzl +++ b/sandboxed_api/bazel/repositories.bzl @@ -23,7 +23,7 @@ def _configure(ctx): ctx.execute( [bash_exe, "-c", """ ./configure --disable-dependency-tracking {args} - mv $(. config.guess) configure-bazel-gen || true + mv -t configure-bazel-gen $(. config.guess) || true """.format(args = " ".join(ctx.attr.configure_args))], quiet = ctx.attr.quiet, )