Skip to content

Commit

Permalink
Make the Solidity repository standalone.
Browse files Browse the repository at this point in the history
This commit is the culmination of several months of work to decouple Solidity from the webthree-umbrella so that it can be developed in parallel with cpp-ethereum (the Ethereum C++ runtime) and so that even for the Solidity unit-tests there is no hard-dependency onto the C++ runtime.

The Tests-over-IPC refactoring was a major step in the same process which was already committed.

This commit contains the following changes:

- A subset of the CMake functionality in webthree-helpers was extracted and tailored for Solidity into ./cmake.   Further cleanup is certainly possible.
- A subset of the libdevcore functionality in libweb3core was extracted and tailored for Solidity into ./libdevcore.   Further cleanup is certainly possible
- The gas price constants in EVMSchedule were orphaned into libevmasm.
- Some other refactorings and cleanups were made to sever unnecessary EVM dependencies in the Solidity unit-tests.
- TravisCI and Appveyor support was added, covering builds and running of the unit-tests (Linux and macOS only for now)
- A bug-fix was made to get the Tests-over-IPC running on macOS.
- There are still reliability issues in the unit-tests, which need immediate attention.    The Travis build has been flipped to run the unit-tests 5 times, to try to flush these out.
- The Emscripten automation which was previously in webthree-umbrella was merged into the TravisCI automation here.
- The development ZIP deployment step has been commented out, but we will want to read that ONLY for release branch.

Further iteration on these changes will definitely be needed, but I feel these have got to sufficient maturity than holding them back further isn't winning us anything.    It is go time :-)
  • Loading branch information
bobsummerwill committed Aug 1, 2016
1 parent 56727d6 commit 4ee2114
Show file tree
Hide file tree
Showing 69 changed files with 5,901 additions and 199 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,7 @@ docs/utils/__pycache__

# vim stuff
*.swp

# IDE files
.idea
browse.VC.db
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "deps"]
path = deps
url = https://github.com/ethereum/cpp-dependencies
120 changes: 115 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,15 +1,125 @@
#------------------------------------------------------------------------------
# TravisCI configuration file for solidity.
#
# The documentation for solidity is hosted at:
#
# http://solidity.readthedocs.org
#
# TODO - Merge with .travis.yml file which currently lives in the root of
# webthree-umbrella, but actually contains the automation for the Solidity
# Emscripten build, which will also need consolidating into here somehow.
#
# See https://github.com/ethereum/webthree-umbrella/blob/develop/.travis.yml
#
# ------------------------------------------------------------------------------
# This file is part of cpp-ethereum.
#
# cpp-ethereum is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# cpp-ethereum is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>
#
# (c) 2016 cpp-ethereum contributors.
#------------------------------------------------------------------------------

language: cpp
cache: ccache
branches:
only:
- develop
- release
- standalone
except:
- /develop-v[0-9]/
matrix:
include:
- os: linux
dist: trusty
sudo: required
env: TRAVIS_BUILD_TYPE=Debug
compiler: gcc
services:
- docker
before_install:
- docker pull trzeci/emscripten:sdk-tag-1.35.4-64bit
env:
- TRAVIS_BUILD_TYPE=RelWithDebInfo
- ZIP_SUFFIX=ubuntu-trusty
- os: osx
osx_image: beta-xcode6.2
env:
- TRAVIS_BUILD_TYPE=RelWithDebInfo
- ZIP_SUFFIX=osx-mavericks
- os: osx
osx_image: xcode7.1
env:
- TRAVIS_BUILD_TYPE=RelWithDebInfo
- ZIP_SUFFIX=osx-yosemite
- os: osx
osx_image: xcode7.3
env: TRAVIS_BUILD_TYPE=Debug
env:
# The use of Debug config here ONLY for El Capitan is a workaround for "The Heisenbug"
# See https://github.com/ethereum/webthree-umbrella/issues/565
- TRAVIS_BUILD_TYPE=Debug
- ZIP_SUFFIX=osx-elcapitan
git:
depth: 2
before_install: ./install_dependencies.sh
script: ./fetch_umbrella_build_and_test.sh
install:
- ./scripts/install_deps.sh
before_script:
- ./scripts/build_emscripten.sh
- mkdir -p build
&& cd build
&& cmake .. -DCMAKE_BUILD_TYPE=$TRAVIS_BUILD_TYPE
&& make -j2
&& cd ..
&& ./scripts/release.sh $ZIP_SUFFIX
script:
# There are a variety of reliability issues with the Solidity unit-tests at the time of
# writing, so we're actually running them 5 times in a row, to try to flush all of these
# issues out as quickly as possible. See https://github.com/ethereum/solidity/issues/769
- cd $TRAVIS_BUILD_DIR && ./scripts/tests.sh
- cd $TRAVIS_BUILD_DIR && ./scripts/tests.sh
- cd $TRAVIS_BUILD_DIR && ./scripts/tests.sh
- cd $TRAVIS_BUILD_DIR && ./scripts/tests.sh
- cd $TRAVIS_BUILD_DIR && ./scripts/tests.sh
after_success:
- cd $TRAVIS_BUILD_DIR && ./scripts/docs.sh
env:
global:
- ENCRYPTION_LABEL="296c219a3f41"

