blob: 729ecabc653310fef70e50128b89149daf2dbed5 [file] [log] [blame]
Nico Huber5e9b1b52016-10-08 22:09:33 +02001PROOF_MODE ?= all
2
3jobs ?= 4
4
5$(foreach dep,$($(name)-deplibs), \
6 $(eval SPARKFLAGS += -aP=$($(dep)-dir)))
7
8SPARKFLAGS += -j$(jobs)
9SPARKFLAGS += -k
10SPARKFLAGS += -m
11SPARKFLAGS += --mode=$(PROOF_MODE)
12SPARKFLAGS += --report=fail
13SPARKFLAGS += --warnings=error
Nico Huber65821412018-06-04 23:13:21 +020014SPARKFLAGS += --no-inlining
Nico Hubera60324f2018-06-04 12:56:25 +020015SPARKFLAGS += --prover=z3 --steps=500 --timeout=1 # FIXME: timeout used because steps seems broken
Nico Huber5e9b1b52016-10-08 22:09:33 +020016
17quote-list = $(subst $(space),$(comma),$(patsubst %,"%",$(1)))
18
19$(name)-exclude-srcs = \
20 $(filter-out \
21 $(sort $(notdir $($(name)-proof) $($(name)-srcs) $($(name)-gens) $($(name)-extra-specs))), \
22 $(sort $(notdir \
23 $(wildcard $(addsuffix *.ad[sb],$($(name)-proof-dirs))))))
24
25# Has to reside in the working directory. gnatprove takes paths relative
26# to the directory wher it's placed and reports internal errors if used
27# with absolute paths.
28gpr := $(name).gpr
29gpr-name = $(subst -,_,$(subst .,_,$(basename $(notdir $@))))
30
31# Will be installed for inclusion
32libgpr := $(obj)/lib$(name).gpr
33
34.SECONDEXPANSION:
35
36$(gpr):
37 @printf " GENERATE $(subst $(obj)/,,$@)\n"
38 printf '$(if $($(name)-deplibs),with "%s";\n)' $($(name)-deplibs) >$@
39 echo 'library project $(gpr-name) is' >>$@
40 echo ' for Library_Name use "$(name)";' >>$@
41 echo ' for Library_Dir use "$(obj)/adalib";' >>$@
42 echo ' for Source_Dirs use' \
43 '($(call quote-list,$($(name)-proof-dirs)));' >>$@
44 echo ' for Object_Dir use "$(obj)";' >>$@
45 echo ' package Builder is' >>$@
46 echo ' for Global_Configuration_Pragmas use' \
47 '"$(abspath $(libhw-dir)/spark.adc)";' >>$@
48 echo ' end Builder;' >>$@
49 echo ' for Excluded_Source_Files use' \
50 '($(call quote-list,$($(name)-exclude-srcs)));' >>$@
51 echo 'end $(gpr-name);' >>$@
52
53.INTERMEDIATE: $(gpr)
54
55$(libgpr): $$(MAKEFILE_LIST)
56 @printf " GENERATE $(subst $(obj)/,,$@)\n"
57 printf '$(if $($(name)-deplibs),with "%s";\n)' $($(name)-deplibs) >$@
58 echo 'library project lib$(name) is' >>$@
59 echo ' for Library_Name use "$(name)";' >>$@
60 echo ' for Library_Dir use "lib";' >>$@
61 echo ' for Library_ALI_Dir use "lib";' >>$@
62 echo ' for Source_Dirs use ("proof");' >>$@
63 echo ' for Object_Dir use external ("obj", "build");' >>$@
64 echo 'end lib$(name);' >>$@
65
Nico Huberded07e82016-10-05 23:59:14 +020066$(obj)/gnatprove/gnatprove.out: $(gpr) $$($(name)-srcs) $$($(name)-gens) $(obj)/proofmode
Nico Huber5e9b1b52016-10-08 22:09:33 +020067 gnatprove -P$< $(SPARKFLAGS) -Xobj=$(abspath $(obj))
68
69proof:
70 if [ "$(PROOF_MODE)" != "$$(cat $(obj)/proofmode 2>/dev/null)" ]; then \
71 echo "$(PROOF_MODE)" >$(obj)/proofmode; \
72 fi
73 $(MAKE) $(obj)/gnatprove/gnatprove.out
74
75check: export override PROOF_MODE=check
76check: proof
77
78flow: export override PROOF_MODE=flow
79flow: proof
80
81full: export override PROOF_MODE=all
82full: proof
83
84allconfigs = $(wildcard configs/*)
85allconfigs-targets = $(addprefix allconfigs-,$(notdir $(allconfigs)))
86
87$(allconfigs-targets): allconfigs-%: configs/%
88 rm -rf proof-allconfigs/$* $(name)_$*.gpr
89 mkdir -p proof-allconfigs/$*
90 echo "$(PROOF_MODE)" >proof-allconfigs/$*/proofmode
91 $(MAKE) obj=proof-allconfigs/$* cnf=configs/$* gpr=$(name)_$*.gpr jobs=1 proof-allconfigs/$*/gnatprove/gnatprove.out
92
93proof-allconfigs: $(allconfigs-targets)
94
95clean::
96 rm -rf proof-allconfigs/
97
98.PHONY: proof check flow full $(allconfigs-targets) proof-allconfigs