Skip to content

Commit 382ee49

Browse files
committed
[stm] Make toplevels standalone executables.
We turn coqtop "plugins" into standalone executables, which will be installed in `COQBIN` and located using the standard `PATH` mechanism. Using dynamic linking for `coqtop` customization didn't make a lot of sense, given that only one of such "plugins" could be loaded at a time. This cleans up some code and solves two problems: - `coqtop` needing to locate plugins, - dependency issues as plugins in `stm` depended on files in `toplevel`. In order to implement this, we do some minor cleanup of the toplevel API, making it functional, and implement uniform build rules. In particular: - `stm` and `toplevel` have become library-only directories, - a new directory, `topbin`, contains the new executables, - 4 new binaries have been introduced, for coqide and the stm. - we provide a common and cleaned up way to locate toplevels.
1 parent 053812d commit 382ee49

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+256
-224
lines changed

.merlin

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ S vernac
3232
B vernac
3333
S toplevel
3434
B toplevel
35+
S topbin
36+
B topbin
3537
S plugins/ltac
3638
B plugins/ltac
3739
S API

CHANGES

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ Tactic language
3636
called by OCaml-defined tactics.
3737
- Option "Ltac Debug" now applies also to terms built using Ltac functions.
3838

39+
Coq binaries and process model
40+
41+
- Before 8.9, Coq distributed a single `coqtop` binary and a set of
42+
dynamically loadable plugins that used to take over the main loop
43+
for tasks such as IDE language server or parallel proof checking.
44+
45+
These plugins have been turned into full-fledged binaries so each
46+
different process has associated a particular binary now, in
47+
particular `coqidetop` is the CoqIDE language server, and
48+
`coq{proof,tactic,query}worker` are in charge of task-specific and
49+
parallel proof checking.
50+
3951
Changes from 8.8.0 to 8.8.1
4052
===========================
4153

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ cruftclean: ml4clean
214214

215215
indepclean:
216216
rm -f $(GENFILES)
217-
rm -f $(COQTOPBYTE) $(CHICKENBYTE)
217+
rm -f $(COQTOPBYTE) $(CHICKENBYTE) $(TOPBYTE)
218218
find . \( -name '*~' -o -name '*.cm[ioat]' -o -name '*.cmti' \) -delete
219219
rm -f */*.pp[iox] plugins/*/*.pp[iox]
220220
rm -rf $(SOURCEDOCDIR)
@@ -245,7 +245,7 @@ archclean: clean-ide optclean voclean
245245
rm -f $(ALLSTDLIB).*
246246

247247
optclean:
248-
rm -f $(COQTOPEXE) $(CHICKEN)
248+
rm -f $(COQTOPEXE) $(CHICKEN) $(TOPBIN)
249249
rm -f $(TOOLS) $(PRIVATEBINARIES) $(CSDPCERT)
250250
find . -name '*.cmx' -o -name '*.cmx[as]' -o -name '*.[soa]' -o -name '*.so' | xargs rm -f
251251

Makefile.build

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -383,29 +383,34 @@ grammar/%.cmi: grammar/%.mli
383383

384384
.PHONY: coqbinaries coqbyte
385385

386-
coqbinaries: $(COQTOPEXE) $(CHICKEN) $(CSDPCERT) $(FAKEIDE)
386+
coqbinaries: $(TOPBIN) $(CHICKEN) $(CSDPCERT) $(FAKEIDE)
387+
coqbyte: $(TOPBYTE) $(CHICKENBYTE)
387388

388-
coqbyte: $(COQTOPBYTE) $(CHICKENBYTE)
389-
390-
COQTOP_OPT=toplevel/coqtop_opt_bin.ml
391-
COQTOP_BYTE=toplevel/coqtop_byte_bin.ml
389+
# Special rule for coqtop
390+
$(COQTOPEXE): $(TOPBIN:.opt=.$(BEST))
391+
cp $< $@
392392

