chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 【Deployment】


From: Kristian Lein-Mathisen
Subject: Re: 【Deployment】
Date: Sat, 29 Aug 2020 18:16:47 +0200


Hi,

I'm glad there's been some progress then. Don't hesitate to keep asking.

First off, you never told us why you need to split the build process in two with the "distributing c files" approach. It creates a lot of extra work, is less tested and has little documentation as you are experiencing right now.

It is easier to either compile everything on the development machine and then distribute the binary files, or distribute the Chicken source files. What you're doing is in between: A Chicken compilation step on the development machine and then a C compilation step on the target machine. This generally isn't recommend.

It would help if you'd provide a minimal sample of code that produces the errors you're seeing with all the commands that you tried. For example, based on your error message, I can only guess you have something like this:

➤ cat hello.scm
(import format)
(format #t "hello ~A" '(1 2))

The format egg depends on srfi-13, which in turn depends on srfi-14. As you can tell, the "distributing C files" approach doesn't scale well with number of dependencies since you have to do everything by hand.

So I hope there is a way for you to build everything on the target machine, or build static binaries with csc -static - skipping the -t step altogether. 

I tried to look at how to get `format` compiled in as a .c-file, but unfortunately I wasn't able to do this from my Termux session. 

There is an --embed option in csc which could help with the "multiple definition of `main';" error messages, but I couldn't get it working with -t.

Best of luck,
K.

On Sat, Aug 29, 2020, 08:26 亀田馬志 <masashi.kameda@gmail.com> wrote:
Hello.

> Kristian-san

I'm so sorry to thank you too late.
Now I see how to use ctags and look for some particular c files defining something in Chicken Source files.

It works; but I've faced the other problem and I do not know whether I should keep posting about it or not... For two weeks, I have been trying to solve the problem.

The script I've written in Chicken Scheme reads an external data file, or text file written like this.

$GPGGA,012345,1234.56789,N,12345.67890,E,1,08,0.00,0,M,,,,*1A
$GPRMC,012345,A,1234.56789,N,12345.67890,E,000.0,123.4,,,,*1A
$GPGGA,012346,1235.00000,N,12346.00000,E,1,08,0.00,0,M,,,,
$GPRMC,012346,A,1235.00000,N,12346.00000,E,000.0,123.4,,,,
$GPGGA,012347,1236.00000,N,12347.00000,E,1,08,0.00,0,M,,,,
$GPRMC,012347,A,1236.00000,N,12347.00000,E,.000.0,123.4,,,,

With the technique you showed me, the scheme script was compiled successfully with GCC; however, it gave me an error when I used it like this(poichan-01-1 is the name of compiled one):

➜  /tmp ./poichan-01-1 data.txt

Error: (load) unable to load compiled module - cannot load compiled code dynamically - this is a statically linked executable: "/usr/local/lib/chicken/11/format.so"

Call history:

poichan-01-1.scm:1: chicken.load#load-extension   <--
➜  /tmp 

That means, in order to make this one a stand-alone, I have to put format.scm(which is shown in this: https://www.upyum.com/eggs-repo/egg-repositories.5.html ) in the directory, and compile it together. I tried that; however,

➜  poichan-01 gcc -DHAVE_CHICKEN_CONFIG_H poichan-01-1.c -I . runtime.c library.c eval.c expand.c modules.c internal.c chicken-syntax.c build-version.c extras.c data-structures.c format.c -lm -o poichan-01-1

/usr/bin/ld: /tmp/ccC5fVZw.o: in function `main':
format.c:(.text+0x50772): multiple definition of `main'; /tmp/cc2oxINt.o:poichan-01-1.c:(.text+0x4610): first defined here
/usr/bin/ld: /tmp/ccC5fVZw.o: in function `C_toplevel':
format.c:(.text+0x5079f): multiple definition of `C_toplevel'; /tmp/cc2oxINt.o:poichan-01-1.c:(.text+0x463d): first defined here
/usr/bin/ld: /tmp/ccC5fVZw.o: in function `f_1526':
format.c:(.text+0x27ef): undefined reference to `C_port_toplevel'
collect2: error: ld returned 1 exit status

This time, C_port_toplevel.......
O.K.! Now is the time what Kristian-san told me would work. I went back to the Chicken Source directory and used ctags to find the file defining C_port_toplevel.

➜  chicken-5.2.0 ctags *.c
➜  chicken-5.2.0 grep C_port_toplevel tags
C_noret chicken-install.c /^C_externimport void C_ccall C_port_toplevel(C_word c,C_word *av) C_noret;$/;" v
C_noret csi.c /^C_externimport void C_ccall C_port_toplevel(C_word c,C_word *av) C_noret;$/;" v
C_noret posixunix.c /^C_externimport void C_ccall C_port_toplevel(C_word c,C_word *av) C_noret;$/;" v
C_noret posixwin.c /^C_externimport void C_ccall C_port_toplevel(C_word c,C_word *av) C_noret;$/;" v
C_noret stub.c /^C_externimport void C_ccall C_port_toplevel(C_word c,C_word *av) C_noret;$/;" v
C_port_toplevel port.c /^void C_ccall C_port_toplevel(C_word c,C_word *av){$/;"f

It seemed that "port.c" must have C_port_toplevel. I copied that in the directory I was working, and tried compiling the files again.

➜  poichan-01 gcc -DHAVE_CHICKEN_CONFIG_H poichan-01-1.c -I . runtime.c library.c eval.c expand.c modules.c internal.c chicken-syntax.c build-version.c extras.c data-structures.c format.c port.c -lm -o poichan-01-1

/usr/bin/ld: /tmp/cc0KJnH4.o: in function `main':
format.c:(.text+0x50772): multiple definition of `main'; /tmp/ccs80BV2.o:poichan-01-1.c:(.text+0x4610): first defined here
/usr/bin/ld: /tmp/cc0KJnH4.o: in function `C_toplevel':
format.c:(.text+0x5079f): multiple definition of `C_toplevel'; /tmp/ccs80BV2.o:poichan-01-1.c:(.text+0x463d): first defined here
collect2: error: ld returned 1 exit status

AGAAAAAAIN!  What the hens happened???

So, I've tried fixing this problem and taken time.......

Well, there are some things I've noticed.

1. Don't use egg libraries if I want to compile my script into a C source. Stay in Chicken.
2. Arguments of the compiler become toooooo long. Now is the time to learn how to make Makefile.

Well, this was a tough adventure.

Thanks.

2020年8月15日(土) 18:42 Kristian Lein-Mathisen <kristianlein@gmail.com>:

Hi, 

I'm glad that helped. But I suppose I should have explained my process, instead of just giving you the end result - which clearly doesn't work once you start adding imports like you have.

The error messages you're seeing (undefined reference to `C_extras_toplevel') are coming from your C compilier. They mean that your program is using a function which isn't defined anywhere, so we need to find where C_extras_toplevel is defined.

There are probably a hundred different ways of finding the .c file which defines a function. Here's and one. Install ctags and then run this:

 ~/o/chicken-5.2.0rc1  ➤ ctags *.c
# creates a "grepable" file called tags

~/o/chicken-5.2.0rc1  ➤ grep C_extras_toplevel tags
C_extras_toplevel       extras.c        /^void C_ccall C_extras_toplevel(C_word c,C_word *av){$/;"    f   typeref:typename:void C_ccall
# so it seems we need extras.c too

 ~/o/chicken-5.2.0rc1  ➤ grep C_data_2dstructures_toplevel tags
C_data_2dstructures_toplevel    data-structures.c       /^void C_ccall C_data_2dstructures_toplevel(C_word c,C_word *av){$/;"       f       typeref:typename:void C_ccall
# and data-structures.c

 ~/o/chicken-5.2.0rc1  ➤ gcc -DHAVE_CHICKEN_CONFIG_H hello.c -I . runtime.c library.c eval.c expand.c modules.c internal.c chicken-syntax.c build-version.c extras.c data-structures.c -lm -llog -o hello

Adding those two files to the gcc command should get your program to compile properly. If not, you can find the missing .c files by grepping `tags`. 

Hope that helps.
K.

On Sat, Aug 15, 2020, 02:57 亀田馬志 <masashi.kameda@gmail.com> wrote:
Hello.

>  gcc -DHAVE_CHICKEN_CONFIG_H hello.c -I . runtime.c library.c eval.c expand.c modules.c internal.c chicken-syntax.c build-version.c -lm -o hello

Oh, yes. It works! Great! Thank you!

But......

I wrote a script like this.

(import format (chicken io) (chicken string) (chicken process-context))

(require-extension srfi-13)

(let ((file-name (car (command-line-arguments))))
  (with-input-from-file file-name
    (lambda ()
      (let loop ((ls0 '()) (c (read-line)))
        (if (eof-object? c)
            (for-each (lambda (x)
                        (format #t
                                "時刻:~A秒,北緯:~A度~A分,東経:~A度~A分~%"
                                (+ (* (cadar x) 60) (caddar x))
                                (string-take (cadr x) 2)
                                (string-drop (cadr x) 2)
                                (string-take (caddr x) 3)
                                (string-drop (caddr x) 3)))
                      (reverse ls0))
            (let ((ls1 (string-split c ",")))
              (if (string=? (car ls1) "$GPGGA")
                  (loop (cons `(,(map string->number
                                      (string-chop (list-ref ls1 1) 2))
                                ,(list-ref ls1 2)
                                ,(list-ref ls1 4)) ls0) (read-line))
                  (loop ls0 (read-line)))))))))

Sorry, some Japanese are mixed. But. Anyway.
I try compiling with your way, and gcc gives me an error like this.

/usr/bin/ld: /tmp/ccxVWfZy.o: in function `f_223':
poichan-01-1.c:(.text+0x765): undefined reference to `C_extras_toplevel'
/usr/bin/ld: /tmp/ccxVWfZy.o: in function `f_226':
poichan-01-1.c:(.text+0x92d): undefined reference to `C_data_2dstructures_toplevel'
collect2: error: ld returned 1 exit status

Hmmmm.... Is there something wrong on the code?
What are the C_extras_toplevel and C_data_wdstructures_toplevel?

If I used some libraries from chicken-install, should I use the compiled "scheme to c" file too?

There must be something more to learn around the Chicken Scheme more.....

Anyway, you have helped me a lot! Thank you.


2020年8月13日(木) 14:56 Kristian Lein-Mathisen <kristianlein@gmail.com>:

Hi,

I managed to get something working on my termux, maybe that can help you:

~/o/chicken-5.2.0rc1  ➤
echo '(print "hello")' > hello.scm           ~/o/chicken-5.2.0rc1  ➤
./csc -t hello.scm
 ~/o/chicken-5.2.0rc1  ➤
gcc -DHAVE_CHICKEN_CONFIG_H hello.c -I . runtime.c library.c eval.c expand.c modules.c internal.c chicken-syntax.c build-version.c -lm -llog -o hello
 ~/o/chicken-5.2.0rc1  ➤ ldd hello 
libm.so                                   
liblog.so
libdl.so
libc.so
 ~/o/chicken-5.2.0rc1  ➤ ./hello
hello

You can ignore -llog unless you're on Android.

So you don't need buildtag.h. Is there a reason you can't "csc -static hello.scm" or "csc -static -C -static hello.scm" which is a more common use-case?

Cheers,
K.

On Thu, Aug 13, 2020, 03:27 亀田馬志 <masashi.kameda@gmail.com> wrote:
Thanks for your reply.

> It seems there is a chicken-bin for U20.04LTS

Yes, there is BINARY. I mean I could not find a SOURCE CODE package.
(Usually, you can take source code from the Ubuntu repository if you wished to.)


> did you try compiling hello.scm to hello.c with that?

Yes, I did.
To write a single file with Scheme codes, and to compile to a SINGLE c file, it is a piece of cake.

> Are you reading the manual for Chicken 5

Yes, of course. I followed the instructions on it.
You may see there:

"Compiled to C, we get hello.c. We need the files chicken.hchicken-config.hbuildtag.h and runtime.c, which contain the basic runtime system, plus the library files build-version.cchicken-syntax.ceval.cexpand.cinternal.clibrary.c and modules.c, which contain the same functionality as the library that is linked into plain CHICKEN-compiled applications:"

However, as you may notice, there is no buildtag.h generated even though you built Chicken Scheme from its source code.
Therefore, you can not proceed to the rest process using /tmp described next.

> perhaps the manual is outdated?

OMBuddha. If what you are saying were right....what should I do!?

Thanks.


ウイルス フリー。 www.avast.com

2020年8月13日(木) 6:39 Kristian Lein-Mathisen <kristianlein@gmail.com>:

Hi,

It seems there is a chicken-bin for U20.04LTS [1], did you try compiling hello.scm to hello.c with that? What is it that you're trying to acheive?

I don't seem to have any buildtag.h either, perhaps the manual is outdated?

Are you reading the manual for Chicken 5 [2]?

K.


On Mon, Aug 10, 2020, 21:28 亀田馬志 <masashi.kameda@gmail.com> wrote:
Hello.

I tried following and obeying the instructions described in Deployment, the manual of Chicken Scheme, in order to cock-a-do-do "Distributing compiled C files", but it did not work well.

1. Ubuntu Repository provides no source code of Chicken Scheme

I'm using Ubuntu 20.04 LTS, currently an OS under the feather, and I could not find the source code of Chicken Scheme in its repository. Neither in Debian? I do not know. 
Hen_ce, I had to build Chicken Scheme from its source code.

2. Where the chick can I find buildtag.h?

I switched to using Windows 10, and made an environment of Ubuntu with WSL(Windows Subsystem for Linux). There I built a Chicken Scheme from its source, and followed the instructions. BUT. I could not find buildtag.h there even though the manual says "generated by the build process". Did I miss something? Is there any special way to get buildtag.h?

3. Anyway tried compiling "Hello World", but getting a bunch of error messages.

I did not know whether compiling with gcc worked well or not without buildtag.h, but I tried. The result was a bunch of errors, something like this:

"/usr/bin/ld: /tmp/ccJKB9L5.o: in function `C_modules_toplevel':
modules.c:(.text+0xad58): undefined reference to `C_chicken_2dsyntax_toplevel'
collect2: error: ld returned 1 exit status"

Something related to toplevel stuff did not work well. As egg-spected? Maybe, yes.

Well, is there any technique of "Distributing compiled C files" outside of the manual, or is there anything I did wrong(especially in the building process)?

Thanks, 


 

ウイルス フリー。 www.avast.com

reply via email to

[Prev in Thread] Current Thread [Next in Thread]