trying to build the master branch from githug fails
I followed the steps from INSTALL.txt section 1 §2 (wget ...gambit-4_9_3-devel.tar.gz et.c) followed
./configure --enable-single-host --prefix=~/test
make
make bootstrap
git pull
make realclean
# again: ./configure --enable-single-host --prefix=~/test
make
----
The resulting ___CHARALPHABETICP being undefined I solved by adding a line to config.h.in:
#define ___USE_C_RTS_CHAR_OPERATIONS
But the "Ill-placed 'declare'" in _num.scm line 5525 is above my head. Looks an issue with `define-prim&proc` -- but I don't understand it.
Any help appreciated.
best
Jörg
Afficher les réponses par date
Hi Jörg. Unfortunately those steps are not correct to build the latest Gambit. I’ll interleave my comments with your message.
On May 31, 2021, at 8:16 AM, Jörg F. Wittenberger Joerg.Wittenberger@softeyes.net wrote:
trying to build the master branch from githug fails
I followed the steps from INSTALL.txt section 1 §2 (wget ...gambit-4_9_3-devel.tar.gz et.c) followed
./configure --enable-single-host --prefix=~/test
make
At this point you have a gsc/gsc that is the Gambit compiler at release 4.9.3 . No more no less.
make bootstrap
This step copies gsc/gsc to ./gsc-boot . It makes it possible to change the .scm files in ./lib or ./gsi or ./gsc and create updated .c files from those modified .scm files by running “make” (which invokes ./gsc-boot for compiling any .scm file). This is useful, for example, if you change the Gambit runtime library or the way the Gambit compiler works.
This is a nice state to be in to develop Gambit (but starting at the release 4.9.3 not the latest commit).
git pull
This step gets from github the latest commit of the master branch and in particular these updated files:
1) include/gambit.h.in, from which include/gambit.h is generated by the ./configure script 2) lib/setup.c, lib/os_io.c, etc files, which are hand-written C files of the Gambit runtime library 3) lib/_io.scm, lib/_num.scm, etc files, which are hand-written Scheme files of the Gambit runtime library 4) lib/_io.c, lib/_num.c, etc files which are files generated by some version of the Gambit compiler from lib/_io.scm, lib/_num.scm, etc ***BUT NOT THE ONES IN #3***
It is important to understand that the .c files in #4 are not consistent with the .scm files in #3. In other words trying to build Gambit with a simple “make” will fail at this point. To get out of this predicament it is necessary to generate lib/_io.c from lib/_io.scm, etc using the Gambit Scheme compiler. But the compiler ./gsc-boot is (very probably) not consistent with the current include/gambit.h . Remember that the Gambit compiler generates C code that contains calls to the macros defined in include/gambit.h so it is important to use a Gambit compiler that is “in sync” with that version of the gambit.h file. So the most recent version of the Gambit compiler must be built first…
The procedure for doing this bootstrap is part of the github repository and it will be invoked automatically when doing “make” after a “git clone …”. So all the steps you have done up to now are unnecessary towards the goal of having a build of the latest commit… it is simpler to use the steps suggested in the README:
git clone https://github.com/gambit/gambit.git cd gambit ./configure # --enable-single-host optional but recommended make # build runtime library, gsi and gsc (add -j8 if you can) make modules # compile the builtin modules (optional but recommended) make check # run self tests (optional but recommended) make doc # build the documentation sudo make install # install
If you insist on starting with a “wget …/gambit-v4_9_3-devel.tgz”, untar and “cd gambit-v4_9_3-devel” the correct next step is “git pull” and then continue at the “./configure” step.
Doing a “make” before the “git pull” is OK, but it isn’t a useful step towards having a build of the latest Gambit. The thing to avoid is to do a “make bootstrap” after the “make” (and before the “git pull”) because that will create a ./gsc-boot that is the Gambit compiler at release 4.9.3 and it will not work for the code that will be obtained by the “git pull”.
Why is Gambit’s build procedure like this? For most projects on github when you do a “git clone …” the .c files obtained are the most recent source files and whenever you do a “git pull” the new .c files are all “current” and a “make” will work. The Gambit generated .c files (lib/_io.c, lib/_num.c, etc) could be pushed to the github repository whenever lib/_io.scm. lib/_num.scm, etc are modified. This policy would avoid the need for the bootstrap step. However, a small modification of a .scm file usually results in a large number of changes of the generated .c file so this policy would tend to grow the git history much much faster (to the point of becoming impractical to keep it around). That’s why the policy that is used is to only push the generated .c files when a new release of Gambit is created. This makes it possible to build releases without a bootstrap step.
I hope this clarifies things!
Marc
make realclean
# again: ./configure --enable-single-host --prefix=~/test
make
The resulting ___CHARALPHABETICP being undefined I solved by adding a line to config.h.in:
#define ___USE_C_RTS_CHAR_OPERATIONS
But the "Ill-placed 'declare'" in _num.scm line 5525 is above my head. Looks an issue with `define-prim&proc` -- but I don't understand it.
Any help appreciated.
best
Jörg
Gambit-list mailing list Gambit-list@iro.umontreal.ca https://mailman.iro.umontreal.ca/cgi-bin/mailman/listinfo/gambit-list
As things stand, it's pretty easy to make some changes to Gambit that cause it to segfault, and accidentally install that version so you can't build a new Gambit without bootstrapping from the git history. Would it help to add some kind of "smoke test" at the beginning of `make install` that always runs even if you omit `make check`?
Publishing recent, known-good "boot.tgz" files at a known URL could be useful too.
Am Mon, 31 May 2021 11:21:22 -0400 schrieb Marc Feeley feeley@iro.umontreal.ca:
I hope this clarifies things!
It did. Thanks!
Now I got a working version.
[before]
If you insist on starting with a “wget …/gambit-v4_9_3-devel.tgz”
I don't insists at all. I concluded from reading the INSTALL.txt that I better do that to be sure I followed the procedure **exactly**.
What I don't understand: I tried this twice, several month ago and these days. In between I learned enough about gambit that I understand why the build process is better that way than distributing .c files generated by gambit. Still I've been trapped both times to choose the wrong way of doing things.
Looks like 4.9.3 is quite different to 4.9.2.