393-
ifeq ($(BEST),opt)
394-
$(COQTOPEXE): $(LINKCMX) $(LIBCOQRUN) $(TOPLOOPCMA:.cma=.cmxs) $(COQTOP_OPT)
393+
bin/%.opt$(EXE): topbin/%_bin.ml $(LINKCMX) $(LIBCOQRUN)
395394
$(SHOW)'COQMKTOP -o $@'
396-
$(HIDE)$(OCAMLOPT) -linkall -linkpkg -I vernac -I toplevel \
395+
$(HIDE)$(OCAMLOPT) -linkall -linkpkg $(MLINCLUDES) \
397396
-I kernel/byterun/ -cclib -lcoqrun \
398397
$(SYSMOD) -package camlp5.gramlib \
399-
$(LINKCMX) $(OPTFLAGS) $(LINKMETADATA) $(COQTOP_OPT) -o $@
398+
$(LINKCMX) $(OPTFLAGS) $(LINKMETADATA) $< -o $@
400399
$(STRIP) $@
401400
$(CODESIGN) $@
402-
else
403-
$(COQTOPEXE): $(COQTOPBYTE)
404-
cp $< $@
405-
endif
406401

402+
bin/%.byte$(EXE): topbin/%_bin.ml $(LINKCMO) $(LIBCOQRUN)
403+
$(SHOW)'COQMKTOP -o $@'
404+
$(HIDE)$(OCAMLC) -linkall -linkpkg $(MLINCLUDES) \
405+
-I kernel/byterun/ -cclib -lcoqrun $(VMBYTEFLAGS) \
406+
$(SYSMOD) -package camlp5.gramlib \
407+
$(LINKCMO) $(BYTEFLAGS) $< -o $@
408+
409+
COQTOP_BYTE=topbin/coqtop_byte_bin.ml
410+
411+
# Special rule for coqtop.byte
407412
# VMBYTEFLAGS will either contain -custom of the right -dllpath for the VM
408-
$(COQTOPBYTE): $(LINKCMO) $(LIBCOQRUN) $(TOPLOOPCMA) $(COQTOP_BYTE)
413+
$(COQTOPBYTE): $(LINKCMO) $(LIBCOQRUN) $(COQTOP_BYTE)
409414
$(SHOW)'COQMKTOP -o $@'
410415
$(HIDE)$(OCAMLC) -linkall -linkpkg -I lib -I vernac -I toplevel \
411416
-I kernel/byterun/ -cclib -lcoqrun $(VMBYTEFLAGS) \
@@ -477,7 +482,7 @@ COQMAKEFILECMO:=clib/clib.cma lib/lib.cma tools/coq_makefile.cmo
477482

478483
$(COQMAKEFILE): $(call bestobj,$(COQMAKEFILECMO))
479484
$(SHOW)'OCAMLBEST -o $@'
480-
$(HIDE)$(call bestocaml, -package str,unix,threads)
485+
$(HIDE)$(call bestocaml, -package str)
481486

482487
$(COQTEX): $(call bestobj, tools/coq_tex.cmo)
483488
$(SHOW)'OCAMLBEST -o $@'
@@ -506,9 +511,9 @@ FAKEIDECMO:=clib/clib.cma lib/lib.cma ide/document.cmo \
506511
ide/xml_printer.cmo ide/richpp.cmo ide/xmlprotocol.cmo \
507512
tools/fake_ide.cmo
508513

509-
$(FAKEIDE): $(call bestobj, $(FAKEIDECMO)) | $(IDETOPLOOPCMA:.cma=$(BESTDYN))
514+
$(FAKEIDE): $(call bestobj, $(FAKEIDECMO)) | $(IDETOP)
510515
$(SHOW)'OCAMLBEST -o $@'
511-
$(HIDE)$(call bestocaml, -I ide -package str,unix,threads)
516+
$(HIDE)$(call bestocaml, -I ide -package str -package dynlink)
512517

513518
# votour: a small vo explorer (based on the checker)
514519

Makefile.common

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@
1414
# Executables
1515
###########################################################################
1616

17-
COQTOPBYTE:=bin/coqtop.byte$(EXE)
17+
TOPBIN:=$(addsuffix .opt$(EXE), $(addprefix bin/, coqtop coqproofworker coqtacticworker coqqueryworker))
18+
TOPBYTE:=$(TOPBIN:.opt$(EXE)=.byte$(EXE))
19+
1820
COQTOPEXE:=bin/coqtop$(EXE)
21+
COQTOPBYTE:=bin/coqtop.byte$(EXE)
1922

