# Copyright (c) 2013 - present Facebook, Inc. # All rights reserved. # # This source code is licensed under the BSD style license found in the # LICENSE file in the root directory of this source tree. An additional grant # of patent rights can be found in the PATENTS file in the same directory. ROOT_DIR = ../.. include $(ROOT_DIR)/Makefile.config INFER_MAJOR = @INFER_MAJOR@ INFER_MINOR = @INFER_MINOR@ INFER_PATCH = @INFER_PATCH@ INFER_IS_RELEASE = @INFER_IS_RELEASE@ ATDGEN = @ATDGEN@ #### Global declarations #### BUILD_DIR = $(INFER_DIR)/_build-infer JAVA_BUILD_DIR = $(BUILD_DIR)/java CLANG_BUILD_DIR = $(BUILD_DIR)/clang LLVM_BUILD_DIR = $(BUILD_DIR)/llvm SCRIPTS_BUILD_DIR = $(BUILD_DIR)/scripts TEST_BUILD_DIR = $(BUILD_DIR)/test UNIT_BUILD_DIR = $(BUILD_DIR)/unit ANNOT_DIR = $(SRC_DIR)/_build ETC_DIR = $(INFER_DIR)/etc #### ocamlbuild options #### OCAML_FATAL_WARNINGS = +5+6+8+10+11+12+18+19+20+26+29+27+32+33+34+35+37+38+39 OCAMLBUILD_OPTIONS = \ -classic-display \ -cflags -short-paths \ -cflags -safe-string \ -cflags -principal \ -cflags -strict-formats \ -cflags -strict-sequence \ -cflags -w,$(OCAML_FATAL_WARNINGS)-4-9-40-41-42-45-48-50 \ -tag-line "<*{clang/clang_ast_*,backend/jsonbug_*}>: warn(-27-32-35-39)" \ -tag-line "not <**/{config,iList,utils}.*>: open(Utils)" \ -pkgs atdgen,extlib,oUnit,str,unix,yojson,zip ifeq (@ENABLE_OCAML_ANNOT@,yes) OCAMLBUILD_OPTIONS += -cflags -annot endif ifeq (@ENABLE_OCAML_BINANNOT@,yes) OCAMLBUILD_OPTIONS += -cflags -bin-annot endif ifneq (,$(findstring s,$(MAKEFLAGS))) OCAMLBUILD_OPTIONS += -quiet endif #### Backend declarations #### INFERANALYZE_MAIN = backend/inferanalyze #### InferPrint declarations #### INFERPRINT_ATDGEN_STUB_BASE = backend/jsonbug INFERPRINT_ATDGEN_STUB_ATD = $(INFERPRINT_ATDGEN_STUB_BASE).atd INFERPRINT_ATDGEN_SUFFIXES = _t.ml _t.mli _j.ml _j.mli INFERPRINT_ATDGEN_STUBS = $(addprefix $(INFERPRINT_ATDGEN_STUB_BASE), $(INFERPRINT_ATDGEN_SUFFIXES)) INFERPRINT_MAIN = backend/inferprint ### InferUnit declarations ### UNIT_SOURCES = unit INFERUNIT_MAIN = $(UNIT_SOURCES)/inferunit #### Java declarations #### JAVA_OCAMLBUILD_OPTIONS = -pkgs javalib,ptrees,sawja JAVA_SOURCES = java INFERJAVA_MAIN = $(JAVA_SOURCES)/jMain #### Clang declarations #### CLANG_SOURCES = clang INFERCLANG_MAIN = $(CLANG_SOURCES)/cMain FCP_CLANG_OCAML_BUILD_DIR = $(FCP_CLANG_OCAML_DIR)/build CLANG_PLUGIN_BINARIES = $(addprefix $(FCP_CLANG_OCAML_BUILD_DIR), \ clang_ast_converter clang_ast_named_decl_printer) CLANG_AST_BASE_NAME = clang_ast CLANG_ATDGEN_STUB_BASE = $(CLANG_SOURCES)/$(CLANG_AST_BASE_NAME) CLANG_ATDGEN_STUB_ATD = $(FCP_CLANG_OCAML_BUILD_DIR)/$(CLANG_AST_BASE_NAME).atd CLANG_ATDGEN_SUFFIXES = _t.ml _t.mli _b.ml _b.mli _j.ml _j.mli _v.ml _v.mli CLANG_ATDGEN_STUBS = $(addprefix $(CLANG_ATDGEN_STUB_BASE), $(CLANG_ATDGEN_SUFFIXES)) FCP_CLANG_AST_PROJ = $(addprefix $(FCP_CLANG_OCAML_BUILD_DIR)/, \ clang_ast_proj.ml clang_ast_proj.mli) FCP_CLANG_AST_MAIN = $(addprefix $(FCP_CLANG_OCAML_DIR)/, \ clang_ast_visit.ml clang_ast_main.ml) FCP_FILES_TO_MIRROR = $(FCP_CLANG_AST_PROJ) $(FCP_CLANG_AST_MAIN) INFER_CLANG_FCP_MIRRORED_FILES = $(addprefix $(CLANG_SOURCES)/, $(notdir $(FCP_FILES_TO_MIRROR))) CLANG_BINIOU_DICT = $(ETC_DIR)/clang_ast.dict #### LLVM declarations #### LLVM_SOURCES = llvm INFERLLVM_MAIN = $(LLVM_SOURCES)/lMain INFERLLVM_BIN = $(BIN_DIR)/InferLLVM #### scripts declarations #### SCRIPT_SOURCES = scripts CHECKCOPYRIGHT_BIN = $(SCRIPT_DIR)/checkCopyright CHECKCOPYRIGHT_MAIN = $(SCRIPT_SOURCES)/checkCopyright #### End of declarations #### # Check whether .facebook file exists in a root directory. # Based on that determine which code should be loaded ifeq ($(wildcard $(ROOT_DIR)/.facebook),) EXTRA_DEPS = opensource else EXTRA_DEPS = facebook endif DEPENDENCIES = IR backend checkers eradicate harness \ facebook/checkers facebook/checkers/graphql facebook/scripts $(EXTRA_DEPS) OCAMLBUILD = ocamlbuild $(OCAMLBUILD_OPTIONS) -j 0 $(addprefix -I , $(DEPENDENCIES)) .PHONY: all java clang llvm unit checkCopyright build_java build_clang build_llvm build_unit \ build_checkCopyright java_annotations clang_annotations llvm_annotations \ scripts_annotations init version sanitize clean default: $(INFER_ANALYZERS) all: java clang llvm checkCopyright unit java: $(INFERJAVA_BIN) clang: $(INFERCLANG_BIN) $(CLANG_BINIOU_DICT) llvm: $(INFERLLVM_BIN) unit: $(INFERUNIT_BIN) checkCopyright: $(CHECKCOPYRIGHT_BIN) build_java: init $(INFERPRINT_ATDGEN_STUBS) $(OCAMLBUILD) -build-dir $(JAVA_BUILD_DIR) $(JAVA_OCAMLBUILD_OPTIONS) \ $(INFERANALYZE_MAIN).native \ $(INFERPRINT_MAIN).native \ $(INFERJAVA_MAIN).native build_clang: init $(INFERPRINT_ATDGEN_STUBS) $(CLANG_ATDGEN_STUBS) $(INFER_CLANG_FCP_MIRRORED_FILES) $(OCAMLBUILD) -build-dir $(CLANG_BUILD_DIR) \ $(INFERANALYZE_MAIN).native \ $(INFERPRINT_MAIN).native \ $(INFERCLANG_MAIN).native build_llvm: $(OCAMLBUILD) -build-dir $(LLVM_BUILD_DIR) -use-menhir $(INFERLLVM_MAIN).native build_checkCopyright: $(OCAMLBUILD) -build-dir $(SCRIPTS_BUILD_DIR) -I $(SCRIPT_SOURCES) \ $(CHECKCOPYRIGHT_MAIN).native build_unit: $(OCAMLBUILD) -build-dir $(UNIT_BUILD_DIR) -I $(UNIT_SOURCES) \ $(INFERUNIT_MAIN).native byte: init $(INFERPRINT_ATDGEN_STUBS) $(CLANG_ATDGEN_STUBS) $(INFER_CLANG_FCP_MIRRORED_FILES) $(OCAMLBUILD) -build-dir $(TEST_BUILD_DIR) $(JAVA_OCAMLBUILD_OPTIONS) \ $(INFERANALYZE_MAIN).byte \ $(INFERPRINT_MAIN).byte \ $(INFERJAVA_MAIN).byte \ $(INFERCLANG_MAIN).byte \ $(INFERUNIT_MAIN).byte test_build: init $(INFERPRINT_ATDGEN_STUBS) $(CLANG_ATDGEN_STUBS) $(INFER_CLANG_FCP_MIRRORED_FILES) $(OCAMLBUILD) -build-dir $(TEST_BUILD_DIR) $(JAVA_OCAMLBUILD_OPTIONS) \ -cflags -warn-error,$(OCAML_FATAL_WARNINGS) \ $(INFERANALYZE_MAIN).byte \ $(INFERPRINT_MAIN).byte \ $(INFERJAVA_MAIN).byte \ $(INFERCLANG_MAIN).byte \ $(INFERUNIT_MAIN).byte ifeq (@ENABLE_OCAML_ANNOT@,yes) java_annotations: build_java rsync -a --include '*/' --include '*.annot' --exclude '*' $(JAVA_BUILD_DIR)/ $(ANNOT_DIR)/ clang_annotations: build_clang rsync -a --include '*/' --include '*.annot' --exclude '*' $(CLANG_BUILD_DIR)/ $(ANNOT_DIR)/ llvm_annotations: build_llvm rsync -a --include '*/' --include '*.annot' --exclude '*' $(LLVM_BUILD_DIR)/ $(ANNOT_DIR)/ scripts_annotations: build_checkCopyright rsync -a --include '*/' --include '*.annot' --exclude '*' $(SCRIPTS_BUILD_DIR)/ $(ANNOT_DIR)/ java: java_annotations clang: clang_annotations llvm: llvm_annotations checkCopyright: scripts_annotations endif define gen_atdgen_rules # generate files using atdgen # parameters: # 1. the .atd file to generate .ml{,i} files from # 2. the base name of .ml{,i} files # 3. the type of files to generate: b, j, t, or v $(2)_$(3).ml $(2)_$(3).mli: $(1) $(ATDGEN) -$(3) $$< -o $(2) # the .ml depends on the corresponding .mli to avoid running atdgen # twice during parallel builds $(2)_$(3).ml: $(2)_$(3).mli endef $(foreach atd_type,j t,\ $(eval \ $(call gen_atdgen_rules,$(INFERPRINT_ATDGEN_STUB_ATD),$(INFERPRINT_ATDGEN_STUB_BASE),$(atd_type)))) # rebuild the artifacts of the AST files whenever they're upated in FCP $(foreach atd_type,b j t v,\ $(eval \ $(call gen_atdgen_rules,$(CLANG_ATDGEN_STUB_ATD),$(CLANG_ATDGEN_STUB_BASE),$(atd_type)))) define mirror_fcp_file $(CLANG_SOURCES)/$(notdir $(1)): $(1) @INSTALL@ -m 644 -C $$< $$@ endef $(foreach file, $(FCP_FILES_TO_MIRROR), $(eval $(call mirror_fcp_file,$(file)))) $(CLANG_BINIOU_DICT): $(CLANG_ATDGEN_STUB_ATD) # overapproximation of the words we need in the biniou dictionary # the long litany of symbols is [:punct:] minus "_-'" tr -s '[*!"#\$%&\(\)\+,\\\.\/:;<=>\?@\[\\\\]^`\{|\}~[:space:]]' '\n' \ < $< \ | sort | uniq \ > $@ init: sanitize version $(BUILD_DIR) sanitize: ifneq ($(wildcard $(BUILD_DIR)/sanitize.sh),) $(BUILD_DIR)/sanitize.sh endif version: backend/version.ml.in Makefile TMPFILE=$$(mktemp backend/version.ml.tmp.XXXX); \ INFER_GIT_COMMIT=$$(git --work-tree=$(ROOT_DIR) --git-dir=$(ROOT_DIR)/.git rev-parse --short HEAD || printf "unknown"); \ INFER_GIT_BRANCH=$$(git --work-tree=$(ROOT_DIR) --git-dir=$(ROOT_DIR)/.git rev-parse --abbrev-ref HEAD || printf "unknown"); \ sed \ -e 's|@INFER_MAJOR[@]|$(INFER_MAJOR)|g' \ -e 's|@INFER_MINOR[@]|$(INFER_MINOR)|g' \ -e 's|@INFER_PATCH[@]|$(INFER_PATCH)|g' \ -e 's|@INFER_IS_RELEASE[@]|$(INFER_IS_RELEASE)|g' \ -e "s|@INFER_GIT_COMMIT[@]|$$INFER_GIT_COMMIT|g" \ -e "s|@INFER_GIT_BRANCH[@]|$$INFER_GIT_BRANCH|g" \ $< > "$$TMPFILE"; \ @INSTALL@ -m 644 -C "$$TMPFILE" backend/version.ml; \ rm -f "$$TMPFILE" $(BUILD_DIR): $(MKDIR) $(BUILD_DIR) $(INFERJAVA_BIN): build_java $(COPY) $(JAVA_BUILD_DIR)/$(INFERANALYZE_MAIN).native $(INFERANALYZE_BIN) $(COPY) $(JAVA_BUILD_DIR)/$(INFERPRINT_MAIN).native $(INFERPRINT_BIN) $(COPY) $(JAVA_BUILD_DIR)/$(INFERJAVA_MAIN).native $(INFERJAVA_BIN) $(INFERCLANG_BIN): build_clang $(COPY) $(CLANG_BUILD_DIR)/$(INFERANALYZE_MAIN).native $(INFERANALYZE_BIN) $(COPY) $(CLANG_BUILD_DIR)/$(INFERPRINT_MAIN).native $(INFERPRINT_BIN) $(COPY) $(CLANG_BUILD_DIR)/$(INFERCLANG_MAIN).native $(INFERCLANG_BIN) $(INFERLLVM_BIN): build_llvm $(COPY) $(LLVM_BUILD_DIR)/$(INFERLLVM_MAIN).native $(INFERLLVM_BIN) $(INFERUNIT_BIN): build_unit $(COPY) $(UNIT_BUILD_DIR)/$(INFERUNIT_MAIN).native $(INFERUNIT_BIN) $(CHECKCOPYRIGHT_BIN): build_checkCopyright $(COPY) $(SCRIPTS_BUILD_DIR)/$(CHECKCOPYRIGHT_MAIN).native $(CHECKCOPYRIGHT_BIN) test_clean: $(REMOVE_DIR) $(TEST_BUILD_DIR) clean: $(REMOVE_DIR) $(BUILD_DIR) ifeq (@ENABLE_OCAML_ANNOT@,yes) $(REMOVE_DIR) $(ANNOT_DIR) endif $(REMOVE) backend/version.ml $(REMOVE) backend/version.ml.tmp.* $(REMOVE) $(INFERJAVA_BIN) $(INFERCLANG_BIN) $(INFERLLVM_BIN) $(INFERUNIT_BIN) $(REMOVE) $(CHECKCOPYRIGHT_BIN) $(REMOVE) $(CLANG_ATDGEN_STUBS) $(REMOVE) $(INFER_CLANG_FCP_MIRRORED_FILES)