diff --git a/.travis.yml b/.travis.yml index 2c86856b..23ea9658 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,7 @@ env: cache: ccache: true directories: - - deps + - $TRAVIS_BUILD_DIR/deps script: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then scripts/install_cmake.sh; fi diff --git a/CMakeLists.txt b/CMakeLists.txt index 7cf17b48..a02c577d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0.0) +cmake_minimum_required(VERSION 3.4.0) cmake_policy(SET CMP0042 OLD) # Fix MACOSX_RPATH. cmake_policy(SET CMP0048 NEW) # Allow VERSION argument in project(). @@ -8,6 +8,8 @@ endif() project(EVMJIT VERSION 0.9.0.2 LANGUAGES CXX C) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") + message(STATUS "EVM JIT ${EVMJIT_VERSION_MAJOR}.${EVMJIT_VERSION_MINOR}.${EVMJIT_VERSION_PATCH}") if (NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64|AMD64") @@ -38,8 +40,8 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT SANITIZE) set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined") endif() -include(cmake/llvm.cmake) -configure_llvm_project(llvm) +include(ProjectLLVM) +configure_llvm_project() add_subdirectory(libevmjit) diff --git a/appveyor.yml b/appveyor.yml index ef663313..77b16c78 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,8 +6,7 @@ configuration: - Debug - Release cache: - - build/deps/downloads - - build/deps/llvm -> cmake/llvm.cmake + - deps -> cmake/ProjectLLVM.cmake before_build: | if not exist build mkdir build cd build diff --git a/cmake/llvm.cmake b/cmake/ProjectLLVM.cmake similarity index 83% rename from cmake/llvm.cmake rename to cmake/ProjectLLVM.cmake index 44d9ffef..7b0b3a5e 100644 --- a/cmake/llvm.cmake +++ b/cmake/ProjectLLVM.cmake @@ -8,7 +8,7 @@ # by find_package(... CONFIG) function. # # Creates a target representing all required LLVM libraries and include path. -function(configure_llvm_project TARGET_NAME) +function(configure_llvm_project) if (LLVM_DIR) find_package(LLVM REQUIRED CONFIG) llvm_map_components_to_libnames(LIBS mcjit ipo x86codegen) @@ -59,16 +59,13 @@ function(configure_llvm_project TARGET_NAME) set(BUILD_COMMAND cmake --build --config Release) endif() - set(DEPS_DIR ${CMAKE_SOURCE_DIR}/deps) - include(ExternalProject) - ExternalProject_Add(llvm-project - PREFIX ${DEPS_DIR}/llvm - DOWNLOAD_DIR ${DEPS_DIR}/downloads - DOWNLOAD_NO_PROGRESS 1 - BINARY_DIR ${DEPS_DIR}/llvm # Build directly to install dir to avoid copy. + ExternalProject_Add(llvm + PREFIX ${CMAKE_SOURCE_DIR}/deps URL http://llvm.org/releases/3.9.1/llvm-3.9.1.src.tar.xz URL_HASH SHA256=1fd90354b9cf19232e8f168faf2220e79be555df3aa743242700879e8fd329ee + DOWNLOAD_NO_PROGRESS TRUE + BINARY_DIR ${CMAKE_SOURCE_DIR}/deps # Build directly to install dir to avoid copy. CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX= -DLLVM_ENABLE_TERMINFO=OFF # Disable terminal color support @@ -76,12 +73,14 @@ function(configure_llvm_project TARGET_NAME) -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF + LOG_CONFIGURE TRUE BUILD_COMMAND ${BUILD_COMMAND} INSTALL_COMMAND cmake --build --config Release --target install + LOG_INSTALL TRUE EXCLUDE_FROM_ALL TRUE ) - ExternalProject_Get_Property(llvm-project INSTALL_DIR) + ExternalProject_Get_Property(llvm INSTALL_DIR) set(LLVM_LIBRARY_DIRS ${INSTALL_DIR}/lib) set(LLVM_INCLUDE_DIRS ${INSTALL_DIR}/include) file(MAKE_DIRECTORY ${LLVM_INCLUDE_DIRS}) # Must exists. @@ -103,12 +102,12 @@ function(configure_llvm_project TARGET_NAME) endif() # Create the target representing - add_library(${TARGET_NAME} STATIC IMPORTED) - set_property(TARGET ${TARGET_NAME} PROPERTY INTERFACE_COMPILE_DEFINITIONS ${DEFINES}) - set_property(TARGET ${TARGET_NAME} PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LLVM_INCLUDE_DIRS}) - set_property(TARGET ${TARGET_NAME} PROPERTY IMPORTED_LOCATION ${MAIN_LIB}) - set_property(TARGET ${TARGET_NAME} PROPERTY INTERFACE_LINK_LIBRARIES ${LIBS}) - if (TARGET llvm-project) - add_dependencies(${TARGET_NAME} llvm-project) + add_library(LLVM::JIT STATIC IMPORTED) + set_property(TARGET LLVM::JIT PROPERTY INTERFACE_COMPILE_DEFINITIONS ${DEFINES}) + set_property(TARGET LLVM::JIT PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LLVM_INCLUDE_DIRS}) + set_property(TARGET LLVM::JIT PROPERTY IMPORTED_LOCATION ${MAIN_LIB}) + set_property(TARGET LLVM::JIT PROPERTY INTERFACE_LINK_LIBRARIES ${LIBS}) + if (TARGET llvm) + add_dependencies(LLVM::JIT llvm) endif() endfunction() diff --git a/libevmjit/CMakeLists.txt b/libevmjit/CMakeLists.txt index 355fda46..c78e5ff0 100644 --- a/libevmjit/CMakeLists.txt +++ b/libevmjit/CMakeLists.txt @@ -44,23 +44,23 @@ configure_file(BuildInfo.h.in ${CMAKE_CURRENT_BINARY_DIR}/gen/BuildInfo.gen.h) # "Object" library to allow building both static and shared libraries. add_library(evmjit-objs OBJECT ${SOURCES} gen/BuildInfo.gen.h) # Explicit dependency on llvm to download LLVM header files. -add_dependencies(evmjit-objs llvm) +add_dependencies(evmjit-objs LLVM::JIT) # PIC is required by shared libraries. We want it in the static library as well, # because it is going to be used to create e.g. Python modules (shared libraries). set_target_properties(evmjit-objs PROPERTIES POSITION_INDEPENDENT_CODE On) target_compile_definitions(evmjit-objs PRIVATE evmjit_EXPORTS) -get_target_property(LLVM_COMPILE_DEFINITIONS llvm INTERFACE_COMPILE_DEFINITIONS) +get_target_property(LLVM_COMPILE_DEFINITIONS LLVM::JIT INTERFACE_COMPILE_DEFINITIONS) if (LLVM_COMPILE_DEFINITIONS) target_compile_definitions(evmjit-objs PRIVATE ${LLVM_COMPILE_DEFINITIONS}) endif() -get_target_property(LLVM_INCLUDE_DIRECTORIES llvm INTERFACE_INCLUDE_DIRECTORIES) +get_target_property(LLVM_INCLUDE_DIRECTORIES LLVM::JIT INTERFACE_INCLUDE_DIRECTORIES) target_include_directories(evmjit-objs SYSTEM PRIVATE ${LLVM_INCLUDE_DIRECTORIES}) target_include_directories(evmjit-objs PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/gen) target_include_directories(evmjit-objs PUBLIC ${EVMJIT_INCLUDE_DIR}) # Static library. add_library(evmjit-static STATIC $) -target_link_libraries(evmjit-static PRIVATE llvm) +target_link_libraries(evmjit-static PRIVATE LLVM::JIT) # Shared library. add_library(evmjit SHARED $) @@ -68,7 +68,7 @@ set_target_properties(evmjit PROPERTIES VERSION ${EVMJIT_VERSION} SOVERSION ${EVMJIT_SOVERSION} FOLDER "libs") -target_link_libraries(evmjit PRIVATE llvm) +target_link_libraries(evmjit PRIVATE LLVM::JIT) include(GNUInstallDirs) install(TARGETS evmjit