2023
COQDEP:=bin/coqdep$(EXE)
2124
COQMAKEFILE:=bin/coq_makefile$(EXE)
@@ -107,8 +110,6 @@ CORECMA:=clib/clib.cma lib/lib.cma kernel/kernel.cma library/library.cma \
107110
parsing/parsing.cma printing/printing.cma tactics/tactics.cma vernac/vernac.cma \
108111
stm/stm.cma toplevel/toplevel.cma
109112

110-
TOPLOOPCMA:=stm/proofworkertop.cma stm/tacworkertop.cma stm/queryworkertop.cma
111-
112113
GRAMMARCMA:=grammar/grammar.cma
113114

114115
###########################################################################

Makefile.ide

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ COQIDEFLAGS=$(addprefix -I , $(IDESRCDIRS)) $(COQIDEINCLUDES)
4545

4646
IDEDEPS:=clib/clib.cma lib/lib.cma
4747
IDECMA:=ide/ide.cma
48-
IDETOPLOOPCMA=ide/coqidetop.cma
48+
IDETOPEXE=bin/coqidetop$(EXE)
49+
IDETOP=bin/coqidetop.opt$(EXE)
50+
IDETOPBYTE=bin/coqidetop.byte$(EXE)
4951

5052
LINKIDE:=$(IDEDEPS) $(IDECDEPS) $(IDECMA) ide/coqide_main.mli ide/coqide_main.ml
5153
LINKIDEOPT:=$(IDEOPTCDEPS) $(patsubst %.cma,%.cmxa,$(IDEDEPS:.cmo=.cmx)) $(IDECMA:.cma=.cmxa) ide/coqide_main.mli ide/coqide_main.ml
@@ -88,15 +90,15 @@ endif
8890

8991
coqide-files: $(IDEFILES)
9092

91-
ide-byteloop: $(IDETOPLOOPCMA)
92-
ide-optloop: $(IDETOPLOOPCMA:.cma=.cmxs)
93-
ide-toploop: ide-$(BEST)loop
93+
ide-byteloop: $(IDETOPBYTE)
94+
ide-optloop: $(IDETOP)
95+
ide-toploop: $(IDETOPEXE)
9496

9597
ifeq ($(HASCOQIDE),opt)
9698
$(COQIDE): $(LINKIDEOPT)
9799
$(SHOW)'OCAMLOPT -o $@'
98-
$(HIDE)$(OCAMLOPT) $(COQIDEFLAGS) $(OPTFLAGS) -o $@ unix.cmxa threads.cmxa lablgtk.cmxa \
99-
lablgtksourceview2.cmxa str.cmxa $(IDEFLAGS:.cma=.cmxa) $^
100+
$(HIDE)$(OCAMLOPT) $(COQIDEFLAGS) $(OPTFLAGS) -o $@ \
101+
-linkpkg -package str,unix,dynlink,threads,lablgtk2.sourceview2 $(IDEFLAGS:.cma=.cmxa) $^
100102
$(STRIP) $@
101103
else
102104
$(COQIDE): $(COQIDEBYTE)
@@ -105,8 +107,8 @@ endif
105107

106108
$(COQIDEBYTE): $(LINKIDE)
107109
$(SHOW)'OCAMLC -o $@'
108-
$(HIDE)$(OCAMLC) $(COQIDEFLAGS) $(BYTEFLAGS) -o $@ unix.cma threads.cma lablgtk.cma \
109-
lablgtksourceview2.cma str.cma $(IDEFLAGS) $(IDECDEPSFLAGS) $^
110+
$(HIDE)$(OCAMLC) $(COQIDEFLAGS) $(BYTEFLAGS) -o $@ \
111+
-linkpkg -package str,unix,dynlink,threads,lablgtk2.sourceview2 $(IDEFLAGS) $(IDECDEPSFLAGS) $^
110112

