Skip to content
Snippets Groups Projects
Makefile 6.11 KiB
##########################################################################
#                                                                        #
#  This file is part of Frama-C.                                         #
#                                                                        #
#  Copyright (C) 2007-2022                                               #
#    CEA (Commissariat à l'énergie atomique et aux énergies              #
#         alternatives)                                                  #
#                                                                        #
#  you can redistribute it and/or modify it under the terms of the GNU   #
#  Lesser General Public License as published by the Free Software       #
#  Foundation, version 2.1.                                              #
#                                                                        #
#  It is distributed in the hope that it will be useful,                 #
#  but WITHOUT ANY WARRANTY; without even the implied warranty of        #
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         #
#  GNU Lesser General Public License for more details.                   #
#                                                                        #
#  See the GNU Lesser General Public License version 2.1                 #
#  for more details (enclosed in the file licenses/LGPLv2.1).            #
#                                                                        #
##########################################################################

# default when make is invoked without target
default:

FRAMAC_SRC=..
MAKECONFIG_DIR=$(FRAMAC_SRC)/share

include $(FRAMAC_SRC)/share/Makefile.common

DOCDIR ?= "$(DESTDIR)${prefix}/share/doc"
FRAMAC_DOCDIR ?= $(DOCDIR)/frama-c

.PHONY: .force


###################
# Frama-C Version #
###################

VERSION=$(shell $(SED) -e 's/\\(.*\\)/\\1/' $(FRAMAC_SRC)/VERSION)
VERSION_CODENAME=$(shell cat $(FRAMAC_SRC)/VERSION_CODENAME)
VERSION_SAFE=$(subst ~,-,$(VERSION))

ifeq ($(findstring +dev,$(VERSION)),+dev)

# Developpement version, generate the manuals
default: all

else

# Distributed version, download the manuals by default
default: download

MANUALS=acsl

#MANUALS that depend on the frama-c version
VERSIONED_MANUALS=acsl-implementation aorai-manual rte-manual	\
		  wp-manual metrics-manual user-manual		\
		  plugin-development-guide eva-manual

FILES= $(addprefix manuals/, \
	 $(addsuffix -$(VERSION).pdf, $(VERSIONED_MANUALS)) \
         $(addsuffix .pdf, $(MANUALS)) \
	)

