Merge pull request #31 from ethereum/cable-update

Cable update
This commit is contained in:
Paweł Bylica 2018-05-08 11:24:20 +02:00 committed by GitHub
commit e1a8e0ff9a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 225 additions and 39 deletions

View File

@ -30,7 +30,7 @@ HunterGate(
project(evmc) project(evmc)
set(PROJECT_VERSION "0.1.0.dev0") set(PROJECT_VERSION "0.1.0.dev0")
cable_configure_compiler() cable_configure_compiler(NO_STACK_PROTECTION)
add_library(evmc INTERFACE) add_library(evmc INTERFACE)
target_include_directories(evmc INTERFACE include) target_include_directories(evmc INTERFACE include)

View File

@ -60,12 +60,13 @@ function(cable_add_buildinfo_library)
-DCOMPILER_ID=${CMAKE_CXX_COMPILER_ID} -DCOMPILER_ID=${CMAKE_CXX_COMPILER_ID}
-DCOMPILER_VERSION=${CMAKE_CXX_COMPILER_VERSION} -DCOMPILER_VERSION=${CMAKE_CXX_COMPILER_VERSION}
-DBUILD_TYPE=${build_type} -DBUILD_TYPE=${build_type}
-DCABLE_DEBUG=${CABLE_DEBUG}
-P ${cable_buildinfo_template_dir}/buildinfo.cmake -P ${cable_buildinfo_template_dir}/buildinfo.cmake
DEPENDS DEPENDS
${cable_buildinfo_template_dir}/buildinfo.cmake ${cable_buildinfo_template_dir}/buildinfo.cmake
${cable_buildinfo_template_dir}/buildinfo.c.in ${cable_buildinfo_template_dir}/buildinfo.c.in
${NAME}-git ${NAME}-git
${binary_dir}/git_commit_hash.txt ${binary_dir}/gitinfo.txt
) )
string(TIMESTAMP TIMESTAMP) string(TIMESTAMP TIMESTAMP)

View File

@ -26,7 +26,7 @@ macro(cable_set_build_type)
FORCE FORCE
) )
endif() endif()
message(STATUS "[cable] Configurations: ${CMAKE_CONFIGURATION_TYPES}") cable_log("Configurations: ${CMAKE_CONFIGURATION_TYPES}")
else() else()
if(build_type_DEFAULT AND NOT CMAKE_BUILD_TYPE) if(build_type_DEFAULT AND NOT CMAKE_BUILD_TYPE)
set( set(
@ -37,7 +37,7 @@ macro(cable_set_build_type)
FORCE FORCE
) )
endif() endif()
message(STATUS "[cable] Build type: ${CMAKE_BUILD_TYPE}") cable_log("Build type: ${CMAKE_BUILD_TYPE}")
endif() endif()
endif() endif()
endmacro() endmacro()

View File

@ -1,3 +1,6 @@
# Cable: CMake Bootstrap Library
# Copyright 2018 Pawel Bylica.
# Licensed under the Apache License, Version 2.0. See the LICENSE file.
include(CheckCXXCompilerFlag) include(CheckCXXCompilerFlag)
@ -29,6 +32,12 @@ macro(cable_configure_compiler)
if(NOT PROJECT_IS_NESTED) if(NOT PROJECT_IS_NESTED)
# Do this configuration only in the top project. # Do this configuration only in the top project.
cmake_parse_arguments(cable "NO_STACK_PROTECTION" "" "" ${ARGN})
if(cable_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "cable_configure_compiler: Uknown options: ${cable_UNPARSED_ARGUMENTS}")
endif()
# Set helper variables recognizing C++ compilers. # Set helper variables recognizing C++ compilers.
if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU) if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU)
set(CABLE_COMPILER_GNU TRUE) set(CABLE_COMPILER_GNU TRUE)
@ -59,9 +68,21 @@ macro(cable_configure_compiler)
endif() endif()
check_cxx_compiler_flag(-fstack-protector fstack-protector)
if(fstack-protector)
# The compiler supports stack protection options.
if(cable_NO_STACK_PROTECTION)
# Stack protection explicitly disabled.
# Add "no" flag, because in some configuration the compiler has it enabled by default.
add_compile_options(-fno-stack-protector)
else()
# Try enabling the "strong" variant.
cable_add_cxx_compiler_flag_if_supported(-fstack-protector-strong have_stack_protector_strong_support) cable_add_cxx_compiler_flag_if_supported(-fstack-protector-strong have_stack_protector_strong_support)
if(NOT have_stack_protector_strong_support) if(NOT have_stack_protector_strong_support)
cable_add_cxx_compiler_flag_if_supported(-fstack-protector) # Fallback to standard variant of "strong" not available.
add_compile_options(-fstack-protector)
endif()
endif()
endif() endif()
cable_add_cxx_compiler_flag_if_supported(-Wimplicit-fallthrough) cable_add_cxx_compiler_flag_if_supported(-Wimplicit-fallthrough)

