# 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_VERSION_MAJOR = 0 INFER_VERSION_MINOR = 4 INFER_VERSION_PATCH = 0 REMOVE = rm -vf REMOVE_DIR = rm -rvf COPY = cp -f -p COPY_DIR = cp -rf MKDIR = mkdir -p LINK = ln -sf ATDGEN = @ATDGEN@ OCAML_INCLUDE_DIR = $(shell ocamlc -where) #### Global declarations #### BUILD_DIR = $(INFER_DIR)/_build-infer ANNOT_DIR = $(SRC_DIR)/_build ETC_DIR = $(INFER_DIR)/etc ifneq ($(wildcard $(BUILD_DIR)/sanitize.sh),) SANITIZE_SCRIPT = $(BUILD_DIR)/sanitize.sh endif #### Infer includes declarations #### ATDGEN_INCLUDE_DIR = @OCAML_PKG_PATH_atdgen@ BINIOU_INCLUDE_DIR = @OCAML_PKG_PATH_biniou@ YOJSON_INCLUDE_DIR = @OCAML_PKG_PATH_yojson@ EASYFORMAT_INCLUDE_DIR = @OCAML_PKG_PATH_easy_format@ OCAML_INCLUDES = -I,$(EASYFORMAT_INCLUDE_DIR),-I,$(BINIOU_INCLUDE_DIR),-I,$(YOJSON_INCLUDE_DIR),-I,$(ATDGEN_INCLUDE_DIR) OCAML_LIBS = unix str atdgen OCAML_MODS = easy_format bi_util bi_share bi_outbuf bi_inbuf bi_vint bi_io yojson ag_oj_run ag_ob_run ag_util # backwards compatibility with OCaml version < 4.02.0 ifeq (@OCAML_HAS_NATIVE_BYTES@,no) OCAML_INCLUDES := $(OCAML_INCLUDES),-I,@OCAML_PKG_PATH_bytes@ OCAML_LIBS += bytes endif OCAMLBUILD_OPTIONS = -lflags -annot \ -cflags -annot,-bin-annot,-warn-error,@5@8@10..12@20@26@39 \ -lflags $(OCAML_INCLUDES) \ -cflags $(OCAML_INCLUDES) \ $(addprefix -lib ,$(OCAML_LIBS)) \ $(addprefix -mod ,$(OCAML_MODS)) ifeq (@OCAMLC_HAS_SAFE_STRING@,yes) OCAMLBUILD_OPTIONS += -cflags -safe-string endif #### Backend declarations #### BACKEND_SOURCES = backend INFERANALYZE_MAIN = $(BACKEND_SOURCES)/inferanalyze #### Typeprop declarations #### TYPEPROP_MAIN = $(BACKEND_SOURCES)/type_prop TYPEPROP_BIN = $(BIN_DIR)/Typeprop #### InferPrint declarations #### INFERPRINT_ATDGEN_STUB_BASE = $(BACKEND_SOURCES)/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_SOURCES)/inferprint #### Java declarations #### EXTLIB_INCLUDE_DIR = @OCAML_PKG_PATH_extlib@ PTREES_INCLUDE_DIR = @OCAML_PKG_PATH_ptrees@ JAVALIB_INCLUDE_DIR = @OCAML_PKG_PATH_javalib@ SAWJA_INCLUDE_DIR = @OCAML_PKG_PATH_sawja@ ZIP_INCLUDE_DIR = @OCAML_PKG_PATH_camlzip@ JAVA_INCLUDES = -I,$(EXTLIB_INCLUDE_DIR),-I,$(ZIP_INCLUDE_DIR),-I,$(PTREES_INCLUDE_DIR),-I,$(JAVALIB_INCLUDE_DIR),-I,$(SAWJA_INCLUDE_DIR) JAVA_LIBS = zip extLib ptrees javalib sawja JAVA_OPTIONS = -cflags -annot -lflags $(JAVA_INCLUDES) -cflags $(JAVA_INCLUDES) $(addprefix -lib ,$(JAVA_LIBS)) 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_SOURCES)/$(CLANG_AST_BASE_NAME), $(CLANG_ATDGEN_SUFFIXES)) INFER_CLANG_AST_PROJ = $(addprefix $(CLANG_SOURCES)/, clang_ast_proj.ml clang_ast_proj.mli) INFER_CLANG_AST_MAIN = $(addprefix $(CLANG_SOURCES)/, clang_ast_visit.ml clang_ast_main.ml) 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) 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 = $(BACKEND_SOURCES) checkers facebook/checkers facebook/checkers/graphql facebook/scripts harness $(EXTRA_DEPS) OCAMLBUILD = ocamlbuild $(OCAMLBUILD_OPTIONS) -build-dir $(BUILD_DIR) -j 0 $(addprefix -I , $(DEPENDENCIES)) $(JAVA_OPTIONS) .PHONY: all java clang llvm checkCopyright build_java build_clang build_llvm build_checkCopyright annotations init sanitize version clean all: java clang llvm checkCopyright java: build_java annotations $(INFERANALYZE_BIN) $(INFERPRINT_BIN) $(INFERJAVA_BIN) clang: build_clang annotations $(INFERANALYZE_BIN) $(INFERPRINT_BIN) $(INFERCLANG_BIN) $(CLANG_BINIOU_DICT) llvm: build_llvm annotations $(INFERLLVM_BIN) checkCopyright: build_checkCopyright annotations $(CHECKCOPYRIGHT_BIN) build_java: init $(INFERPRINT_ATDGEN_STUBS) $(OCAMLBUILD) $(TYPEPROP_MAIN).native $(INFERANALYZE_MAIN).native $(INFERPRINT_MAIN).native $(INFERJAVA_MAIN).native build_clang: init $(INFERPRINT_ATDGEN_STUBS) $(CLANG_ATDGEN_STUBS) $(INFER_CLANG_AST_PROJ) $(INFER_CLANG_AST_MAIN) $(OCAMLBUILD) $(INFERANALYZE_MAIN).native $(INFERPRINT_MAIN).native $(INFERCLANG_MAIN).native build_llvm: $(OCAMLBUILD) -use-menhir $(INFERLLVM_MAIN).native build_checkCopyright: $(OCAMLBUILD) -I $(SCRIPT_SOURCES) $(CHECKCOPYRIGHT_MAIN).native annotations: rsync -r --delete --exclude=*.ml* --exclude=*.o --exclude=*.cm* --exclude=*.native $(BUILD_DIR)/* $(ANNOT_DIR) $(INFERPRINT_ATDGEN_STUBS): $(INFERPRINT_ATDGEN_STUB_ATD) $(ATDGEN) -t $(INFERPRINT_ATDGEN_STUB_ATD) -o $(INFERPRINT_ATDGEN_STUB_BASE) $(ATDGEN) -j $(INFERPRINT_ATDGEN_STUB_ATD) -o $(INFERPRINT_ATDGEN_STUB_BASE) $(INFER_CLANG_AST_PROJ) $(INFER_CLANG_AST_MAIN): $(FCP_CLANG_AST_PROJ) $(FCP_CLANG_AST_MAIN) # copy the ast_proj files whenever they are updated @INSTALL@ -m 644 -C \ $(FCP_CLANG_AST_PROJ) $(FCP_CLANG_AST_MAIN) \ $(CLANG_SOURCES) $(CLANG_ATDGEN_STUBS): $(CLANG_ATDGEN_STUB_ATD) # rebuild the artifacts of the AST files whenever they're upated in FCP $(ATDGEN) -t $(CLANG_ATDGEN_STUB_ATD) -o $(CLANG_ATDGEN_STUB_BASE) $(ATDGEN) -b $(CLANG_ATDGEN_STUB_ATD) -o $(CLANG_ATDGEN_STUB_BASE) $(ATDGEN) -j $(CLANG_ATDGEN_STUB_ATD) -o $(CLANG_ATDGEN_STUB_BASE) $(ATDGEN) -v $(CLANG_ATDGEN_STUB_ATD) -o $(CLANG_ATDGEN_STUB_BASE) $(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' \ < $(CLANG_ATDGEN_STUB_ATD) \ | sort | uniq \ > $(CLANG_BINIOU_DICT) init: sanitize version $(BUILD_DIR) sanitize: $(SANITIZE_SCRIPT) version: GIT_COMMIT=$$(git rev-parse HEAD 2> /dev/null \ || printf "unknown commit"); \ GIT_BRANCH=$$(git rev-parse --abbrev-ref HEAD 2> /dev/null \ || printf "unknown branch"); \ UNKNOWN="-unknown"; \ if [ -e "$(ROOT_DIR)/.release" ]; then \ UNKNOWN=""; \ fi; \ GIT_TAG=$$(git tag --points-at HEAD 2> /dev/null \ || printf "v$(INFER_VERSION_MAJOR).$(INFER_VERSION_MINOR).$(INFER_VERSION_PATCH)$$UNKNOWN"); \ sed -e 's/@MAJOR@/$(INFER_VERSION_MAJOR)/g' \ -e 's/@MINOR@/$(INFER_VERSION_MINOR)/g' \ -e 's/@PATCH@/$(INFER_VERSION_PATCH)/g' \ -e "s/@GIT_COMMIT@/$$GIT_COMMIT/g" \ -e "s#@GIT_BRANCH@#$$GIT_BRANCH#g" \ -e "s/@GIT_TAG@/$$GIT_TAG/g" \ $(BACKEND_SOURCES)/version.ml.in > $(BACKEND_SOURCES)/version.ml $(BUILD_DIR): $(MKDIR) $(BUILD_DIR) $(INFERANALYZE_BIN): $(BUILD_DIR)/$(INFERANALYZE_MAIN).native $(COPY) $(BUILD_DIR)/$(INFERANALYZE_MAIN).native $(INFERANALYZE_BIN) $(INFERPRINT_BIN): $(BUILD_DIR)/$(INFERPRINT_MAIN).native $(COPY) $(BUILD_DIR)/$(INFERPRINT_MAIN).native $(INFERPRINT_BIN) $(INFERJAVA_BIN): $(BUILD_DIR)/$(INFERJAVA_MAIN).native $(COPY) $(BUILD_DIR)/$(INFERJAVA_MAIN).native $(INFERJAVA_BIN) $(INFERCLANG_BIN): $(BUILD_DIR)/$(INFERCLANG_MAIN).native $(COPY) $(BUILD_DIR)/$(INFERCLANG_MAIN).native $(INFERCLANG_BIN) $(INFERLLVM_BIN): $(BUILD_DIR)/$(INFERLLVM_MAIN).native $(COPY) $(BUILD_DIR)/$(INFERLLVM_MAIN).native $(INFERLLVM_BIN) $(TYPEPROP_BIN): $(BUILD_DIR)/$(TYPEPROP_MAIN).native $(COPY) $(BUILD_DIR)/$(TYPEPROP_MAIN).native $(TYPEPROP_BIN) $(CHECKCOPYRIGHT_BIN): $(BUILD_DIR)/$(CHECKCOPYRIGHT_MAIN).native $(COPY) $(BUILD_DIR)/$(CHECKCOPYRIGHT_MAIN).native $(CHECKCOPYRIGHT_BIN) clean: $(BUILD_DIR) $(OCAMLBUILD) -clean $(REMOVE_DIR) $(ANNOT_DIR) $(REMOVE) $(BACKEND_SOURCES)/version.ml $(REMOVE) $(TYPEPROP_BIN) $(INFERANALYZE_BIN) $(INFERPRINT_BIN) $(REMOVE) $(INFERJAVA_BIN) $(INFERCLANG_BIN) $(INFERLLVM_BIN) $(REMOVE) $(CHECKCOPYRIGHT_BIN) $(REMOVE) $(CLANG_ATDGEN_STUBS) $(REMOVE) $(INFER_CLANG_AST_PROJ) $(REMOVE) $(INFER_CLANG_AST_MAIN)