unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#69554] [PATCH] build-system: cmake: Build tests depending on `#:tests?`.
@ 2024-03-04 21:48 Hartmut Goebel
  2024-03-04 22:58 ` [bug#69554] [PATCH v2] " Hartmut Goebel
  0 siblings, 1 reply; 10+ messages in thread
From: Hartmut Goebel @ 2024-03-04 21:48 UTC (permalink / raw)
  To: 69554

* guix/build/cmake-build-system.scm (configure): New paremeter `#:tests?`.
  Add cmake option "-DBUILD_TESTING=" with value "ON" or "OFF" depending
  on build-system argument `#:tests?`.
* * doc/guix.texi (Inspecting Services)[cmake-build-system]: Document it.
---
 doc/guix.texi                     | 10 ++++++++++
 guix/build/cmake-build-system.scm |  7 ++++++-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 87fe9f803c..409d076d12 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -9617,6 +9617,16 @@ parameter specifies in abstract terms the flags passed to the compiler;
 it defaults to @code{"RelWithDebInfo"} (short for ``release mode with
 debugging information''), which roughly means that code is compiled with
 @code{-O2 -g}, as is the case for Autoconf-based packages by default.
+
+Depending on the @code{#:tests?} parameter, the configure-flag
+@code{BUILD_TESTING} is set to @code{ON} resp. @code{OFF}.
+@code{BUILD_TESTING} is a
+@url{https://cmake.org/cmake/help/v3.28/module/CTest.html, standard
+defined by CMake} to enable or disable building tests.  This aims to
+save build time if tests are not run anyway, while trying to ensure
+tests are build if they should be run.  Anyhow, the CMakeLists.txt needs
+to implement handling this flag.
+
 @end defvar
 
 @defvar composer-build-system
diff --git a/guix/build/cmake-build-system.scm b/guix/build/cmake-build-system.scm
index d1ff5071be..71e8ca8a83 100644
--- a/guix/build/cmake-build-system.scm
+++ b/guix/build/cmake-build-system.scm
@@ -33,7 +33,7 @@ (define-module (guix build cmake-build-system)
 ;; Code:
 
 (define* (configure #:key outputs (configure-flags '()) (out-of-source? #t)
-                    build-type target
+                    (tests? #t) build-type target
                     #:allow-other-keys)
   "Configure the given package."
   (let* ((out        (assoc-ref outputs "out"))
@@ -62,6 +62,11 @@ (define* (configure #:key outputs (configure-flags '()) (out-of-source? #t)
                   ,(string-append "-DCMAKE_INSTALL_RPATH=" out "/lib")
                   ;; enable verbose output from builds
                   "-DCMAKE_VERBOSE_MAKEFILE=ON"
+                  ;; ask for (not) building tests depending on #:tests?
+                  ;; (CMakeLists.txt may or may not implement this check)
+                  ,@(if tests?
+                        '("-DBUILD_TESTING=OFF") ; not run anyway
+                        '("-DBUILD_TESTING=ON")) ; overwrite any default option
 
                   ;;  Cross-build
                   ,@(if target

base-commit: 3da49b1472919a62df1fe399638f23a246aa325d
-- 
2.41.0





^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [bug#69554] [PATCH v2] build-system: cmake: Build tests depending on `#:tests?`.
  2024-03-04 21:48 [bug#69554] [PATCH] build-system: cmake: Build tests depending on `#:tests?` Hartmut Goebel
@ 2024-03-04 22:58 ` Hartmut Goebel
  2024-07-15  9:40   ` Ludovic Courtès
  0 siblings, 1 reply; 10+ messages in thread
From: Hartmut Goebel @ 2024-03-04 22:58 UTC (permalink / raw)
  To: 69554

* guix/build/cmake-build-system.scm (configure): New paremeter `#:tests?`.
  Add cmake option "-DBUILD_TESTING=" with value "ON" or "OFF" depending
  on build-system argument `#:tests?`.
* * doc/guix.texi (Inspecting Services)[cmake-build-system]: Document it.
---
 doc/guix.texi                     | 10 ++++++++++
 guix/build/cmake-build-system.scm |  7 ++++++-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 87fe9f803c..409d076d12 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -9617,6 +9617,16 @@ parameter specifies in abstract terms the flags passed to the compiler;
 it defaults to @code{"RelWithDebInfo"} (short for ``release mode with
 debugging information''), which roughly means that code is compiled with
 @code{-O2 -g}, as is the case for Autoconf-based packages by default.
+
+Depending on the @code{#:tests?} parameter, the configure-flag
+@code{BUILD_TESTING} is set to @code{ON} resp. @code{OFF}.
+@code{BUILD_TESTING} is a
+@url{https://cmake.org/cmake/help/v3.28/module/CTest.html, standard
+defined by CMake} to enable or disable building tests.  This aims to
+save build time if tests are not run anyway, while trying to ensure
+tests are build if they should be run.  Anyhow, the CMakeLists.txt needs
+to implement handling this flag.
+
 @end defvar
 
 @defvar composer-build-system
diff --git a/guix/build/cmake-build-system.scm b/guix/build/cmake-build-system.scm
index d1ff5071be..3f5449c438 100644
--- a/guix/build/cmake-build-system.scm
+++ b/guix/build/cmake-build-system.scm
@@ -33,7 +33,7 @@ (define-module (guix build cmake-build-system)
 ;; Code:
 
 (define* (configure #:key outputs (configure-flags '()) (out-of-source? #t)
-                    build-type target
+                    (tests? #t) build-type target
                     #:allow-other-keys)
   "Configure the given package."
   (let* ((out        (assoc-ref outputs "out"))
@@ -62,6 +62,11 @@ (define* (configure #:key outputs (configure-flags '()) (out-of-source? #t)
                   ,(string-append "-DCMAKE_INSTALL_RPATH=" out "/lib")
                   ;; enable verbose output from builds
                   "-DCMAKE_VERBOSE_MAKEFILE=ON"
+                  ;; ask for (not) building tests depending on #:tests?
+                  ;; (CMakeLists.txt may or may not implement this check)
+                  ,@(if tests?
+                        '("-DBUILD_TESTING=ON") ; overwrite any default option
+                        '("-DBUILD_TESTING=OFF")) ; not run anyway
 
                   ;;  Cross-build
                   ,@(if target

base-commit: 3da49b1472919a62df1fe399638f23a246aa325d
-- 
2.41.0





^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [bug#69554] [PATCH v2] build-system: cmake: Build tests depending on `#:tests?`.
  2024-03-04 22:58 ` [bug#69554] [PATCH v2] " Hartmut Goebel
@ 2024-07-15  9:40   ` Ludovic Courtès
  2024-07-16 15:36     ` Hartmut Goebel
  0 siblings, 1 reply; 10+ messages in thread
From: Ludovic Courtès @ 2024-07-15  9:40 UTC (permalink / raw)
  To: Hartmut Goebel; +Cc: 69554

Hi Hartmut,

Hartmut Goebel <h.goebel@crazy-compilers.com> skribis:

> * guix/build/cmake-build-system.scm (configure): New paremeter `#:tests?`.
>   Add cmake option "-DBUILD_TESTING=" with value "ON" or "OFF" depending
>   on build-system argument `#:tests?`.
> * * doc/guix.texi (Inspecting Services)[cmake-build-system]: Document it.
> ---
>  doc/guix.texi                     | 10 ++++++++++
>  guix/build/cmake-build-system.scm |  7 ++++++-
>  2 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/doc/guix.texi b/doc/guix.texi
> index 87fe9f803c..409d076d12 100644
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -9617,6 +9617,16 @@ parameter specifies in abstract terms the flags passed to the compiler;
>  it defaults to @code{"RelWithDebInfo"} (short for ``release mode with
>  debugging information''), which roughly means that code is compiled with
>  @code{-O2 -g}, as is the case for Autoconf-based packages by default.
> +
> +Depending on the @code{#:tests?} parameter, the configure-flag
> +@code{BUILD_TESTING} is set to @code{ON} resp. @code{OFF}.
> +@code{BUILD_TESTING} is a
> +@url{https://cmake.org/cmake/help/v3.28/module/CTest.html, standard
> +defined by CMake} to enable or disable building tests.  This aims to
> +save build time if tests are not run anyway, while trying to ensure
> +tests are build if they should be run.  Anyhow, the CMakeLists.txt needs
> +to implement handling this flag.

My understanding is that ‘BUILD_TESTING’ is not standard, as the last
sentence above suggests.  Thus I’m reluctant to passing this flag
unconditionally, as I guess it would fail for ‘CMakeLists.txt’ that do
not implement it, right?

Thanks,
Ludo’.




^ permalink raw reply	[flat|nested] 10+ messages in thread

* [bug#69554] [PATCH v2] build-system: cmake: Build tests depending on `#:tests?`.
  2024-07-15  9:40   ` Ludovic Courtès
@ 2024-07-16 15:36     ` Hartmut Goebel
  2024-10-07 15:45       ` Greg Hogan
  0 siblings, 1 reply; 10+ messages in thread
From: Hartmut Goebel @ 2024-07-16 15:36 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 69554

[-- Attachment #1: Type: text/plain, Size: 801 bytes --]

Am 15.07.24 um 11:40 schrieb Ludovic Courtès:
> My understanding is that ‘BUILD_TESTING’ is not standard, as the last
> sentence above suggests.  Thus I’m reluctant to passing this flag
> unconditionally, as I guess it would fail for ‘CMakeLists.txt’ that do
> not implement it, right?

I just tested it, and all you get is a warning:

$ cat CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(doo)
$ cmake -DBUILD_TESTING=OFF .
…
-- Generating done (0.0s)
CMake Warning:
  Manually-specified variables were not used by the project:

    BUILD_TESTING


-- Build files have been written to: /tmp/xxx


-- 

Regards
Hartmut Goebel

| Hartmut Goebel          |h.goebel@crazy-compilers.com                |
|www.crazy-compilers.com  | compilers which you thought are impossible |

[-- Attachment #2: Type: text/html, Size: 2262 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [bug#69554] [PATCH v2] build-system: cmake: Build tests depending on `#:tests?`.
  2024-07-16 15:36     ` Hartmut Goebel
@ 2024-10-07 15:45       ` Greg Hogan
  2024-10-08  9:06         ` Hartmut Goebel
  0 siblings, 1 reply; 10+ messages in thread
From: Greg Hogan @ 2024-10-07 15:45 UTC (permalink / raw)
  To: Hartmut Goebel; +Cc: 69554, Ludovic Courtès

On Tue, Jul 16, 2024 at 11:37 AM Hartmut Goebel
<h.goebel@crazy-compilers.com> wrote:
>
> Am 15.07.24 um 11:40 schrieb Ludovic Courtès:
>
> My understanding is that ‘BUILD_TESTING’ is not standard, as the last
> sentence above suggests.  Thus I’m reluctant to passing this flag
> unconditionally, as I guess it would fail for ‘CMakeLists.txt’ that do
> not implement it, right?
>
> I just tested it, and all you get is a warning:
>
> $ cat CMakeLists.txt
> cmake_minimum_required(VERSION 3.0)
> project(doo)
> $ cmake -DBUILD_TESTING=OFF .
> …
> -- Generating done (0.0s)
> CMake Warning:
>  Manually-specified variables were not used by the project:
>
>    BUILD_TESTING
>
>
> -- Build files have been written to: /tmp/xxx

Hi Hartmut,

Could we detect with `cmake -L` [1] that the package has a
BUILD_TESTING option and only then pass this flag?

[1] https://cmake.org/cmake/help/latest/manual/cmake.1.html#cmdoption-cmake-L-A-H

Greg




^ permalink raw reply	[flat|nested] 10+ messages in thread

* [bug#69554] [PATCH v2] build-system: cmake: Build tests depending on `#:tests?`.
  2024-10-07 15:45       ` Greg Hogan
@ 2024-10-08  9:06         ` Hartmut Goebel
  2024-10-08 17:19           ` Greg Hogan
  0 siblings, 1 reply; 10+ messages in thread
From: Hartmut Goebel @ 2024-10-08  9:06 UTC (permalink / raw)
  To: Greg Hogan; +Cc: 69554, Ludovic Courtès

[-- Attachment #1: Type: text/plain, Size: 1222 bytes --]

Am 07.10.24 um 17:45 schrieb Greg Hogan:
> Could we detect with `cmake -L` [1] that the package has a
> BUILD_TESTING option and only then pass this flag?

Running `cmake -L` would run the configure phase. Thus we would need to 
configure twice: first to learn whether BUILD_TESTING is defined and 
then a second time to change it. We might be able to optimize this: if 
BUILD_TESTING is already set to the value we want, we can skip the 
second run. While we can hope that the second run will be cheap, if 
might not if things change depending on the values.

IMHO this is too much effort just to suppress a warning.

Anyhow, there is a much simpler solution, according to 
<https://stackoverflow.com/questions/36451368/> we could just add a line 
to the CMakeList.txt file.

$ cat CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(lalala)
set(__guix_suppress_BUILD_TESTING_warning__ "${BUILD_TESTING}")
$ cmake -DBUILD_TESTING=OFF .
…
-- Generating done (0.0s)
-- Build files have been written to: /tmp/xxx

Voila, no warning.

WDYT?

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          |h.goebel@crazy-compilers.com                |
|www.crazy-compilers.com  | compilers which you thought are impossible |

[-- Attachment #2: Type: text/html, Size: 2277 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [bug#69554] [PATCH v2] build-system: cmake: Build tests depending on `#:tests?`.
  2024-10-08  9:06         ` Hartmut Goebel
@ 2024-10-08 17:19           ` Greg Hogan
  2024-10-09  7:32             ` Hartmut Goebel
  0 siblings, 1 reply; 10+ messages in thread
From: Greg Hogan @ 2024-10-08 17:19 UTC (permalink / raw)
  To: Hartmut Goebel; +Cc: 69554, Ludovic Courtès

I think we can do this without warnings in the output logs or
modifications to the project CMakeLists.txt. We can preload
BUILD_TESTING into the cache:

$ cat cache.txt
set(BUILD_TESTING OFF CACHE BOOL "Build the testing tree.")
$ cmake --build build -C cache.txt .

It's not a "manually-specified variable" so no warning and can be
overwritten by a configure flag ("-DBUILD_TESTING=...") or from
CMakeLists.txt (as patched by the rosegarden package).

I have added a commit titled "build-system/cmake: Optionally build
tests." to my branch at
https://github.com/greghogan/guix/commits/master-cmake/ as part of a
v2 for #70031.

After resolving this feature we should look to create a branch on the
build service as with #73135.

[1] https://cmake.org/cmake/help/latest/manual/cmake.1.html#cmdoption-cmake-C
[2] https://cmake.org/cmake/help/latest/command/set.html#set-cache-entry
[3] https://cmake.org/cmake/help/book/mastering-cmake/chapter/CMake%20Cache.html




^ permalink raw reply	[flat|nested] 10+ messages in thread

* [bug#69554] [PATCH v2] build-system: cmake: Build tests depending on `#:tests?`.
  2024-10-08 17:19           ` Greg Hogan
@ 2024-10-09  7:32             ` Hartmut Goebel
  2024-10-09 15:04               ` Greg Hogan
  0 siblings, 1 reply; 10+ messages in thread
From: Hartmut Goebel @ 2024-10-09  7:32 UTC (permalink / raw)
  To: Greg Hogan; +Cc: 69554, Ludovic Courtès

[-- Attachment #1: Type: text/plain, Size: 635 bytes --]

Am 08.10.24 um 19:19 schrieb Greg Hogan:
> I think we can do this without warnings in the output logs or
> modifications to the project CMakeLists.txt. We can preload
> BUILD_TESTING into the cache:
>
> $ cat cache.txt
> set(BUILD_TESTING OFF CACHE BOOL "Build the testing tree.")

This is a neat trick!

Did you check whether this also overwrites any default in CMakeList.txt? 
Otherwise we might need to pass `-DBUILD_TESTING=…` on the command line, 
too.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          |h.goebel@crazy-compilers.com                |
|www.crazy-compilers.com  | compilers which you thought are impossible |

[-- Attachment #2: Type: text/html, Size: 1382 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [bug#69554] [PATCH v2] build-system: cmake: Build tests depending on `#:tests?`.
  2024-10-09  7:32             ` Hartmut Goebel
@ 2024-10-09 15:04               ` Greg Hogan
  2024-10-15  9:17                 ` bug#69554: " Hartmut Goebel
  0 siblings, 1 reply; 10+ messages in thread
From: Greg Hogan @ 2024-10-09 15:04 UTC (permalink / raw)
  To: Hartmut Goebel; +Cc: 69554, Ludovic Courtès

On Wed, Oct 9, 2024 at 3:32 AM Hartmut Goebel
<h.goebel@crazy-compilers.com> wrote:
>
> Am 08.10.24 um 19:19 schrieb Greg Hogan:
>
> I think we can do this without warnings in the output logs or
> modifications to the project CMakeLists.txt. We can preload
> BUILD_TESTING into the cache:
>
> $ cat cache.txt
> set(BUILD_TESTING OFF CACHE BOOL "Build the testing tree.")
>
> This is a neat trick!
>
> Did you check whether this also overwrites any default in CMakeList.txt? Otherwise we might need to pass `-DBUILD_TESTING=…` on the command line, too.

As I understand it, setting a variable in a "-C" cache file and with a
"-D" command-line argument is equivalent. The only difference is the
requisite precedence, and since we are not specifying "FORCE" for the
"-C" cache file entries any "-D" configure-flags from a Guix package
take precedence.

I also noticed the following in my simple test project, so I am
looking to also move these "-D" arguments into the "-C" cache file in
cmake-build's configure.

--8<---------------cut here---------------start------------->8---
CMake Warning:
  Manually-specified variables were not used by the project:

    CMAKE_INSTALL_LIBDIR
--8<---------------cut here---------------end--------------->8---

This persistent cache is the lowest-level scope [1] so is overwritten
by a "set" command in any CMakeLists.txt. An "option" (for example
BUILD_TESTING in the CTest module) does not affect a normal or cache
variable [2].

[1] https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#cmake-language-variables
[2] https://cmake.org/cmake/help/latest/command/option.html




^ permalink raw reply	[flat|nested] 10+ messages in thread

* bug#69554: [PATCH v2] build-system: cmake: Build tests depending on `#:tests?`.
  2024-10-09 15:04               ` Greg Hogan
@ 2024-10-15  9:17                 ` Hartmut Goebel
  0 siblings, 0 replies; 10+ messages in thread
From: Hartmut Goebel @ 2024-10-15  9:17 UTC (permalink / raw)
  To: Greg Hogan; +Cc: Ludovic Courtès, 69554-close

Hi Greg,

I did some testing with different combinations and with defining the 
option in CMakeList.txt. Everything works as I would expect. So please 
go for it.

I'm closing this patch in favor of your #70031.

-- 
Regards
Hartmut Goebel

| Hartmut Goebel          | h.goebel@crazy-compilers.com               |
| www.crazy-compilers.com | compilers which you thought are impossible |





^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2024-10-15  9:18 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-04 21:48 [bug#69554] [PATCH] build-system: cmake: Build tests depending on `#:tests?` Hartmut Goebel
2024-03-04 22:58 ` [bug#69554] [PATCH v2] " Hartmut Goebel
2024-07-15  9:40   ` Ludovic Courtès
2024-07-16 15:36     ` Hartmut Goebel
2024-10-07 15:45       ` Greg Hogan
2024-10-08  9:06         ` Hartmut Goebel
2024-10-08 17:19           ` Greg Hogan
2024-10-09  7:32             ` Hartmut Goebel
2024-10-09 15:04               ` Greg Hogan
2024-10-15  9:17                 ` bug#69554: " Hartmut Goebel

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).