111113
ide/coqide_main.ml: ide/coqide_main.ml4 config/Makefile # no camlp5deps here
112114
$(SHOW)'CAMLP5O $<'
@@ -135,6 +137,29 @@ ide/ideutils.cmx: ide/ideutils.ml
135137
$(SHOW)'OCAMLOPT $<'
136138
$(HIDE)$(filter-out -safe-string,$(OCAMLOPT)) $(COQIDEFLAGS) $(filter-out -safe-string,$(OPTFLAGS)) -c $<
137139

140+
IDETOPCMA:=ide/ide_common.cma
141+
IDETOPCMX:=$(IDETOPCMA:.cma=.cmxa)
142+
143+
# Special rule for coqidetop
144+
$(IDETOPEXE): $(IDETOP:.opt=.$(BEST))
145+
cp $< $@
146+
147+
$(IDETOP): ide/idetop.ml $(LINKCMX) $(LIBCOQRUN) $(IDETOPCMX)
148+
$(SHOW)'COQMKTOP -o $@'
149+
$(HIDE)$(OCAMLOPT) -linkall -linkpkg $(MLINCLUDES) -I ide \
150+
-I kernel/byterun/ -cclib -lcoqrun \
151+
$(SYSMOD) -package camlp5.gramlib \
152+
$(LINKCMX) $(IDETOPCMX) $(OPTFLAGS) $(LINKMETADATA) $< -o $@
153+
$(STRIP) $@
154+
$(CODESIGN) $@
155+
156+
$(IDETOPBYTE): ide/idetop.ml $(LINKCMO) $(LIBCOQRUN) $(IDETOPCMA)
157+
$(SHOW)'COQMKTOP -o $@'
158+
$(HIDE)$(OCAMLC) -linkall -linkpkg $(MLINCLUDES) -I ide \
159+
-I kernel/byterun/ -cclib -lcoqrun $(VMBYTEFLAGS) \
160+
$(SYSMOD) -package camlp5.gramlib \
161+
$(LINKCMO) $(IDETOPCMA) $(BYTEFLAGS) $< -o $@
162+
138163
####################
139164
## Install targets
140165
####################
@@ -164,13 +189,11 @@ install-ide-bin:
164189

165190
install-ide-toploop:
166191
ifeq ($(BEST),opt)
167-
$(MKDIR) $(FULLCOQLIB)/toploop/
168-
$(INSTALLBIN) $(IDETOPLOOPCMA:.cma=.cmxs) $(FULLCOQLIB)/toploop/
192+
$(INSTALLBIN) $(IDETOPEXE) $(IDETOP) $(FULLBINDIR)
169193
endif
170194
install-ide-toploop-byte:
171195
ifneq ($(BEST),opt)
172-
$(MKDIR) $(FULLCOQLIB)/toploop/
173-
$(INSTALLBIN) $(IDETOPLOOPCMA) $(FULLCOQLIB)/toploop/
196+
$(INSTALLBIN) $(IDETOPEXE) $(IDETOPBYTE) $(FULLBINDIR)
174197
endif
175198

176199
install-ide-devfiles:
@@ -206,8 +229,7 @@ $(COQIDEAPP)/Contents:
206229
$(COQIDEINAPP): ide/macos_prehook.cmx $(LINKIDEOPT) | $(COQIDEAPP)/Contents
207230
$(SHOW)'OCAMLOPT -o $@'
208231
$(HIDE)$(OCAMLOPT) $(COQIDEFLAGS) $(OPTFLAGS) -o $@ \
209-
unix.cmxa lablgtk.cmxa lablgtksourceview2.cmxa str.cmxa \
210-
threads.cmxa $(IDEFLAGS:.cma=.cmxa) $^
232+
-linkpkg -package str,unix,dynlink,threads,lablgtk2.sourceview2 $(IDEFLAGS:.cma=.cmxa) $^
211233
$(STRIP) $@
212234

213235
$(COQIDEAPP)/Contents/Resources/share: $(COQIDEAPP)/Contents

Makefile.install

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,11 @@ endif
7070

