gnu: Add unicorn.

* gnu/packages/emulators.scm (unicorn): New variable.
This commit is contained in:
Jakub Kądziołka 2020-03-28 00:20:31 +01:00
parent 89c98c063a
commit f43e410470
No known key found for this signature in database
GPG Key ID: E315A75846131564

@ -44,7 +44,9 @@
#:use-module (gnu packages boost)
#:use-module (gnu packages backup)
#:use-module (gnu packages cdrom)
#:use-module (gnu packages check)
#:use-module (gnu packages compression)
#:use-module (gnu packages cross-base)
#:use-module (gnu packages curl)
#:use-module (gnu packages elf)
#:use-module (gnu packages fonts)
@ -88,7 +90,8 @@
#:use-module (gnu packages web)
#:use-module (guix build-system cmake)
#:use-module (guix build-system glib-or-gtk)
#:use-module (guix build-system gnu))
#:use-module (guix build-system gnu)
#:use-module (guix build-system python))
(define-public desmume
(package
@ -1663,3 +1666,115 @@ from various forks of Gens, and improved platform portability.")
"bsnes is a Super Nintendo / Super Famicom emulator that focuses on
performance, features, and ease of use.")
(license license:gpl3)))
;; python-pwntools requires a -rc release of unicorn
(define-public unicorn
(let ((unless-x86
(lambda (code)
(if (member (%current-system) '("x86_64-linux" "i686-linux"))
'()
code))))
(package
(name "unicorn")
(version "1.0.2-rc4")
;; NOTE: unicorn ships a bundled QEMU, but with a lot of custom modifications.
(source
(origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/unicorn-engine/unicorn")
(commit version)))
(file-name (git-file-name name version))
(sha256
(base32
"17nyccgk7hpc4hab24yn57f1xnmr7kq4px98zbp2bkwcrxny8gwy"))))
(outputs '("out" "python"))
;; The main library is not written in Python, but the build process has
;; little in common with any defined build system, so we might as well
;; build on top of python-build-system and make use of all
;; the Python-specific phases that can be reused.
(build-system python-build-system)
(arguments
`(#:modules ((srfi srfi-26)
(guix build python-build-system)
(guix build utils))
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'install-bindings-to-python-output
(lambda* (#:key outputs #:allow-other-keys)
;; python-build-system will build the bindings and install them to
;; the "out" output, so change the build-internal names of the
;; outputs.
;;
;; TODO: remove this once #40469 lands, through the core-updates
;; holding zone, on master.
(set-car! (assoc "out" outputs) "lib")
(set-car! (assoc "python" outputs) "out")
#t))
(add-before 'build 'build-library
(lambda* (#:key inputs #:allow-other-keys)
(invoke "make"
"-j" (number->string (parallel-job-count))
"UNICORN_STATIC=no"
"CC=gcc")))
(add-after 'build-library 'install-library
(lambda* (#:key outputs #:allow-other-keys)
(invoke "make" "install"
"UNICORN_STATIC=no"
(string-append
"PREFIX="
(assoc-ref outputs "lib")))))
(add-before 'build 'prepare-bindings
(lambda* (#:key outputs #:allow-other-keys)
(chdir "bindings/python")
;; Set this environment variable so that the Python bindings
;; don't build their own copy of the shared object, but use
;; a dummy value such that the bindings test suite uses the
;; same mechanism for loading the library as any other user.
(setenv "LIBUNICORN_PATH" "1")
(substitute* "unicorn/unicorn.py"
(("_path_list = \\[.*")
(string-append
"_path_list = [\""
(assoc-ref outputs "lib")
;; eat the rest of the list
"/lib\"] + 0*[")))
#t))
(add-before 'check 'check-library
(lambda* (#:key outputs #:allow-other-keys)
(for-each
(lambda (suite)
(with-directory-excursion
(string-append "../../tests/" suite)
(invoke "make" "test" "CC=gcc"
,@(unless-x86
'("AS=i686-unknown-linux-gnu-as"
"OBJCOPY=i686-unknown-linux-gnu-objcopy")))))
'("unit" "regress"))
#t))
(add-after 'install 'install-samples
(lambda* (#:key outputs #:allow-other-keys)
(let* ((python-samples (find-files "." "sample_.*"))
(c-samples (find-files "../../samples" ".*\\.c"))
(python-docdir
(string-append (assoc-ref outputs "out")
"/share/doc/unicorn/samples"))
(c-docdir
(string-append (assoc-ref outputs "lib")
"/share/doc/unicorn/samples")))
(for-each (cut install-file <> c-docdir) c-samples)
(for-each (cut install-file <> python-docdir) python-samples)
#t))))))
(native-inputs
;; NOTE: cross-binutils needs to be wrapped with unless-x86, as otherwise
;; the linker provided by the package will be used, circumventing the ld-wrapper.
`(,@(unless-x86
`(("assembler-for-tests" ,(cross-binutils "i686-unknown-linux-gnu"))))
("cmocka" ,cmocka)
("hexdump-for-tests" ,util-linux)))
(home-page "http://www.unicorn-engine.org")
(synopsis "Unicorn CPU emulator framework")
(description
"Unicorn is a lightweight, multi-platform, multi-architecture CPU emulator
framework based on QEMU.")
(license license:gpl2+))))