Skip to content

Commit

Permalink
Add CMake scripts for building dependencies
Browse files Browse the repository at this point in the history
Add CMake scripts and helper functions to build this dependencies:
- boost (ported from .bat script, version bump to 1.61),
- LLVM,
- OpenCL ICD Loader.

Also added install_deps.cmake scripts that downloads all dependencies (including Qt) from GitHub release page.
  • Loading branch information
chfast committed May 17, 2016
1 parent 64578e3 commit c3561a7
Show file tree
Hide file tree
Showing 10 changed files with 200 additions and 52 deletions.
4 changes: 4 additions & 0 deletions .gitignore
@@ -1 +1,5 @@
/build
/cache
/install
/package
/packages
23 changes: 0 additions & 23 deletions build_boost.bat

This file was deleted.

15 changes: 0 additions & 15 deletions bundle_boost.bat

This file was deleted.

10 changes: 0 additions & 10 deletions install_boost.bat

This file was deleted.

21 changes: 21 additions & 0 deletions install_deps.cmake
@@ -0,0 +1,21 @@
include("${CMAKE_CURRENT_LIST_DIR}/scripts/helpers.cmake")

set(INSTALL_DIR "${ROOT_DIR}/install")
set(SERVER "https://github.com/ethereum/cpp-dependencies/releases/download/vc140/")

function(download_and_install PACKAGE_NAME)
download_and_unpack("${SERVER}${PACKAGE_NAME}.tar.gz" ${INSTALL_DIR})
endfunction(download_and_install)


download_and_install("boost-1.61")
download_and_install("cryptopp-5.6.2")
download_and_install("curl-7.4.2")
download_and_install("json-rpc-cpp-0.5.0")
download_and_install("jsoncpp-1.6.2")
download_and_install("opencl-icd-loader-0.0")
download_and_install("leveldb-1.2")
download_and_install("llvm-3.8.0")
download_and_install("microhttpd-0.9.2")
download_and_install("miniupnpc-1.9")
download_and_install("qt-5.6")
4 changes: 0 additions & 4 deletions main.bat
Expand Up @@ -32,9 +32,6 @@ call :setup x64 Debug & call build_cryptopp.bat & call bundle_cryptopp.ba
call :setup x64 Release & call build_cryptopp.bat & call bundle_cryptopp.bat || goto :error
call install_cryptopp.bat || goto :error

call :setup x64 both & call build_boost.bat & call bundle_boost.bat || goto :error
call install_boost.bat

call :setup x64 Debug & call build_leveldb.bat & call bundle_leveldb.bat || goto :error
call :setup x64 Release & call build_leveldb.bat & call bundle_leveldb.bat || goto :error
call install_leveldb.bat || goto :error
Expand All @@ -56,4 +53,3 @@ echo Failed with error %errorlevel%
exit /b %errorlevel%

:EOF

30 changes: 30 additions & 0 deletions scripts/build_boost.cmake
@@ -0,0 +1,30 @@
include("${CMAKE_CURRENT_LIST_DIR}/helpers.cmake")