7171
install-binaries: install-tools
7272
$(MKDIR) $(FULLBINDIR)
73-
$(INSTALLBIN) $(COQC) $(COQTOPEXE) $(CHICKEN) $(FULLBINDIR)
74-
$(MKDIR) $(FULLCOQLIB)/toploop
75-
ifeq ($(BEST),opt)
76-
$(INSTALLBIN) $(TOPLOOPCMA:.cma=.cmxs) $(FULLCOQLIB)/toploop/
77-
endif
73+
$(INSTALLBIN) $(COQC) $(CHICKEN) $(COQTOPEXE) $(TOPBIN) $(FULLBINDIR)
7874

7975
install-byte: install-coqide-byte
8076
$(MKDIR) $(FULLBINDIR)
81-
$(INSTALLBIN) $(COQTOPBYTE) $(FULLBINDIR)
82-
$(MKDIR) $(FULLCOQLIB)/toploop
83-
$(INSTALLBIN) $(TOPLOOPCMA) $(FULLCOQLIB)/toploop/
77+
$(INSTALLBIN) $(TOPBYTE) $(FULLBINDIR)
8478
$(INSTALLSH) $(FULLCOQLIB) $(LINKCMO) $(PLUGINS)
8579
ifndef CUSTOM
8680
$(INSTALLLIB) $(DLLCOQRUN) $(FULLCOQLIB)

configure.ml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ let coq_macos_version = "8.7.90" (** "[...] should be a string comprised of
1616
three non-negative, period-separated integers [...]" *)
1717
let vo_magic = 8791
1818
let state_magic = 58791
19-
let distributed_exec = ["coqtop";"coqc";"coqchk";"coqdoc";"coqworkmgr";
20-
"coqdoc";"coq_makefile";"coq-tex";"gallina";"coqwc";"csdpcert";"coqdep"]
19+
let distributed_exec =
20+
["coqtop.opt"; "coqidetop.opt"; "coqqueryworker.opt"; "coqproofworker.opt"; "coqtacticworker.opt";
21+
"coqc";"coqchk";"coqdoc";"coqworkmgr";"coq_makefile";"coq-tex";"gallina";"coqwc";"csdpcert";"coqdep"]
2122

2223
let verbose = ref false (* for debugging this script *)
2324

dev/base_include

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ let _ = Flags.in_toplevel := true
231231
let _ = Constrextern.set_extern_reference
232232
(fun ?loc _ r -> CAst.make ?loc @@ Libnames.Qualid (Nametab.shortest_qualid_of_global Id.Set.empty r));;
233233

234-
let go () = Coqloop.loop ~state:Option.(get !Coqloop.drop_last_doc)
234+
let go () = Coqloop.(loop ~opts:Option.(get !drop_args) ~state:Option.(get !drop_last_doc))
235235

236236
let _ =
237237
print_string

dev/ci/ci-pidetop.sh

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,17 @@ pidetop_CI_DIR="${CI_BUILD_DIR}/pidetop"
88

99
git_checkout "${pidetop_CI_BRANCH}" "${pidetop_CI_GITURL}" "${pidetop_CI_DIR}"
1010

11-
( cd "${pidetop_CI_DIR}" && coq_makefile -f Make -o Makefile.top && make -f Makefile.top "-j${NJOBS}" && make install-toploop -f Makefile.top )
11+
# Travis / Gitlab have different filesystem layout due to use of
12+
# `-local`. We need to improve this divergence but if we use Dune this
13+
# "local" oddity goes away automatically so not bothering...
14+
if [ -d "$COQBIN/../lib/coq" ]; then
15+
COQOCAMLLIB="$COQBIN/../lib/"
16+
COQLIB="$COQBIN/../lib/coq/"
17+
else
18+
COQOCAMLLIB="$COQBIN/../"
19+
COQLIB="$COQBIN/../"
20+
fi
1221

13-
echo -en '4\nexit' | coqtop -main-channel stdfds -toploop pidetop
22+
( cd "${pidetop_CI_DIR}" && OCAMLPATH="$COQOCAMLLIB" jbuilder build @install )
23+
24+
echo -en '4\nexit' | "$pidetop_CI_DIR/_build/install/default/bin/pidetop" -coqlib "$COQLIB" -main-channel stdfds

0 commit comments

Comments
 (0)