download: .force
	$(MKDIR) manuals
	wget -nv -N -P manuals \
	  $(addprefix http://frama-c.com/download/,$(addsuffix -$(VERSION).pdf, $(VERSIONED_MANUALS))) \
	  $(addprefix http://frama-c.com/download/,$(addsuffix .pdf, $(MANUALS)))

install:
	$(MKDIR) $(FRAMAC_DOCDIR)
	$(CP) $(FILES) $(FRAMAC_DOCDIR)

endif


###################
# Generation      #
###################

FC_SUFFIX=$(VERSION_SAFE)-$(VERSION_CODENAME)

clean::
	$(RM) manuals/*.pdf
	$(RM) manuals/*.tgz
	$(MAKE) -C userman clean
	$(MAKE) -C developer dist-clean
	$(MAKE) -C rte clean
	$(MAKE) -C aorai clean
	$(MAKE) -C value clean
	$(MAKE) -C metrics clean
	$(MAKE) -C ../src/plugins/wp/doc/manual clean

all: \
	manuals/user-manual-$(FC_SUFFIX).pdf \
	manuals/plugin-development-guide-$(FC_SUFFIX).pdf \
	manuals/rte-manual-$(FC_SUFFIX).pdf \
	manuals/aorai-manual-$(FC_SUFFIX).pdf \
	manuals/aorai-example-$(FC_SUFFIX).tgz \
	manuals/eva-manual-$(FC_SUFFIX).pdf \
	manuals/metrics-manual-$(FC_SUFFIX).pdf \
	manuals/wp-manual-$(FC_SUFFIX).pdf \

manuals/%:
	mkdir --parent manuals
	$(CP) $< $@

%.pdf: 
	$(PRINT) Generating $@
	$(MAKE) -C $(@D) $(@F)

%.tgz: 
	$(PRINT) Generating $@
	$(MAKE) -C $(@D) $(@F)

manuals/user-manual-$(FC_SUFFIX).pdf: userman/userman.pdf
manuals/plugin-development-guide-$(FC_SUFFIX).pdf: developer/developer.pdf
manuals/rte-manual-$(FC_SUFFIX).pdf: rte/main.pdf
manuals/aorai-manual-$(FC_SUFFIX).pdf: aorai/main.pdf
manuals/aorai-example-$(FC_SUFFIX).tgz: aorai/aorai-example.tgz
manuals/eva-manual-$(FC_SUFFIX).pdf: value/main.pdf
manuals/metrics-manual-$(FC_SUFFIX).pdf: metrics/metrics.pdf
manuals/wp-manual-$(FC_SUFFIX).pdf: ../src/plugins/wp/doc/manual/wp.pdf


###################
# ACSL            #
###################

ifeq ($(wildcard acsl),)

# ACSL and E-ACSL manuals requires a clone of the acsl repository
$(info 'acsl' not in doc; try: git clone https://github.com/acsl-language/acsl.git)

else

ACSL_SUFFIX=$(shell grep acslversion acsl/version.tex | sed 's/.*{\([^{}\\]*\).*/\1/')

clean::
	$(MAKE) -C acsl super-clean

all: \
	manuals/acsl-implementation-$(FC_SUFFIX).pdf \
	manuals/acsl-$(ACSL_SUFFIX).pdf \

manuals/acsl-implementation-$(FC_SUFFIX).pdf: acsl/acsl-implementation.pdf
manuals/acsl-$(ACSL_SUFFIX).pdf: acsl/acsl.pdf


###################
# E-ACSL          #
###################

EACSL_DOC=../src/plugins/e-acsl/doc
EACSL_SUFFIX=$(shell grep 'newcommand{\\eacsllangversion' $(EACSL_DOC)/refman/main.tex | sed 's/.*{\([^{}\\]*\).*/\1/')

ifeq ($(EACSL_SUFFIX),)   

$(info "could not retrieve E-ACSL version from ../src/plugins/e-acsl/doc/refman/main.tex")

else

# Sanity check: version differences between Frama-C, and E-ACSL
ifneq ($(ACSL_SUFFIX),$(EACSL_SUFFIX))
    $(info WARNING: different versions for ACSL and E-ACSL manuals: $(ACSL_SUFFIX) versus $(EACSL_SUFFIX))
endif

clean::
	$(MAKE) -C $(EACSL_DOC)/refman/ super-clean
	$(MAKE) -C $(EACSL_DOC)/userman/ super-clean

all: \
	manuals/e-acsl-implementation-$(FC_SUFFIX).pdf \
	manuals/e-acsl-manual-$(FC_SUFFIX).pdf \
	manuals/e-acsl-$(EACSL_SUFFIX).pdf \

manuals/e-acsl-implementation-$(FC_SUFFIX).pdf: $(EACSL_DOC)/refman/e-acsl-implementation.pdf
manuals/e-acsl-manual-$(FC_SUFFIX).pdf: $(EACSL_DOC)/userman/main.pdf
manuals/e-acsl-$(EACSL_SUFFIX).pdf: $(EACSL_DOC)/refman/e-acsl.pdf

endif

# Note: The makefiles of ACSL/E-ACSL are not parallelizable when producing both
# acsl.pdf and acsl-implementation.pdf (race conditions in intermediary files,
# leading to non-deterministic errors): we have to wait for one to complete
# before making the other

acsl/acsl-implementation.pdf: | acsl/acsl.pdf
$(EACSL_DOC)/refman/e-acsl-implementation.pdf: | $(EACSL_DOC)/refman/e-acsl.pdf

endif