# This is the deploy target for the native build (Linux and macOS)
# which generates development ZIPs per commit. We are in agreement
# that this is probably noisy overkill, so will want to renable this
# functionality wrapped in some conditionals so that it only runs
# when building the 'release' branch.
#
#deploy:
# provider: releases
# api_key:
# secure: mGeDrlCbhPNQVqrk5wSqFZe/7C5HUIBWcZECJcFrEldN6ELj3a8mhDX9EWebidyFmZsf3ipKVMycJtXZHlH2kVZ0nZdRulq4bYhLiUFRaFQCHMW35dml5mxO/FPp+jhhZaylDUx+cI6AULbj8DvNFqSCfjx8qimRhJjRY4JHeG71N6g5+LU2/dA01D4Y97BUbQ5dYcmEyuEsriSpXOElIQIIv3+Q6MJNnLzxUA6EXsp4Qt3Qf3R1+EkI/RWOPbQsddpFNJBcBNOscCUFSZV3+ZK9E2RyHbPaL+Da4aJKVpgD7X1TFudq4PClMUTkg8CuJh/kvy9wkpaWyYHbLGQqu1vQ+NQ+vlTAKf8U+1xhC1IkX6nA+g4TlRksZRltRhpkBPnFoaQQGjD9eYyT1V/Htrn8Y/VGbYPBVa0GcEYXG5pDCBPz91RBpYwDcyUg9DEPNI6zYfQY8jA8xqtFwPX79Y22MDXIKhBskK00geuzh7Npy5Rnh4fLqVKMlffvYx3kwp444EFWtQ5jxbRCym2Th6EldkOM8Kble1JvixQtVb4s+DpTuwHCTrXZhwMuJpmwgRx52zyIsGrBPF3MOmdlwl+l0TD8UEJXt0JM1XSF1AROyYwXKDZQ9Qt4sd9ZKSWWaLJMEJf4kkZWYgTEI/FhOWlfshQCt8Z9S9r4fq2ywoo=
# file: $TRAVIS_BUILD_DIR/solidity-develop-$ZIP_SUFFIX.zip
# skip_cleanup: true
# on:
# repo: bobsummerwill/solidity
# branch: standalone_changes

# This is the deploy target for the Emscripten build, which publishes
# generated JS for particular Solidity commits into
# https://github.com/ethereum/solc-bin/tree/gh-pages/bin
# Disabled, but can be renamed when we have the "standalone" changes
# published back into the 'develop' branch.
#
#deploy:
# provider: script
# script: scripts/travis-emscripten/publish_binary.sh
# skip_cleanup: true
# on:
# branch: develop
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.0.0)

