chicken-users
[Top][All Lists]
Advanced

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

Re: 【Deployment】


From: 亀田馬志
Subject: Re: 【Deployment】
Date: Sat, 29 Aug 2020 15:25:50 +0900

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]