Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve LLVM project configuration #114

Merged
merged 2 commits into from
Mar 7, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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