set(ETH_CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}/../webthree-helpers/cmake" CACHE PATH "The the path to the cmake directory")
set(ETH_CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake" CACHE PATH "The the path to the cmake directory")
list(APPEND CMAKE_MODULE_PATH ${ETH_CMAKE_DIR})

# Set cmake_policies
Expand All @@ -26,6 +26,7 @@ include(EthUtils)
include(EthOptions)
configure_project(TESTS)

add_subdirectory(libdevcore)
add_subdirectory(libevmasm)
add_subdirectory(libsolidity)
add_subdirectory(solc)
Expand Down
76 changes: 76 additions & 0 deletions appveyor.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#------------------------------------------------------------------------------
# Appveyor configuration file for solidity.
#
# The documentation for solidity is hosted at:
#
# http://solidity.readthedocs.org
#
# TODO - Tests currently disabled, because Tests-over-IPC code is using UNIX
# sockets unconditionally at the time of writing.
#
# ------------------------------------------------------------------------------
# This file is part of cpp-ethereum.
#
# cpp-ethereum is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# cpp-ethereum is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>
#
# (c) 2016 cpp-ethereum contributors.
#------------------------------------------------------------------------------

version: 0.3.5.{build}
skip_tags: true
os: Visual Studio 2015
configuration:
- RelWithDebInfo
cache: build
install:
- git submodule update --init --recursive
- scripts/install_deps.bat
- set ETHEREUM_DEPS_PATH=%APPVEYOR_BUILD_FOLDER%\deps\install
before_build:
- if not exist build mkdir build
- cd build
- cmake -G "Visual Studio 14 2015 Win64" .. -DTESTS=Off
build_script:
- msbuild solidity.sln /p:Configuration=%CONFIGURATION% /m:%NUMBER_OF_PROCESSORS% /v:minimal
- cd %APPVEYOR_BUILD_FOLDER%
- scripts\release.bat %CONFIGURATION%

#test_script:
# - cd %APPVEYOR_BUILD_FOLDER%\build\test\%CONFIGURATION%
# - copy "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\x86\Microsoft.VC140.CRT\msvc*.dll" .
# - eth.exe --test -d %TMP%/test
# - soltest.exe --ipc /tmp/test/geth.ipc
# - pkill eth

artifacts:
- path: solidity-develop-windows.zip
name: solidity-develop-windows-zip

# This is the deploy target for Windows
# which generates development ZIPs per commit. We are in agreement
# that this is probably noisy overkill, so will want to renable this
# functionality wrapped in some conditionals so that it only runs
# when building the 'release' branch.
#
#deploy:
# release: solidity-develop-v$(APPVEYOR_BUILD_VERSION)
# tag: develop-v$(APPVEYOR_BUILD_VERSION)
# description: 'Development build of solidity at commit $(APPVEYOR_REPO_COMMIT).\n\n$(APPVEYOR_REPO_COMMIT_MESSAGE)\n\nCommitted by $(APPVEYOR_REPO_COMMIT_AUTHOR), $(APPVEYOR_REPO_COMMIT_TIMESTAMP).'
# prerelease: true
# provider: GitHub
# auth_token:
# secure: yukM9mHUbzuZSS5WSBLKSW0yGJerJEqAXkFhDhSHBBcKJE7GAryjQsdO9Kxh3yRv
# artifact: solidity-develop-windows-zip
# on:
# branch: standalone_changes
161 changes: 161 additions & 0 deletions cmake/CMakeParseArguments.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
#.rst:
# CMakeParseArguments
# -------------------
#
#
#
# CMAKE_PARSE_ARGUMENTS(<prefix> <options> <one_value_keywords>
# <multi_value_keywords> args...)
#
# CMAKE_PARSE_ARGUMENTS() is intended to be used in macros or functions
# for parsing the arguments given to that macro or function. It
# processes the arguments and defines a set of variables which hold the
# values of the respective options.
#
# The <options> argument contains all options for the respective macro,
# i.e. keywords which can be used when calling the macro without any
# value following, like e.g. the OPTIONAL keyword of the install()
# command.
#
# The <one_value_keywords> argument contains all keywords for this macro
# which are followed by one value, like e.g. DESTINATION keyword of the
# install() command.
#
# The <multi_value_keywords> argument contains all keywords for this
# macro which can be followed by more than one value, like e.g. the
# TARGETS or FILES keywords of the install() command.
#
# When done, CMAKE_PARSE_ARGUMENTS() will have defined for each of the
# keywords listed in <options>, <one_value_keywords> and
# <multi_value_keywords> a variable composed of the given <prefix>
# followed by "_" and the name of the respective keyword. These
# variables will then hold the respective value from the argument list.
# For the <options> keywords this will be TRUE or FALSE.
#
# All remaining arguments are collected in a variable
# <prefix>_UNPARSED_ARGUMENTS, this can be checked afterwards to see
# whether your macro was called with unrecognized parameters.
#
# As an example here a my_install() macro, which takes similar arguments
# as the real install() command:
#
# ::
#
# function(MY_INSTALL)
# set(options OPTIONAL FAST)
# set(oneValueArgs DESTINATION RENAME)
# set(multiValueArgs TARGETS CONFIGURATIONS)
# cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}"
# "${multiValueArgs}" ${ARGN} )
# ...
#
#
#
# Assume my_install() has been called like this:
#
# ::
#
# my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub)
#
#
#
# After the cmake_parse_arguments() call the macro will have set the
# following variables:
#
# ::
#
# MY_INSTALL_OPTIONAL = TRUE
# MY_INSTALL_FAST = FALSE (this option was not used when calling my_install()
# MY_INSTALL_DESTINATION = "bin"
# MY_INSTALL_RENAME = "" (was not used)
# MY_INSTALL_TARGETS = "foo;bar"
# MY_INSTALL_CONFIGURATIONS = "" (was not used)
# MY_INSTALL_UNPARSED_ARGUMENTS = "blub" (no value expected after "OPTIONAL"
#
#
#
# You can then continue and process these variables.
#
# Keywords terminate lists of values, e.g. if directly after a
# one_value_keyword another recognized keyword follows, this is
# interpreted as the beginning of the new option. E.g.
# my_install(TARGETS foo DESTINATION OPTIONAL) would result in
# MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION
# would be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefor.

#=============================================================================
# Copyright 2010 Alexander Neundorf <[email protected]>
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
# License text for the above reference.)


if(__CMAKE_PARSE_ARGUMENTS_INCLUDED)
return()
endif()
set(__CMAKE_PARSE_ARGUMENTS_INCLUDED TRUE)


function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames)
# first set all result variables to empty/FALSE
foreach(arg_name ${_singleArgNames} ${_multiArgNames})
set(${prefix}_${arg_name})
endforeach()

