From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maxim Cournoyer Subject: bug#33497: [PATCH] Re: bug#33497: Our CMake package has no documentation Date: Wed, 20 Mar 2019 12:06:36 -0400 Message-ID: <875zsd7coj.fsf@gmail.com> References: <8736rp649l.fsf@apteryx.i-did-not-set--mail-host-address--so-tickle-me> <87y39h4pfk.fsf@gmail.com> <878sykiwwq.fsf@fastmail.com> <87o96glvvm.fsf@gmail.com> <874l81a26n.fsf@fastmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([209.51.188.92]:57364) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h6dkA-0007Nc-7k for bug-guix@gnu.org; Wed, 20 Mar 2019 12:07:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h6dk8-0005No-Bo for bug-guix@gnu.org; Wed, 20 Mar 2019 12:07:06 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:38561) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1h6dk6-0005M1-1Y for bug-guix@gnu.org; Wed, 20 Mar 2019 12:07:04 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1h6dk5-0004Nv-M0 for bug-guix@gnu.org; Wed, 20 Mar 2019 12:07:01 -0400 Sender: "Debbugs-submit" Resent-Message-ID: In-Reply-To: <874l81a26n.fsf@fastmail.com> (Marius Bakke's message of "Sun, 17 Mar 2019 17:36:00 +0100") List-Id: Bug reports for GNU Guix List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org Sender: "bug-Guix" To: Marius Bakke Cc: 33497@debbugs.gnu.org --=-=-= Content-Type: text/plain Marius Bakke writes: > Maxim Cournoyer writes: [...] >>> I'm not very comfortable with pulling python-sphinx into the dependency >>> closure of CMake, because then we can't update it or its dependencies >>> outside of the 'core-updates' cycle. It could also cause circular >>> dependency issues down the road. >>> >>> Would it make sense to build the documentation as a separate package? >>> In that case it can go on the master branch. >> >> I don't like the idea of having a separate package for the documentation >> of cmake because it goes against the expectations of Guix users (package >> comes with its manpage, and extra doc can be installed as extra output >> of the same package). >> >> Maybe we could have a "cmake-minimal" package we'd keep hidden and use >> by default as part of the cmake-build-system, which wouldn't include the >> doc, and the regular, user facing cmake would be the one in this patch? > > This sounds reasonable to me. Can you send a patch? :-) Here it comes, attached! Thanks to Ricardo on #guix for helping me resolve a quoting issue :-). To validate it works, I had to disable some failing test suites, using: --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=disable-broken-tests.diff diff --git a/gnu/packages/libffi.scm b/gnu/packages/libffi.scm index f47f7623b4..259ea23a67 100644 --- a/gnu/packages/libffi.scm +++ b/gnu/packages/libffi.scm @@ -106,26 +106,26 @@ conversions for values passed between the two languages.") (guix build python-build-system)) #:phases (modify-phases %standard-phases - (replace 'check - (lambda _ - (setenv "PYTHONPATH" - (string-append - (getenv "PYTHONPATH") - ":" (getcwd) "/build/" - (car (scandir "build" (cut string-prefix? "lib." <>))))) + ;; (replace 'check + ;; (lambda _ + ;; (setenv "PYTHONPATH" + ;; (string-append + ;; (getenv "PYTHONPATH") + ;; ":" (getcwd) "/build/" + ;; (car (scandir "build" (cut string-prefix? "lib." <>))))) - ;; XXX The "normal" approach of setting CC and friends does - ;; not work here. Is this the correct way of doing things? - (substitute* "testing/embedding/test_basic.py" - (("c = distutils\\.ccompiler\\.new_compiler\\(\\)") - (string-append "c = distutils.ccompiler.new_compiler();" - "c.set_executables(compiler='gcc'," - "compiler_so='gcc',linker_exe='gcc'," - "linker_so='gcc -shared')"))) - (substitute* "testing/cffi0/test_ownlib.py" - (("'cc testownlib") "'gcc testownlib")) - (invoke "py.test" "-v" "c/" "testing/") - #t)) + ;; ;; XXX The "normal" approach of setting CC and friends does + ;; ;; not work here. Is this the correct way of doing things? + ;; (substitute* "testing/embedding/test_basic.py" + ;; (("c = distutils\\.ccompiler\\.new_compiler\\(\\)") + ;; (string-append "c = distutils.ccompiler.new_compiler();" + ;; "c.set_executables(compiler='gcc'," + ;; "compiler_so='gcc',linker_exe='gcc'," + ;; "linker_so='gcc -shared')"))) + ;; (substitute* "testing/cffi0/test_ownlib.py" + ;; (("'cc testownlib") "'gcc testownlib")) + ;; (invoke "py.test" "-v" "c/" "testing/") + ;; #t)) (add-before 'check 'disable-failing-test ;; This is assumed to be a libffi issue: ;; https://bitbucket.org/cffi/cffi/issues/312/tests-failed-with-armv8 diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm index 0a483fb1db..67de01573e 100644 --- a/gnu/packages/python.scm +++ b/gnu/packages/python.scm @@ -127,7 +127,8 @@ "tk")) ;tkinter; adds 50 MiB to the closure (build-system gnu-build-system) (arguments - `(#:test-target "test" + `(#:tests? #f + #:test-target "test" #:configure-flags (list "--enable-shared" ;allow embedding "--with-system-ffi" ;build ctypes --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0001-cmake-Generate-documentation.patch Content-Transfer-Encoding: quoted-printable >From 61046db1d2087c8bf9d67480d881fa449157ffdb Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Wed, 20 Mar 2019 12:04:29 -0400 Subject: [PATCH] cmake: Generate documentation. To prevent complicating the dependencies of a core tool, a new variant, CMAKE-MINIMAL is introduced and the CMake build system is configured to use= it by default. The regular CMAKE package gains a manpage, info manual as well as HTML documentation. Fixes issue #33497 (https://bugs.gnu.org/33497). * gnu/packages/cmake.scm (gnu): Use modules (gnu packages python-xyz), (gnu packages texinfo) and (srfi srfi-1). (cmake-minimal): Rename the original cmake variable to this. [phases]{configure}: Refactor the configure script arguments into ARGS, and allow passing CONFIGURE-FLAGS to the phase. [properties]: Set the HIDDEN? property to #t. (cmake): New variable, which inherits from CMAKE-MINIMAL. [phases]{move-html-doc}: Add phase. [native-inputs]: Add PYTHON-SPHINX and TEXINFO. [outputs]: Add the "doc" output. [properties]: Clear the inherited HIDDEN? property. * guix/build-system/cmake.scm (default-cmake): Use CMAKE-MINIMAL instead of CMAKE. --- gnu/packages/cmake.scm | 95 +++++++++++++++++++++++++++---------- guix/build-system/cmake.scm | 2 +- 2 files changed, 71 insertions(+), 26 deletions(-) diff --git a/gnu/packages/cmake.scm b/gnu/packages/cmake.scm index 7772fbedb1..ed57cf0fee 100644 --- a/gnu/packages/cmake.scm +++ b/gnu/packages/cmake.scm @@ -8,6 +8,8 @@ ;;; Copyright =C2=A9 2017, 2018 Marius Bakke ;;; Copyright =C2=A9 2018 Arun Isaac ;;; Copyright =C2=A9 2018 Tobias Geerinckx-Rice +;;; Copyright =C2=A9 2019 Maxim Cournoyer + ;;; ;;; This file is part of GNU Guix. ;;; @@ -39,11 +41,16 @@ #:use-module (gnu packages file) #:use-module (gnu packages libevent) #:use-module (gnu packages ncurses) - #:use-module (gnu packages xml)) + #:use-module (gnu packages python-xyz) + #:use-module (gnu packages texinfo) + #:use-module (gnu packages xml) + #:use-module (srfi srfi-1)) =20 -(define-public cmake +;;; This minimal variant of CMake does not include the documentation. It is +;;; used by the cmake-build-system. +(define-public cmake-minimal (package - (name "cmake") + (name "cmake-minimal") (version "3.14.0") (source (origin (method url-fetch) @@ -119,25 +126,28 @@ (setenv "CMAKE_INCLUDE_PATH" (or (getenv "CPATH") (getenv "C_INCLUDE_PATH"))) #t))) + ;; CMake uses its own configure script. (replace 'configure - (lambda* (#:key outputs #:allow-other-keys) - (let ((out (assoc-ref outputs "out"))) - (invoke - "./configure" "--verbose" - (string-append "--parallel=3D" (number->string (parallel-j= ob-count))) - (string-append "--prefix=3D" out) - "--system-libs" - "--no-system-jsoncpp" ; FIXME: Circular dependency. - ;; By default, the man pages and other docs land - ;; in PREFIX/man and PREFIX/doc, but we want them - ;; in share/{man,doc}. Note that unlike - ;; autoconf-generated configure scripts, cmake's - ;; configure prepends "PREFIX/" to what we pass - ;; to --mandir and --docdir. - "--mandir=3Dshare/man" - ,(string-append - "--docdir=3Dshare/doc/cmake-" - (version-major+minor version))))))))) + (lambda* (#:key outputs (configure-flags '()) #:allow-other-key= s) + (let* ((out (assoc-ref outputs "out")) + (args `("--verbose" + ,(string-append "--parallel=3D" + (number->string (parallel-job-= count))) + ,(string-append "--prefix=3D" out) + "--system-libs" + "--no-system-jsoncpp" ; FIXME: Circular depend= ency. + ;; By default, the man pages and other docs la= nd in + ;; PREFIX/man and PREFIX/doc, but we want them= in + ;; share/{man,doc}. Note that unlike + ;; autoconf-generated configure scripts, cmake= 's + ;; configure prepends "PREFIX/" to what we pas= s to + ;; --mandir and --docdir. + "--mandir=3Dshare/man" + ,,(string-append + "--docdir=3Dshare/doc/cmake-" + (version-major+minor version)) + ,@configure-flags))) + (apply invoke "./configure" args))))))) (inputs `(("bzip2" ,bzip2) ("curl" ,curl) @@ -159,12 +169,47 @@ CMake is used to control the software compilation process using simple pla= tform and compiler independent configuration files. CMake generates native make= files and workspaces that can be used in the compiler environment of your choice= .") - (license (list license:bsd-3 ; cmake - license:bsd-4 ; cmcompress - license:bsd-2 ; cmlibarchive - license:expat ; cmjsoncpp is dual MIT/publi= c domain + (properties '((hidden? . #t))) + (license (list license:bsd-3 ; cmake + license:bsd-4 ; cmcompress + license:bsd-2 ; cmlibarchive + license:expat ; cmjsoncpp is dual MIT/public dom= ain license:public-domain)))) ; cmlibarchive/archive_getdat= e.c =20 +(define-public cmake + (package + (inherit cmake-minimal) + (name "cmake") + (arguments + (substitute-keyword-arguments (package-arguments cmake-minimal) + ((#:configure-flags configure-flags ''()) + `(append ,configure-flags + ;; Extra configure flags used to generate the documentatio= n. + '("--sphinx-info" + "--sphinx-man" + "--sphinx-html"))) + ((#:phases phases) + `(modify-phases ,phases + (add-after 'install 'move-html-doc + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out")) + (doc (assoc-ref outputs "doc")) + (html (string-append "/share/doc/cmake-" + ,(version-major+minor + (package-version cmake-minimal= )) + "/html"))) + (copy-recursively (string-append out html) + (string-append doc html)) + (delete-file-recursively (string-append out html)) + #t))))))) + ;; Extra inputs required to build the documentation. + (native-inputs + `(,@(package-native-inputs cmake-minimal) + ("python-sphinx" ,python-sphinx) + ("texinfo" ,texinfo))) + (outputs '("out" "doc")) + (properties (alist-delete 'hidden? (package-properties cmake-minimal))= ))) + (define-public emacs-cmake-mode (package (inherit cmake) diff --git a/guix/build-system/cmake.scm b/guix/build-system/cmake.scm index ee116c5a4c..ca88fadddf 100644 --- a/guix/build-system/cmake.scm +++ b/guix/build-system/cmake.scm @@ -48,7 +48,7 @@ =20 ;; Do not use `@' to avoid introducing circular dependencies. (let ((module (resolve-interface '(gnu packages cmake)))) - (module-ref module 'cmake))) + (module-ref module 'cmake-minimal))) =20 (define* (lower name #:key source inputs native-inputs outputs system target --=20 2.20.1 --=-=-= Content-Type: text/plain Thanks! Maxim --=-=-=--