Information for developpers OVERVIEW Although the sources of camlp5 are written in camlp5 syntaxes, the distribution contain no 'magic' binary file for the first compilation. This first compilation can be done thanks to a version of the core of camlp5 written in pure ocaml syntax. Once this 'core' is compiled, all sources in revised syntax with syntax extensions can be compiled. COMPATIBILITY This distribution of camlp5 is compatible with several versions of ocaml. The problem is about the definition of ocaml syntax trees which may change from a version of ocaml to another. Since ocaml does not install the sources nor the compiled versions of its syntax tree, a copy of the necessary source files, borrowed from the source of the ocaml compiler has been done in the directory 'ocaml_stuff', in subdirectories with the ocaml version number. If the present distribution of camlp5 is not compatible with the version of ocaml you have (the command 'configure' tells you), it is possible to add it. For that, you need the sources of the ocaml distribution you have. Once done, after a 'configure' telling you that it is not compatible, do: make steal OCAML_SRC=<path-to-ocaml-sources> This creates a new directory in 'ocaml_stuff' with sources of the syntax tree of your ocaml compiler. If you want to check that the sources of the syntax tree of ocaml are up-to-date (e.g. if this is the current ocaml developpement), do: make compare_stolen OCAML_SRC=<path-to-ocaml-sources> The compatibility is also done with the file 'lib/versdep.ml', which is a module containing miscellaneous features depending to the version of OCaml. In the directory 'ocaml_src' which contains the pure OCaml sources of the Camlp5 core (see chapter TREE STRUCTURE below), there are as many versions of this files as versions of OCaml. They are named '<version>.ml' in the directory 'lib/versdep'. If you are adding a new version of OCaml, you need this file. As a first step, make a copy from a close version: cd ocaml_src/lib/versdep cp <close_version>.ml <version>.ml Then, you can redo "configure" and do "make core". If the file 'ocaml_src/lib/versdep.ml' has a compilation problems, fix them and to 'make core' again. Later, the same file 'lib/versdep.ml' in camlp5 syntax may have similar compilation problem. This file is in one examplary, thanks to IFDEF used here or there. While compiling with some specific version of ocaml, this file is compiled with 'OCAML_vers' defined where 'vers' is the version number form the beginning to the first space or charcter '+' with all dots converted into underscores. For example, if your ocaml version is 7.04.2+dev35, you can see in the compilation process of versdep.ml that OCAML_7_04_2 is defined, and you can add statements defined by the syntax extension 'pa_macro.cmo', for example IFDEF OCAML_7_04_2. Add statements like that in 'lib/versdep.ml' to make it compile. TREE STRUCTURE The directory 'ocaml_src' contains images in pure ocaml syntax of the directories odyl lib main and meta. This allow to create a core version of camlp5 from only the ocaml compiler installed. You can decompose the building of the camlp5 core into: 1. make library_cold just makes the directory 'ocaml_src/lib' and copy the cmo and cmi files into the directory 'boot' 2. make compile_cold makes the other directories of ocaml_src 3. make promote_cold copies the executables "camlp5", "camlp5r" and the syntax extensions (cmo files) into the directory 'boot' From that point, the core camlp5 is in directory 'boot'. The real sources in the top directories odyl lib main and meta, which are written in revised syntax with some syntax extensions (grammars, quotations) can be compiled. To achieve their compilation, you can do: make core Or to compile everything do: make all or just: make Notice that doing "make core" or "make all" from scratch (after a make clean), automatically start by making the core files from their pure ocaml versions. FAST COMPILATION FROM SCRATCH ./configure make clean core compare make coreboot make all opt opt.opt TESTING CHANGES 1. do your changes 2. do: make core compare if it says that the bootstrap is ok, you can do: make all make opt make opt.opt otherwise, to make sure everything is ok, first do: make coreboot sometimes two bootstraps ('make coreboot' twice) are necessary, in particular if you change things in the directory 'lib'. It is even possible that three bootstraps are necessary. If things goes wrong, it is possible to return to the previous version by typing: make restore clean_hot then you can change what is necessary and continue by typing: make core and test the bootstrap again: make coreboot After several bootstraps (by 'make coreboot' or 'make bootstrap'), many versions are pushed in the directory 'boot' (you can type 'find boot -type d -print' to see that). If your system correctly bootstraps, you can clean that by typing: make cleanboot which keeps only two versions. (The command 'make clean' also removes these stack of versions.) BEFORE COMMITTING YOUR CHANGES Make sure that the cold start with pure ocaml sources work. For that, do: make compare_sources | less This shows you the changes that would be done in the ocaml pure sources of the directory ocaml_src. To make the new versions, do: make new_sources make promote_sources Notice that these pure ocaml sources are not supposed to be modified by hand, but only created by the above commands. Besides, their sources, although pretty printed, are sometimes not easy to read, particularly for expanded grammars (of the statement 'EXTEND'). However, if these sources do not compile, due to changes in the ocaml compiler, it is possible to edit them. In this case, similar changes may have to be done in the normal sources in revised syntax. After doing 'make new_sources' above, and before doing 'make promote_sources' below, it is possible to do 'make untouch_sources' which change the dates of the new created files with the dates of the old files if they are not modified. This way, the "svn commit" will not have to compare these files, which may have some importance if you network is not fast. The 'make new_sources' builds a directory named 'ocaml_src.new'. If this directory still exists, due to a previous 'make new_sources', the command fails. In this case, just delete it (rm -rf ocaml_src.new) without problem: this directory is not part of the distribution, it is just temporary. The 'make clean_sources' deletes old versions of ocaml_src, keeping only the last and the before last ones. The command: make bootstrap_sources is a shortcut for: make new_sources make untouch_sources make promote_sources make clean_sources If there are changes in the specific file 'lib/versdep.ml', do also: make compare_all_versdep and possibly: make bootstrap_all_versdep because this file, in 'ocaml_src/lib/versdep' directory has different versions according to the ocaml version. After having rebuilt the pure ocaml sources, check they work by rebuilding everything from scratch, starting with "configure". IF YOU CHANGE THE MAIN PARSER If you change the main parser 'meta/pa_r.ml', you may check that the quotations expanders of syntax tree 'meta/q_MLast.ml' match the new version. For that, do: cd meta make compare_q_MLast If no differences are displayed, it means that 'q_MLast.ml' is ok, relatively to 'pa_r.ml'. Otherwise, if the displayed differences seem reasonable, update the version by typing: make bootstrap_q_MLast Then returning to the top directory, do 'make core compare' and possibly 'make coreboot' (one of several times) to check the correctness of the file. And don't forget, if you want to commit, to re-create the pure ocaml sources like indicated above.