foreach(option ${_optionNames})
set(${prefix}_${option} FALSE)
endforeach()

set(${prefix}_UNPARSED_ARGUMENTS)

set(insideValues FALSE)
set(currentArgName)

# now iterate over all arguments and fill the result variables
foreach(currentArg ${ARGN})
list(FIND _optionNames "${currentArg}" optionIndex) # ... then this marks the end of the arguments belonging to this keyword
list(FIND _singleArgNames "${currentArg}" singleArgIndex) # ... then this marks the end of the arguments belonging to this keyword
list(FIND _multiArgNames "${currentArg}" multiArgIndex) # ... then this marks the end of the arguments belonging to this keyword

if(${optionIndex} EQUAL -1 AND ${singleArgIndex} EQUAL -1 AND ${multiArgIndex} EQUAL -1)
if(insideValues)
if("${insideValues}" STREQUAL "SINGLE")
set(${prefix}_${currentArgName} ${currentArg})
set(insideValues FALSE)
elseif("${insideValues}" STREQUAL "MULTI")
list(APPEND ${prefix}_${currentArgName} ${currentArg})
endif()
else()
list(APPEND ${prefix}_UNPARSED_ARGUMENTS ${currentArg})
endif()
else()
if(NOT ${optionIndex} EQUAL -1)
set(${prefix}_${currentArg} TRUE)
set(insideValues FALSE)
elseif(NOT ${singleArgIndex} EQUAL -1)
set(currentArgName ${currentArg})
set(${prefix}_${currentArgName})
set(insideValues "SINGLE")
elseif(NOT ${multiArgIndex} EQUAL -1)
set(currentArgName ${currentArg})
set(${prefix}_${currentArgName})
set(insideValues "MULTI")
endif()
endif()

endforeach()

# propagate the result variables to the caller:
foreach(arg_name ${_singleArgNames} ${_multiArgNames} ${_optionNames})
set(${prefix}_${arg_name} ${${prefix}_${arg_name}} PARENT_SCOPE)
endforeach()
set(${prefix}_UNPARSED_ARGUMENTS ${${prefix}_UNPARSED_ARGUMENTS} PARENT_SCOPE)

endfunction()
Loading

0 comments on commit 4ee2114

Please sign in to comment.