I made a few tweaks to this patch before merging. Martin Becze writes: > * gnu/packages/solidity.scm: (solidity) New variable. It is a new variable, but I believe the convention for new files is just to say that, so I changed this to: * gnu/packages/solidity.scm: New file. > * gnu/local.mk (GNU_SYSTEM_MODULES): Add solidity.scm. > --- > gnu/local.mk | 1 + > gnu/packages/solidity.scm | 88 +++++++++++++++++++++++++++++++++++++++ > 2 files changed, 89 insertions(+) > create mode 100644 gnu/packages/solidity.scm > > diff --git a/gnu/local.mk b/gnu/local.mk > index 08a82c45f1..92be573355 100644 > --- a/gnu/local.mk > +++ b/gnu/local.mk > @@ -508,6 +508,7 @@ GNU_SYSTEM_MODULES = \ > %D%/packages/slang.scm \ > %D%/packages/smalltalk.scm \ > %D%/packages/sml.scm \ > + %D%/packages/solidity.scm \ > %D%/packages/speech.scm \ > %D%/packages/sphinx.scm \ > %D%/packages/spice.scm \ > diff --git a/gnu/packages/solidity.scm b/gnu/packages/solidity.scm > new file mode 100644 > index 0000000000..f67bae8146 > --- /dev/null > +++ b/gnu/packages/solidity.scm > @@ -0,0 +1,88 @@ > +;;; Copyright © 2020 Martin Becze > +;;; > +;;; This file is part of GNU Guix. > +;;; > +;;; GNU Guix 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. > +;;; > +;;; GNU Guix 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 GNU Guix. If not, see . > + > +(define-module (gnu packages solidity) > + #:use-module (gnu packages base) > + #:use-module (gnu packages boost) > + #:use-module (gnu packages maths) > + #:use-module (gnu packages serialization) > + #:use-module (gnu packages python) > + #:use-module (gnu packages ncurses) > + #:use-module (guix packages) > + #:use-module (guix git-download) > + #:use-module (guix build-system cmake) > + #:use-module ((guix licenses) #:prefix license:)) > + > +(define-public solidity > + (let ((commit "3f05b770bdbf60eca866382049ea191dd701409a")) > + (package > + (name "solidity") > + (version "0.7.4") > + (source > + (origin > + (method git-fetch) > + (uri > + (git-reference > + (url "https://github.com/ethereum/solidity") > + (commit commit))) > + (file-name (git-file-name name version)) > + (sha256 > + (base32 "1mswhjymiwnd3n7h3sjvjx5x8223yih0yvfcr0zpqr4aizpfx5z8")))) > + (build-system cmake-build-system) > + (arguments > + `(#:phases > + (modify-phases %standard-phases > + (delete 'configure) > + (delete 'install) > + (replace 'build > + (lambda* (#:key outputs #:allow-other-keys) > + (with-output-to-file "commit_hash.txt" > + (lambda _ > + (display > + (substring ,commit 0 8)))) I moved this to a different phase, just because it makes it clearer what's going on. > + ;; Unbundle jsoncpp > + (delete-file "./cmake/jsoncpp.cmake") > + (substitute* "CMakeLists.txt" > + (("include\\(jsoncpp\\)") "")) > + ;; Bug list is always sorted since we only build releases > + (substitute* "./test/cmdlineTests.sh" > + (("\"\\$REPO_ROOT\"/scripts/update_bugs_by_version\\.py") "")) > + (substitute* "./scripts/build.sh" > + (("sudo\\ make\\ install") "make install") > + (("cmake\\ ..") > + (string-append "cmake .. -DCMAKE_INSTALL_PREFIX=" > + (assoc-ref outputs "out")))) > + (setenv "CIRCLECI" "1") > + (invoke "./scripts/build.sh") I'd perhaps be tempted to just use/adjust the cmake-build-system to handle the actual building. Just using cmake/make directly seems to be documented [1]. 1: https://docs.soliditylang.org/en/v0.7.4/installing-solidity.html#command-line-build I noticed the build.sh script hardcodes the concurrency [2], which got me thinking this. 2: https://github.com/ethereum/solidity/blob/develop/scripts/build.sh#L21 Anyway, calling build.sh is also OK. > + #t)) > + (replace 'check > + (lambda _ > + (invoke "./scripts/tests.sh") > + #t))))) > + (native-inputs > + `(("boost-static" ,boost-static) > + ("jsoncpp" ,jsoncpp) > + ("python" ,python) > + ("tput" ,ncurses) > + ("xargs" ,findutils) > + ("z3" ,z3))) So, some of these inputs are still referenced by the package at runtime, which is a strong signal that they should be inputs, rather than native inputs. I split it like this: (inputs `(("boost-static" ,boost-static) ("jsoncpp" ,jsoncpp) ("z3" ,z3))) (native-inputs `(("python" ,python) ("tput" ,ncurses) ("xargs" ,findutils))) > + (home-page "https://solidity.readthedocs.io") > + (synopsis "Contract-Oriented Programming Language") > + (description > + "Solidity is a statically-typed curly-braces programming language > +designed for developing smart contracts that run on the Ethereum Virtual Machine.") > + (license license:gpl3+))))