prepare_package_source(boost 1.61 http://sourceforge.net/projects/boost/files/boost/1.61.0/boost_1_61_0.tar.gz)

if (NOT EXISTS ${SOURCE_DIR}/b2.exe)
execute_process(COMMAND bootstrap.bat WORKING_DIRECTORY ${SOURCE_DIR})
endif()

execute_process(COMMAND ./b2 -j4
stage --stagedir=${INSTALL_DIR}/win64 --build-dir=${BUILD_DIR}
link=static
runtime-link=shared
variant=release
threading=multi
address-model=64
--with-filesystem
--with-system
--with-thread
--with-date_time
--with-regex
--with-test
--with-program_options
--with-random
--with-atomic
WORKING_DIRECTORY ${SOURCE_DIR})

message("Copying boost headers")
file(COPY ${SOURCE_DIR}/boost DESTINATION ${INSTALL_DIR}/win64/include)

create_package(${PACKAGE_NAME} ${INSTALL_DIR})
32 changes: 32 additions & 0 deletions scripts/build_llvm.cmake
@@ -0,0 +1,32 @@
# This script downloads LLVM source and builds it with Visual Studio.

include("${CMAKE_CURRENT_LIST_DIR}/helpers.cmake")

function(build_llvm CONFIGURATION)
if (CONFIGURATION STREQUAL "Release")
set(ASSERTS OFF)
set(CONFIG "Release")
elseif (CONFIGURATION STREQUAL "Debug")
set(ASSERTS ON)
set(CONFIG "RelWithDebInfo")
else()
message(FATAL_ERROR "Wrong configuration")
endif()
set(INSTALL_DIR "${INSTALL_DIR}/win64/${CONFIGURATION}")

execute_process(COMMAND cmake ${SOURCE_DIR} -G "Visual Studio 14 2015 Win64"
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
-DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_TOOLS=OFF
-DLLVM_ENABLE_ASSERTIONS=${ASSERTS}
WORKING_DIRECTORY ${BUILD_DIR})

execute_process(COMMAND cmake --build ${BUILD_DIR}
--target install --config ${CONFIG})
endfunction(build_llvm)

prepare_package_source(llvm 3.8.0 http://llvm.org/releases/3.8.0/llvm-3.8.0.src.tar.xz)

build_llvm("Release")
# build_llvm("Debug")

create_package(${PACKAGE_NAME} ${INSTALL_DIR})
23 changes: 23 additions & 0 deletions scripts/build_opencl-icd-loader.cmake
@@ -0,0 +1,23 @@
# This scirpt builds universal OpenCL ICD Loader that searches for OpenCL
# implementations at run-time. The package also includes OpenCL headers.

include("${CMAKE_CURRENT_LIST_DIR}/helpers.cmake")

prepare_package_source(opencl-icd-loader 0.0 https://github.com/KhronosGroup/OpenCL-ICD-Loader/archive/master/OpenCL-ICD-Loader.tar.gz)

if (NOT EXISTS ${SOURCE_DIR}/inc/CL)
download_and_unpack(https://github.com/KhronosGroup/OpenCL-Headers/archive/master/OpenCL-Headers.tar.gz ${SOURCE_DIR} STATUS)
file(RENAME ${SOURCE_DIR}/OpenCL-Headers-master ${SOURCE_DIR}/inc/CL)
endif()

execute_process(COMMAND cmake ${SOURCE_DIR} -G "Visual Studio 14 2015 Win64"
WORKING_DIRECTORY ${BUILD_DIR})

execute_process(COMMAND cmake --build ${BUILD_DIR}
--target OpenCL --config Release)

file(COPY ${BUILD_DIR}/Release/OpenCl.lib DESTINATION ${INSTALL_DIR}/win64/lib/)
file(COPY ${BUILD_DIR}/bin/Release/OpenCl.dll DESTINATION ${INSTALL_DIR}/win64/bin/)
file(COPY ${SOURCE_DIR}/inc/CL DESTINATION ${INSTALL_DIR}/win64/include/)

create_package(${PACKAGE_NAME} ${INSTALL_DIR})
90 changes: 90 additions & 0 deletions scripts/helpers.cmake
@@ -0,0 +1,90 @@
get_filename_component(ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE)

set(CACHE_DIR "${ROOT_DIR}/cache")
set(PACKAGES_DIR "${ROOT_DIR}/packages")

function(download URL DST_FILE STATUS)
set(TMP_FILE "${DST_FILE}.part")

get_filename_component(FILE_NAME ${DST_FILE} NAME)
if (NOT EXISTS ${DST_FILE})
message("Downloading ${FILE_NAME}")
file(DOWNLOAD ${URL} ${TMP_FILE} SHOW_PROGRESS STATUS DOWNLOAD_STATUS)
list(GET DOWNLOAD_STATUS 0 STATUS_CODE)
if (STATUS_CODE EQUAL 0)
file(RENAME ${TMP_FILE} ${DST_FILE})
else()
file(REMOVE ${TMP_FILE})
list(GET DOWNLOAD_STATUS 1 ERROR_MSG)

message("ERROR! Downloading '${FILE_NAME}' failed.")
message(STATUS "URL: ${URL}")
message(STATUS "Error: ${STATUS_CODE} ${ERROR_MSG}")
set(STATUS FALSE PARENT_SCOPE)
return()
endif()
else()
message("Using cached ${FILE_NAME}")
endif()
set(STATUS TRUE PARENT_SCOPE)
endfunction(download)

function(download_and_unpack PACKAGE_URL DST_DIR)
get_filename_component(FILE_NAME ${PACKAGE_URL} NAME)

set(DST_FILE "${CACHE_DIR}/${FILE_NAME}")
set(TMP_FILE "${DST_FILE}.part")

file(MAKE_DIRECTORY ${CACHE_DIR})
file(MAKE_DIRECTORY ${DST_DIR})

download(${PACKAGE_URL} ${DST_FILE} STATUS)

if (STATUS)
message("Unpacking ${FILE_NAME} to ${DST_DIR}")
execute_process(COMMAND ${CMAKE_COMMAND} -E tar -xf ${DST_FILE}
WORKING_DIRECTORY ${DST_DIR})
endif()
endfunction(download_and_unpack)

# Packs installed package binaries and headers into an archive.
function(create_package NAME DIR)
message("Creating package ${NAME}")
file(MAKE_DIRECTORY ${PACKAGES_DIR})

# To create an archive without addicional top level directory
# (like package-X.Y.Z) we need to know all top level files/dirs.
# Usually it is just "win64" dir.
file(GLOB TOP_FILES RELATIVE ${DIR} "${DIR}/*")

set(PACKAGE_FILE "${PACKAGES_DIR}/${NAME}.tar.gz")
execute_process(COMMAND ${CMAKE_COMMAND} -E
tar -czf ${PACKAGE_FILE} ${TOP_FILES}
WORKING_DIRECTORY ${DIR})
endfunction(create_package)

# Downloads the source code of the package and unpacks it to dedicated 'src'
# dir. Also creates 'build' and 'install' dir to be used by a build script.
function(prepare_package_source NAME VERSION URL)
set(PACKAGE_NAME "${NAME}-${VERSION}")

set(PACKAGE_DIR "${CACHE_DIR}/${PACKAGE_NAME}")
set(SOURCE_DIR "${PACKAGE_DIR}/src")
set(BUILD_DIR "${PACKAGE_DIR}/build")
set(INSTALL_DIR "${PACKAGE_DIR}/install")

if (NOT EXISTS ${SOURCE_DIR})
download_and_unpack(${URL} ${PACKAGE_DIR} STATUS)
file(GLOB ORIG_SOURCE_DIR_NAME "${PACKAGE_DIR}/*")
file(RENAME ${ORIG_SOURCE_DIR_NAME} ${SOURCE_DIR})
endif()

file(MAKE_DIRECTORY ${BUILD_DIR})
file(MAKE_DIRECTORY ${INSTALL_DIR})

# Export names and dirs to be used by a package-specific build script.
set(PACKAGE_NAME ${PACKAGE_NAME} PARENT_SCOPE)
set(SOURCE_DIR ${SOURCE_DIR} PARENT_SCOPE)
set(BUILD_DIR ${BUILD_DIR} PARENT_SCOPE)
set(INSTALL_DIR ${INSTALL_DIR} PARENT_SCOPE)
endfunction()

0 comments on commit c3561a7

Please sign in to comment.