Re: setup c/c++ development environment

2021-03-14 Thread Fredrik Salomonsson


Ekaitz Zarraga  writes:

> So the workflow with guix build is not very good for development but
> for CI and stuff like that because you are going to rebuild everything.

That pretty much sums it up.

> Thanks for the explanations.

No problem.

-- 
s/Fred[re]+i[ck]+/Fredrik/g



Re: setup c/c++ development environment

2021-03-13 Thread Ekaitz Zarraga
Hi,

‐‐‐ Original Message ‐‐‐
On Thursday, March 11, 2021 9:03 PM, Fredrik Salomonsson  
wrote:

>
>
> Hi Ekaitz,
>
> CC:ing the rest of the help-guix mailing list, I hope you don't mind.

Yeah sorry I messed up with the email.

> Ekaitz Zarraga eka...@elenq.tech writes:
>
> > I have a question with all this you shared.
> > Is this compiling only the needed parts or it recompiles the whole 
> > directory from scratch every time you run `guix build`?
>
> To my knowledge it will recompile everything every time you run
> `guix build`.
>
> So this method might be better suited for CI (continuous integration).
>
> But benefit with the `guix.scm` file is that you can also use the same
> file to setup the environment you need to build your package.
>
> `guix environment -l guix.scm`
> or
> `guix environment -l build-aux/guix.scm`
>
> Depending how you have layed out the guix.scm file.
>
> That will use guix to setup the environment needed to build the your
> package. And in that shell you can use:
>
> meson build
> meson compile -C build
> meson test -C build
>
> Or equivalent for other build systems. Which will support partial
> builds.
>
> Note that guix might have issues with build generated files for some
> build systems when mixing guix environment and guix build. E.g. run
> `guix environment`, generate the build files and then run `guix build`.
> It seems fine with meson, even when not filtering out the build files.
> But I have had issues with GNU autotools and permissions,
> `make distclean` before calling `guix build` is a quick workaround. A
> better option is probably to filter out those files when collecting the
> source.
>
> I hope that answers your question.


So the workflow with guix build is not very good for development but
for CI and stuff like that because you are going to rebuild everything.

Thanks for the explanations.
Ekaitz



Re: setup c/c++ development environment

2021-03-11 Thread Fredrik Salomonsson


Hi Ekaitz,

CC:ing the rest of the help-guix mailing list, I hope you don't mind.

Ekaitz Zarraga  writes:

> I have a question with all this you shared.
>
> Is this compiling only the needed parts or it recompiles the whole directory 
> from scratch every time you run `guix build`?

To my knowledge it will recompile everything every time you run
`guix build`.

So this method might be better suited for CI (continuous integration).

But benefit with the `guix.scm` file is that you can also use the same
file to setup the environment you need to build your package.

`guix environment -l guix.scm`
or
`guix environment -l build-aux/guix.scm`

Depending how you have layed out the guix.scm file.

That will use guix to setup the environment needed to build the your
package. And in that shell you can use:

meson build
meson compile -C build
meson test -C build

Or equivalent for other build systems. Which will support partial
builds.

Note that guix might have issues with build generated files for some
build systems when mixing guix environment and guix build. E.g. run
`guix environment`, generate the build files and then run `guix build`.
It seems fine with meson, even when not filtering out the build files.
But I have had issues with GNU autotools and permissions,
`make distclean` before calling `guix build` is a quick workaround. A
better option is probably to filter out those files when collecting the
source.

I hope that answers your question.

-- 
s/Fred[re]+i[ck]+/Fredrik/g



Re: setup c/c++ development environment

2021-03-04 Thread Fredrik Salomonsson


Hi Roy,

Roy Lemmon  writes:

> I would like to setup a c/c++ development environment on guix. At the moment, 
> I
> have used gcc-toolchain to bring in the compiler etc. Are other pieces
> necessary ?

That would be the bare minimum for c/c++. I would recommend using a
build system to build your stuff like GNU autotools[0], cmake[1] or
meson[2].

[0] 
https://www.gnu.org/software/automake/manual/html_node/Autotools-Introduction.html
[1] https://cmake.org/cmake/help/latest/
[2] https://mesonbuild.com/Tutorial.html

For the ease of use I would recommend meson.

A cool thing I learned from the Guix days last year was from the talk
"Just build it with Guix" by Efraim Flashner [3]. And that was using
guix to do the testing. It works really well.

[3] 
https://xana.lepiller.eu/guix-days-2020/guix-days-2020-efraim-flashner-build-it-with-guix.mp4

Here is a simplified template of what I use for C++. It uses meson to
build and googletest[4] as the testing framework. But it should be
fairly simple to change to autotools or cmake or another testing
framework, e.g. catch2 [5].

[4] https://github.com/google/googletest/blob/master/docs/primer.md
[5] https://github.com/catchorg/Catch2/blob/devel/docs/why-catch.md#top

---8<---
(use-modules
  (guix build-system meson)
  (guix gexp)
  (guix git-download)
  (guix packages)
  (guix utils)
  ((guix licenses) #:prefix license:)
  (gnu packages pkg-config)
  (gnu packages check)
  (gnu packages build-tools)
  (gnu packages gcc)
  (ice-9 popen)
  (ice-9 rdelim)
  )

;; From the talk "Just build it with Guix" by Efraim Flashner
;; presented on the Guix days 2020
;; https://guix.gnu.org/en/blog/2020/online-guix-day-announce-2/
(define %source-dir (dirname (current-filename)))

(define %git-commit
  (read-string (open-pipe "git show HEAD | head -1 | cut -d ' ' -f2" 
OPEN_READ)))

(define (skip-git-and-build-directory file stat)
  "Skip the `.git` and `build` directory when collecting the sources."
  (let ((name (basename file)))
(not (or (string=? name ".git")
 (string=? name "build")

(define-public package-name-here
  (package
(name "package-name-here")
(version (git-version "0.1.0"  "HEAD" %git-commit))
(source (local-file %source-dir
#:recursive? #t
#:select? skip-git-and-build-directory))
(build-system meson-build-system)
(arguments
 `(#:meson ,meson-0.55
   ;; Pass flags to meson
   ;; #:configure-flags '("-Dinstall=true")
   ))
(native-inputs `(("pkg-config" ,pkg-config)
 ("googletest" ,googletest)
 ("gcc" ,gcc-9)))
(synopsis "Template for building with meson.")
(description "Simple template for building with meson-0.55 and gcc-9. Using
googletest as the testing framework.")
;; (home-page "https://...;)
(license license:gpl3+)
))

package-name-here
-->8

To use it, simply copy the template above into a file called guix.scm,
update the package-name-here and version accordingly and place it at the
root of your project. Note the trailing `package-name-here` at end of
the template, which is there to return a package definition to guix.

Then you can run:

  guix build -f guix.scm

That build your project and run the tests.

If you want to place the guix.scm in a subdirectory, say build-aux.
Change 
  (define %source-dir (dirname (current-filename)))
to
  (define %source-dir (dirname (current-source-directory)))

In the template above.

After that you just run it with

  guix build -f build-aux/guix.scm

I hope that helps.

-- 
s/Fred[re]+i[ck]+/Fredrik/g



setup c/c++ development environment

2021-03-04 Thread Roy Lemmon
Hi,

I would like to setup a c/c++ development environment on guix. At the moment, I
have used gcc-toolchain to bring in the compiler etc. Are other pieces
necessary ?

Thanks
Roy