67
cmake/cable/README.md Normal file
View File

@ -0,0 +1,67 @@
# Cable
[![readme style: standard][readme style standard badge]][standard readme]
> Cable: CMake Bootstrap Library
Cable is a set of CMake modules and scripts containing common patterns used
in CMake-based C++ projects. The design goal is to be pragmatic rather than
generic so the number of provided options is minimal. The Cable modules are
independent so it is easy to use them individually.
## Table of Contents
- [Install](#install)
- [Usage](#usage)
- [Maintainer](#maintainer)
- [License](#license)
## Install
### As git submodule
Include the Cable library as git submodule in your project. The suggested
submodule location is `cmake/cable` relative to your project root directory.
```sh
git submodule add https://github.com/ethereum/cable cmake/cable
```
## Usage
Cable contains the `bootstrap.cmake` file that initializes the library.
Start by including this file in your main `CMakeLists.txt` from Cable submodule
or any other location. The `bootstrap.cmake` must be included before
the `project()` command. After that, you can include and use other
Cable modules.
### Example
```cmake
cmake_minimum_required(VERSION 3.5)
include(cmake/cable/bootstrap.cmake)
include(CableBuildType)
project(tothemoon)
cable_set_build_type(DEFAULT RelWithDebInfo CONFIGURATION_TYPES Debug Release RelWithDebInfo)
```
## Maintainer
Paweł Bylica [@chfast]
## License
Licensed under the [Apache License, Version 2.0].
[@chfast]: https://github.com/chfast
[Apache License, Version 2.0]: https://www.apache.org/licenses/LICENSE-2.0
[standard readme]: https://github.com/RichardLitt/standard-readme
[readme style standard badge]: https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square

View File

@ -1,20 +1,22 @@
# Cable: CMake Bootstrap Library.
# Copyright 2018 Pawel Bylica. # Copyright 2018 Pawel Bylica.
# Licensed under the Apache License, Version 2.0. See the LICENSE file. # Licensed under the Apache License, Version 2.0. See the LICENSE file.
# Bootstrap the Cable - CMake Boostrap Library. # Bootstrap the Cable - CMake Boostrap Library by including this file.
# e.g. include(cmake/cable/bootstrap.cmake).
# Cable version. # Cable version.
# #
# This is internal variable automaticaly updated with external tools. # This is internal variable automaticaly updated with external tools.
# Use CABLE_VERSION variable if you need this information. # Use CABLE_VERSION variable if you need this information.
set(version 0.1.4) set(version 0.1.7)
# For conveniance, add the project CMake module dir to module path.
# For conveniance, add the parent dir containg CMake modules to module path. set(module_dir ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
get_filename_component(module_dir ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) if(EXISTS ${module_dir})
list(APPEND CMAKE_MODULE_PATH ${module_dir}) list(APPEND CMAKE_MODULE_PATH ${module_dir})
unset(module_dir) endif()
if(CABLE_VERSION) if(CABLE_VERSION)
@ -43,15 +45,30 @@ if(CABLE_VERSION)
message( message(
${severity} ${severity}
"[cable] Parent Cable ${CABLE_VERSION} (${comment}) initialized in `${cable_top_project_name}` project" "[cable ] Parent Cable ${CABLE_VERSION} (${comment}) initialized in `${cable_top_project_name}` project"
) )
cable_debug("Project CMake modules directory: ${module_dir}")
unset(version) unset(version)
unset(module_dir)
unset(severity) unset(severity)
unset(comment) unset(comment)
return() return()
endif() endif()
option(CABLE_DEBUG "Enable Cable debug logs" OFF)
function(cable_log)
message(STATUS "[cable ] ${ARGN}")
endfunction()
function(cable_debug)
if(CABLE_DEBUG)
message(STATUS "[cable*] ${ARGN}")
endif()
endfunction()
# Export Cable version. # Export Cable version.
set(CABLE_VERSION ${version}) set(CABLE_VERSION ${version})
@ -61,6 +78,8 @@ set(PROJECT_IS_NESTED FALSE)
# Add Cable modules to the CMake module path. # Add Cable modules to the CMake module path.
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
message(STATUS "[cable] Cable ${CABLE_VERSION} initialized") cable_log("Cable ${CABLE_VERSION} initialized")
cable_debug("Project CMake modules directory: ${module_dir}")
unset(version) unset(version)
unset(module_dir)

View File

@ -1,7 +1,9 @@
// Copyright 2018 Pawel Bylica. /* Cable: CMake Bootstrap Library.
// Licensed under the Apache License, Version 2.0. See the LICENSE file. * Copyright 2018 Pawel Bylica.
* Licensed under the Apache License, Version 2.0. See the LICENSE file.
*/
// Generated by Cable Build Info on @TIMESTAMP@. Do not modify directly. /* Generated by Cable Build Info on @TIMESTAMP@. Do not modify directly. */
#include "@NAME@.h" #include "@NAME@.h"
@ -9,12 +11,12 @@ const struct buildinfo* @FUNCTION_NAME@()
{ {
static const struct buildinfo buildinfo = { static const struct buildinfo buildinfo = {
.project_version = "@PROJECT_VERSION@", .project_version = "@PROJECT_VERSION@",
.git_commit_hash = "@GIT_COMMIT_HASH@",
.system_name = "@SYSTEM_NAME@", .system_name = "@SYSTEM_NAME@",
.system_processor = "@SYSTEM_PROCESSOR", .system_processor = "@SYSTEM_PROCESSOR@",
.compiler_id = "@COMPILER_ID@", .compiler_id = "@COMPILER_ID@",
.compiler_version = "@COMPILER_VERSION@", .compiler_version = "@COMPILER_VERSION@",
.build_type = "@BUILD_TYPE@", .build_type = "@BUILD_TYPE@",
.git_commit_hash = "@GIT_COMMIT_HASH@",
}; };
return &buildinfo; return &buildinfo;
} }

View File

@ -1,16 +1,60 @@
# Cable: CMake Bootstrap Library.
# Copyright 2018 Pawel Bylica. # Copyright 2018 Pawel Bylica.
# Licensed under the Apache License, Version 2.0. See the LICENSE file. # Licensed under the Apache License, Version 2.0. See the LICENSE file.
# Read the git commit hash from a file. The gitinfo is suppose to update the
# file only if the hash changes.
file(READ ${BINARY_DIR}/git_commit_hash.txt GIT_COMMIT_HASH)
string(TOLOWER ${SYSTEM_NAME} SYSTEM_NAME) string(TOLOWER ${SYSTEM_NAME} SYSTEM_NAME)
string(TOLOWER ${SYSTEM_PROCESSOR} SYSTEM_PROCESSOR) string(TOLOWER ${SYSTEM_PROCESSOR} SYSTEM_PROCESSOR)
string(TOLOWER ${COMPILER_ID} COMPILER_ID) string(TOLOWER ${COMPILER_ID} COMPILER_ID)
string(TOLOWER ${BUILD_TYPE} BUILD_TYPE) string(TOLOWER ${BUILD_TYPE} BUILD_TYPE)
string(TIMESTAMP TIMESTAMP) string(TIMESTAMP TIMESTAMP)
# Read the git info from a file. The gitinfo is suppose to update the file
# only if the information has changed.
file(READ ${BINARY_DIR}/gitinfo.txt GIT_INFO)
# The output of `git describe --always --long --tags --match=v*`.
string(REGEX MATCH "(v(.+)-([0-9]+)-g)?([0-9a-f]+)(-dirty)?" match "${GIT_INFO}")
if(NOT match)
message(WARNING "Cannot parse git describe: ${GIT_INFO}")
endif()
set(GIT_LATEST_PROJECT_VERSION ${CMAKE_MATCH_2})
set(GIT_LATEST_PROJECT_VERSION_DISTANCE ${CMAKE_MATCH_3})
set(GIT_COMMIT_HASH ${CMAKE_MATCH_4})
if(CMAKE_MATCH_5)
set(GIT_DIRTY TRUE)
set(dirty_msg " (dirty)")
else()
set(GIT_DIRTY FALSE)
endif()
cable_debug("gitinfo: parsing '${GIT_INFO}':")
cable_debug(" version: ${GIT_LATEST_PROJECT_VERSION}")
cable_debug(" distance: ${GIT_LATEST_PROJECT_VERSION_DISTANCE}")
cable_debug(" commit: ${GIT_COMMIT_HASH}")
cable_debug(" dirty: ${GIT_DIRTY}")
if(GIT_COMMIT_HASH)
string(SUBSTRING ${GIT_COMMIT_HASH} 0 8 abbrev)
set(version_commit "+commit.${abbrev}")
if(GIT_DIRTY)
set(version_commit "${version_commit}.dirty")
endif()
endif()
if(${PROJECT_VERSION} STREQUAL "${GIT_LATEST_PROJECT_VERSION}")
if(${GIT_LATEST_PROJECT_VERSION_DISTANCE} GREATER 0)
set(PROJECT_VERSION "${PROJECT_VERSION}-${GIT_LATEST_PROJECT_VERSION_DISTANCE}${version_commit}")
endif()
else()
if(GIT_LATEST_PROJECT_VERSION)
message(WARNING "Git project version mismatch: '${GIT_LATEST_PROJECT_VERSION}' vs '${PROJECT_VERSION}'")
endif()
set(PROJECT_VERSION "${PROJECT_VERSION}${version_commit}")
endif()
message( message(
" Project Version: ${PROJECT_VERSION}\n" " Project Version: ${PROJECT_VERSION}\n"
" System Name: ${SYSTEM_NAME}\n" " System Name: ${SYSTEM_NAME}\n"
@ -18,7 +62,7 @@ message(
" Compiler ID: ${COMPILER_ID}\n" " Compiler ID: ${COMPILER_ID}\n"
" Compiler Version: ${COMPILER_VERSION}\n" " Compiler Version: ${COMPILER_VERSION}\n"
" Build Type: ${BUILD_TYPE}\n" " Build Type: ${BUILD_TYPE}\n"
" Git Commit Hash: ${GIT_COMMIT_HASH}\n" " Git Info: ${GIT_LATEST_PROJECT_VERSION} ${GIT_LATEST_PROJECT_VERSION_DISTANCE} ${GIT_COMMIT_HASH}${dirty_msg}\n"
" Timestamp: ${TIMESTAMP}" " Timestamp: ${TIMESTAMP}"
) )

View File

@ -1,7 +1,9 @@
// Copyright 2018 Pawel Bylica. /* Cable: CMake Bootstrap Library.
// Licensed under the Apache License, Version 2.0. See the LICENSE file. * Copyright 2018 Pawel Bylica.
* Licensed under the Apache License, Version 2.0. See the LICENSE file.
*/
// Generated by Cable Build Info on @TIMESTAMP@. Do not modify directly. /* Generated by Cable Build Info on @TIMESTAMP@. Do not modify directly. */
#pragma once #pragma once
@ -13,12 +15,12 @@ extern "C"
struct buildinfo struct buildinfo
{ {
const char* project_version; const char* project_version;
const char* git_commit_hash;
const char* system_name; const char* system_name;
const char* system_processor; const char* system_processor;
const char* compiler_id; const char* compiler_id;
const char* compiler_version; const char* compiler_version;
const char* build_type; const char* build_type;
const char* git_commit_hash;
}; };
const struct buildinfo* @FUNCTION_NAME@(); const struct buildinfo* @FUNCTION_NAME@();

View File

@ -1,26 +1,32 @@
# Cable: CMake Bootstrap Library.
# Copyright 2018 Pawel Bylica. # Copyright 2018 Pawel Bylica.
# Licensed under the Apache License, Version 2.0. See the LICENSE file. # Licensed under the Apache License, Version 2.0. See the LICENSE file.
# Execute git only if the tool is available. # Execute git only if the tool is available.
if(GIT) if(GIT)
execute_process( execute_process(
COMMAND ${GIT} rev-parse HEAD COMMAND ${GIT} describe --always --long --tags --match=v* --abbrev=40 --dirty
WORKING_DIRECTORY ${SOURCE_DIR} WORKING_DIRECTORY ${SOURCE_DIR}
OUTPUT_VARIABLE commit_hash OUTPUT_VARIABLE gitinfo
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET ERROR_VARIABLE error
ERROR_STRIP_TRAILING_WHITESPACE
) )
endif() endif()
set(commit_hash_file ${BINARY_DIR}/git_commit_hash.txt) if(error)
message(WARNING "Git ${error}")
endif()
if(EXISTS ${commit_hash_file}) set(gitinfo_file ${BINARY_DIR}/gitinfo.txt)
file(READ ${commit_hash_file} prev_commit_hash)
if(EXISTS ${gitinfo_file})
file(READ ${gitinfo_file} prev_gitinfo)
else() else()
# Create empty file, because other targets expect it to exist. # Create empty file, because other targets expect it to exist.
file(WRITE ${commit_hash_file} "") file(WRITE ${gitinfo_file} "")
endif() endif()
if(NOT "${commit_hash}" STREQUAL "${prev_commit_hash}") if(NOT "${gitinfo}" STREQUAL "${prev_gitinfo}")
file(WRITE ${commit_hash_file} ${commit_hash}) file(WRITE ${gitinfo_file} ${gitinfo})
endif() endif()

View File

@ -0,0 +1,24 @@
# Cable: CMake Bootstrap Library.
# Copyright 2018 Pawel Bylica.
# Licensed under the Apache License, Version 2.0. See the LICENSE file.
set(CMAKE_SYSTEM_PROCESSOR powerpc64)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER powerpc64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER powerpc64-linux-gnu-g++)
set(CMAKE_FIND_ROOT_PATH /usr/powerpc64-linux-gnu)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
set(CMAKE_CXX_EXTENSIONS OFF)
if(${CMAKE_VERSION} VERSION_LESS 3.10.0)
# Until CMake 3.10 the FindThreads uses try_run() check of -pthread flag,
# what causes CMake error in crosscompiling mode. Avoid the try_run() check
# by specifying the result up front.
set(THREADS_PTHREAD_ARG TRUE)
endif()