Skip to content

Commit

Permalink
Merge pull request #114 from ethereum/llvm-project
Browse files Browse the repository at this point in the history
Improve LLVM project configuration
  • Loading branch information
chfast authored Mar 7, 2017
2 parents 7aef50d + 10d36e3 commit 81fc5be
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 27 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 5 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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().
Expand All @@ -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")
Expand Down Expand Up @@ -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)

Expand Down
3 changes: 1 addition & 2 deletions appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
31 changes: 15 additions & 16 deletions cmake/llvm.cmake → cmake/ProjectLLVM.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -59,29 +59,28 @@ function(configure_llvm_project TARGET_NAME)
set(BUILD_COMMAND cmake --build <BINARY_DIR> --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=<INSTALL_DIR>
-DLLVM_ENABLE_TERMINFO=OFF # Disable terminal color support
-DLLVM_ENABLE_ZLIB=OFF # Disable compression support -- not needed at all
-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 <BINARY_DIR> --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.
Expand All @@ -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()
10 changes: 5 additions & 5 deletions libevmjit/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -44,31 +44,31 @@ 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_OBJECTS:evmjit-objs>)
target_link_libraries(evmjit-static PRIVATE llvm)
target_link_libraries(evmjit-static PRIVATE LLVM::JIT)

# Shared library.
add_library(evmjit SHARED $<TARGET_OBJECTS:evmjit-objs>)
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
Expand Down

0 comments on commit 81fc5be

Please sign in to comment.