unofficial mirror of help-guix@gnu.org 
 help / color / mirror / Atom feed
* Troubles building "nimble" with nim
@ 2022-07-06 17:57 Trev
  2022-07-20 15:16 ` Efraim Flashner
  0 siblings, 1 reply; 3+ messages in thread
From: Trev @ 2022-07-06 17:57 UTC (permalink / raw)
  To: GUIX Help


[-- Attachment #1.1: Type: text/plain, Size: 5400 bytes --]


Hello Guix!

I am in the weeds while trying to properly build "nimble", the package
manager that is included with the nim programming language. The current
guix package (gnu/packages/nim) completely misses this build step. I
wonder if previous contributors also struggled with this.

For some context I am attempting to directly replicate these steps from
https://nim-lang.org/install_unix.html:

#+BEGIN_QUOTE
sh build.sh
bin/nim c koch
./koch boot -d:release
./koch tools
#+END_QUOTE

My (and the current package record) can build the nim binary using gcc, no problem. However when we get to the part where nim builds its own features with the compiled compiler, something seems to be trying to call =/bin/sh= directly, despite hard-coded references to that process having been been substituted out.

I have submitted a ticket with Nim here just so that I may ask some thoughtful questions. That conversation is here: https://github.com/nim-lang/Nim/issues/19976

The error output is:

#+BEGIN_SRC sh
c_code/2_2/stdlib_browsers.nim.o c_code/2_2/@mnim.nim.o -ldl -lm -lrt
: SUCCESS
Hint: used config file '/tmp/guix-build-nim-1.6.6.drv-0/nim-1.6.6/config/nim.cfg' [Conf]
Hint: used config file '/tmp/guix-build-nim-1.6.6.drv-0/nim-1.6.6/config/config.nims' [Conf]
......................................................................................................................
CC: stdlib_digitsutils.nim
Error: invocation of external compiler program failed. No such file or directory
Additional info: Could not find command: '/bin/sh'. OS error: No such file or directory 2
error: in phase 'build': uncaught exception:
%exception #<&invoke-error program: "./bin/nim" arguments: ("c" "koch") exit-status: 1 term-signal: #f stop-signal: #f> 
phase `build' failed after 96.6 seconds
command "./bin/nim" "c" "koch" failed with status 1
#+END_SRC

My current attempt at packaging this looks like this:

#+BEGIN_SRC scheme
(define-module (gnu packages nim)
  #:use-module (guix build-system gnu)
  #:use-module (guix gexp)
  #:use-module (guix download)
  #:use-module ((guix licenses) #:prefix license:)
  #:use-module (guix packages)
  #:use-module (gnu packages pcre)
  #:use-module (gnu packages tls)
  #:use-module (gnu packages cmake))

(define-public nim
  (package
    (name "nim")
    (version "1.6.6")
    (source
     (origin
       (method url-fetch)
       (uri (string-append "https://nim-lang.org/download/"
                           name "-" version ".tar.xz"))
       (sha256
        (base32 "0lm4450ig8k4l3rzxv6kcqji5l1lzicsw76ckwxm0q9qdz713cb7"))))
    (build-system gnu-build-system)
    (native-inputs (list pcre openssl cmake))
    (arguments
     `(#:tests? #f ; No tests.
       #:phases
       (modify-phases %standard-phases
         (delete 'configure) ; no configure script
         (add-after 'unpack 'patch-installer
           (lambda* (#:key outputs #:allow-other-keys)
             (let ((out (assoc-ref outputs "out")))
               (substitute* "install.sh"
                 (("/usr/") (string-append out "/usr/"))
                 (("/etc/") (string-append out "/etc/"))
                 (("/opt/") (string-append out "/opt/")))
               #t)))
         (add-after 'patch-source-shebangs 'patch-more-shebangs
           (lambda _
             (let ((sh (which "sh")))
               (substitute* '("tests/stdlib/tosprocterminate.nim"
                              "tests/stdlib/tstrscans.nim"
                              "lib/pure/osproc.nim")
                 (("/bin/sh") sh))
               (substitute* (find-files "c_code" "stdlib_osproc.c")
                 (("\"/bin/sh\", 7") (format #f "~s, ~s" sh (string-length sh)))))
             #t))
         (replace 'build
           (lambda _
             (setenv "XDG_CACHE_HOME" "./cache-home")
             (mkdir-p "./cache-home")
             (invoke "sh" "build.sh")
             (invoke "./bin/nim" "c" "koch")
             (invoke "koch" "boot" "-d:release")
             (invoke "koch" "tools")
             #t))
         (replace 'install
           (lambda* (#:key outputs #:allow-other-keys)
             (let ((out (assoc-ref outputs "out")))
               (mkdir-p (string-append out "/usr/bin"))
               (invoke "./install.sh" (string-append out "/usr/bin"))
               #t))))))
    (home-page "https://nim-lang.org")
    (synopsis "Statically-typed, imperative programming language")
    (description "Nim (formerly known as Nimrod) is a statically-typed,
imperative programming language that tries to give the programmer ultimate power
without compromises on runtime efficiency.  This means it focuses on compile-time
mechanisms in all their various forms.")
    (license license:expat)))
#+END_SRC

I have tried:

1. Symlinking (without any success) /bin/sh to (which "bash")
2. Exporting $SHELL to (which "bash")
3. Attempted (without much luck) to ~alias cc=gcc~ to see if it's not the shell that's missing, it's the command "cc", and adding cmake as a separate input
4. Grokking the Nim source code that I don't perfectly understand to see how it could somehow decide to call something that isn't on path aside from a string that's "/bin/sh".
   
If someone appreciates packaging this better than can share some wisdom, it would be appreciated.


[-- Attachment #1.2: Type: text/plain, Size: 66 bytes --]

-- 

Trev : 0FB7 D06B 4A2A F07E AD5B  1169 183B 6306 8AA1 D206

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 251 bytes --]

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

* Re: Troubles building "nimble" with nim
  2022-07-06 17:57 Troubles building "nimble" with nim Trev
@ 2022-07-20 15:16 ` Efraim Flashner
  2022-07-24 15:13   ` Trev
  0 siblings, 1 reply; 3+ messages in thread
From: Efraim Flashner @ 2022-07-20 15:16 UTC (permalink / raw)
  To: Trev; +Cc: GUIX Help

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

On Wed, Jul 06, 2022 at 10:57:08AM -0700, Trev wrote:
> 
> Hello Guix!
> 
> I am in the weeds while trying to properly build "nimble", the package
> manager that is included with the nim programming language. The current
> guix package (gnu/packages/nim) completely misses this build step. I
> wonder if previous contributors also struggled with this.
> 
> For some context I am attempting to directly replicate these steps from
> https://nim-lang.org/install_unix.html:
> 
> #+BEGIN_QUOTE
> sh build.sh
> bin/nim c koch
> ./koch boot -d:release
> ./koch tools
> #+END_QUOTE
> 
> My (and the current package record) can build the nim binary using gcc, no problem. However when we get to the part where nim builds its own features with the compiled compiler, something seems to be trying to call =/bin/sh= directly, despite hard-coded references to that process having been been substituted out.
> 
> I have submitted a ticket with Nim here just so that I may ask some thoughtful questions. That conversation is here: https://github.com/nim-lang/Nim/issues/19976
> 
> The error output is:
> 
> #+BEGIN_SRC sh
> c_code/2_2/stdlib_browsers.nim.o c_code/2_2/@mnim.nim.o -ldl -lm -lrt
> : SUCCESS
> Hint: used config file '/tmp/guix-build-nim-1.6.6.drv-0/nim-1.6.6/config/nim.cfg' [Conf]
> Hint: used config file '/tmp/guix-build-nim-1.6.6.drv-0/nim-1.6.6/config/config.nims' [Conf]
> ......................................................................................................................
> CC: stdlib_digitsutils.nim
> Error: invocation of external compiler program failed. No such file or directory
> Additional info: Could not find command: '/bin/sh'. OS error: No such file or directory 2
> error: in phase 'build': uncaught exception:
> %exception #<&invoke-error program: "./bin/nim" arguments: ("c" "koch") exit-status: 1 term-signal: #f stop-signal: #f> 
> phase `build' failed after 96.6 seconds
> command "./bin/nim" "c" "koch" failed with status 1
> #+END_SRC
> 
> My current attempt at packaging this looks like this:
> 
> #+BEGIN_SRC scheme
> (define-module (gnu packages nim)
>   #:use-module (guix build-system gnu)
>   #:use-module (guix gexp)
>   #:use-module (guix download)
>   #:use-module ((guix licenses) #:prefix license:)
>   #:use-module (guix packages)
>   #:use-module (gnu packages pcre)
>   #:use-module (gnu packages tls)
>   #:use-module (gnu packages cmake))
> 
> (define-public nim
>   (package
>     (name "nim")
>     (version "1.6.6")
>     (source
>      (origin
>        (method url-fetch)
>        (uri (string-append "https://nim-lang.org/download/"
>                            name "-" version ".tar.xz"))
>        (sha256
>         (base32 "0lm4450ig8k4l3rzxv6kcqji5l1lzicsw76ckwxm0q9qdz713cb7"))))
>     (build-system gnu-build-system)
>     (native-inputs (list pcre openssl cmake))
>     (arguments
>      `(#:tests? #f ; No tests.
>        #:phases
>        (modify-phases %standard-phases
>          (delete 'configure) ; no configure script
>          (add-after 'unpack 'patch-installer
>            (lambda* (#:key outputs #:allow-other-keys)
>              (let ((out (assoc-ref outputs "out")))
>                (substitute* "install.sh"
>                  (("/usr/") (string-append out "/usr/"))
>                  (("/etc/") (string-append out "/etc/"))
>                  (("/opt/") (string-append out "/opt/")))
>                #t)))
>          (add-after 'patch-source-shebangs 'patch-more-shebangs
>            (lambda _
>              (let ((sh (which "sh")))
>                (substitute* '("tests/stdlib/tosprocterminate.nim"
>                               "tests/stdlib/tstrscans.nim"
>                               "lib/pure/osproc.nim")
>                  (("/bin/sh") sh))
>                (substitute* (find-files "c_code" "stdlib_osproc.c")

try changing this to "stdlib_osproc.nim.c"

>                  (("\"/bin/sh\", 7") (format #f "~s, ~s" sh (string-length sh)))))
>              #t))
>          (replace 'build
>            (lambda _
>              (setenv "XDG_CACHE_HOME" "./cache-home")
>              (mkdir-p "./cache-home")
>              (invoke "sh" "build.sh")
>              (invoke "./bin/nim" "c" "koch")
>              (invoke "koch" "boot" "-d:release")
>              (invoke "koch" "tools")
>              #t))
>          (replace 'install
>            (lambda* (#:key outputs #:allow-other-keys)
>              (let ((out (assoc-ref outputs "out")))
>                (mkdir-p (string-append out "/usr/bin"))
>                (invoke "./install.sh" (string-append out "/usr/bin"))
>                #t))))))
>     (home-page "https://nim-lang.org")
>     (synopsis "Statically-typed, imperative programming language")
>     (description "Nim (formerly known as Nimrod) is a statically-typed,
> imperative programming language that tries to give the programmer ultimate power
> without compromises on runtime efficiency.  This means it focuses on compile-time
> mechanisms in all their various forms.")
>     (license license:expat)))
> #+END_SRC
> 
> I have tried:
> 
> 1. Symlinking (without any success) /bin/sh to (which "bash")
> 2. Exporting $SHELL to (which "bash")
> 3. Attempted (without much luck) to ~alias cc=gcc~ to see if it's not the shell that's missing, it's the command "cc", and adding cmake as a separate input
> 4. Grokking the Nim source code that I don't perfectly understand to see how it could somehow decide to call something that isn't on path aside from a string that's "/bin/sh".
>    
> If someone appreciates packaging this better than can share some wisdom, it would be appreciated.
> 

> -- 
> 
> Trev : 0FB7 D06B 4A2A F07E AD5B  1169 183B 6306 8AA1 D206




-- 
Efraim Flashner   <efraim@flashner.co.il>   אפרים פלשנר
GPG key = A28B F40C 3E55 1372 662D  14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

* Re: Troubles building "nimble" with nim
  2022-07-20 15:16 ` Efraim Flashner
@ 2022-07-24 15:13   ` Trev
  0 siblings, 0 replies; 3+ messages in thread
From: Trev @ 2022-07-24 15:13 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: GUIX Help

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

Efraim Flashner <efraim@flashner.co.il> writes:

>
> try changing this to "stdlib_osproc.nim.c"
>

I am not sure how I missed this with grep, but I clearly did. I am able
to finish the build :D

I just need to tell the install step to move the additional binaries.

Thanks for your help!

> On Wed, Jul 06, 2022 at 10:57:08AM -0700, Trev wrote:
>> 
>> Hello Guix!
>> 
>> I am in the weeds while trying to properly build "nimble", the package
>> manager that is included with the nim programming language. The current
>> guix package (gnu/packages/nim) completely misses this build step. I
>> wonder if previous contributors also struggled with this.
>> 
>> For some context I am attempting to directly replicate these steps from
>> https://nim-lang.org/install_unix.html:
>> 
>> #+BEGIN_QUOTE
>> sh build.sh
>> bin/nim c koch
>> ./koch boot -d:release
>> ./koch tools
>> #+END_QUOTE
>> 
>> My (and the current package record) can build the nim binary using gcc, no problem. However when we get to the part where nim builds its own features with the compiled compiler, something seems to be trying to call =/bin/sh= directly, despite hard-coded references to that process having been been substituted out.
>> 
>> I have submitted a ticket with Nim here just so that I may ask some thoughtful questions. That conversation is here: https://github.com/nim-lang/Nim/issues/19976
>> 
>> The error output is:
>> 
>> #+BEGIN_SRC sh
>> c_code/2_2/stdlib_browsers.nim.o c_code/2_2/@mnim.nim.o -ldl -lm -lrt
>> : SUCCESS
>> Hint: used config file '/tmp/guix-build-nim-1.6.6.drv-0/nim-1.6.6/config/nim.cfg' [Conf]
>> Hint: used config file '/tmp/guix-build-nim-1.6.6.drv-0/nim-1.6.6/config/config.nims' [Conf]
>> ......................................................................................................................
>> CC: stdlib_digitsutils.nim
>> Error: invocation of external compiler program failed. No such file or directory
>> Additional info: Could not find command: '/bin/sh'. OS error: No such file or directory 2
>> error: in phase 'build': uncaught exception:
>> %exception #<&invoke-error program: "./bin/nim" arguments: ("c" "koch") exit-status: 1 term-signal: #f stop-signal: #f> 
>> phase `build' failed after 96.6 seconds
>> command "./bin/nim" "c" "koch" failed with status 1
>> #+END_SRC
>> 
>> My current attempt at packaging this looks like this:
>> 
>> #+BEGIN_SRC scheme
>> (define-module (gnu packages nim)
>>   #:use-module (guix build-system gnu)
>>   #:use-module (guix gexp)
>>   #:use-module (guix download)
>>   #:use-module ((guix licenses) #:prefix license:)
>>   #:use-module (guix packages)
>>   #:use-module (gnu packages pcre)
>>   #:use-module (gnu packages tls)
>>   #:use-module (gnu packages cmake))
>> 
>> (define-public nim
>>   (package
>>     (name "nim")
>>     (version "1.6.6")
>>     (source
>>      (origin
>>        (method url-fetch)
>>        (uri (string-append "https://nim-lang.org/download/"
>>                            name "-" version ".tar.xz"))
>>        (sha256
>>         (base32 "0lm4450ig8k4l3rzxv6kcqji5l1lzicsw76ckwxm0q9qdz713cb7"))))
>>     (build-system gnu-build-system)
>>     (native-inputs (list pcre openssl cmake))
>>     (arguments
>>      `(#:tests? #f ; No tests.
>>        #:phases
>>        (modify-phases %standard-phases
>>          (delete 'configure) ; no configure script
>>          (add-after 'unpack 'patch-installer
>>            (lambda* (#:key outputs #:allow-other-keys)
>>              (let ((out (assoc-ref outputs "out")))
>>                (substitute* "install.sh"
>>                  (("/usr/") (string-append out "/usr/"))
>>                  (("/etc/") (string-append out "/etc/"))
>>                  (("/opt/") (string-append out "/opt/")))
>>                #t)))
>>          (add-after 'patch-source-shebangs 'patch-more-shebangs
>>            (lambda _
>>              (let ((sh (which "sh")))
>>                (substitute* '("tests/stdlib/tosprocterminate.nim"
>>                               "tests/stdlib/tstrscans.nim"
>>                               "lib/pure/osproc.nim")
>>                  (("/bin/sh") sh))
>>                (substitute* (find-files "c_code" "stdlib_osproc.c")
>
> try changing this to "stdlib_osproc.nim.c"
>
>>                  (("\"/bin/sh\", 7") (format #f "~s, ~s" sh (string-length sh)))))
>>              #t))
>>          (replace 'build
>>            (lambda _
>>              (setenv "XDG_CACHE_HOME" "./cache-home")
>>              (mkdir-p "./cache-home")
>>              (invoke "sh" "build.sh")
>>              (invoke "./bin/nim" "c" "koch")
>>              (invoke "koch" "boot" "-d:release")
>>              (invoke "koch" "tools")
>>              #t))
>>          (replace 'install
>>            (lambda* (#:key outputs #:allow-other-keys)
>>              (let ((out (assoc-ref outputs "out")))
>>                (mkdir-p (string-append out "/usr/bin"))
>>                (invoke "./install.sh" (string-append out "/usr/bin"))
>>                #t))))))
>>     (home-page "https://nim-lang.org")
>>     (synopsis "Statically-typed, imperative programming language")
>>     (description "Nim (formerly known as Nimrod) is a statically-typed,
>> imperative programming language that tries to give the programmer ultimate power
>> without compromises on runtime efficiency.  This means it focuses on compile-time
>> mechanisms in all their various forms.")
>>     (license license:expat)))
>> #+END_SRC
>> 
>> I have tried:
>> 
>> 1. Symlinking (without any success) /bin/sh to (which "bash")
>> 2. Exporting $SHELL to (which "bash")
>> 3. Attempted (without much luck) to ~alias cc=gcc~ to see if it's not the shell that's missing, it's the command "cc", and adding cmake as a separate input
>> 4. Grokking the Nim source code that I don't perfectly understand to see how it could somehow decide to call something that isn't on path aside from a string that's "/bin/sh".
>>    
>> If someone appreciates packaging this better than can share some wisdom, it would be appreciated.
>> 
>
>> -- 
>> 
>> Trev : 0FB7 D06B 4A2A F07E AD5B  1169 183B 6306 8AA1 D206
>
>
>
>
> -- 
> Efraim Flashner   <efraim@flashner.co.il>   אפרים פלשנר
> GPG key = A28B F40C 3E55 1372 662D  14F7 41AA E7DC CA3D 8351
> Confidentiality cannot be guaranteed on emails sent or received unencrypted

-- 

Trev : 0FB7 D06B 4A2A F07E AD5B  1169 183B 6306 8AA1 D206

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 251 bytes --]

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

end of thread, other threads:[~2022-07-24 15:13 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-06 17:57 Troubles building "nimble" with nim Trev
2022-07-20 15:16 ` Efraim Flashner
2022-07-24 15:13   ` Trev

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).