# Copyright (c) 2015 - 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 C_MODELS_DIR = c CPP_MODELS_DIR = cpp JAVA_MODELS_DIR = java OBJC_MODELS_DIR = objc CLANG_MODELS_FILE = $(SPECS_LIB_DIR)/clang_models CLANG_SUBDIRS = $(C_MODELS_DIR) $(CPP_MODELS_DIR) ifneq (no, $(XCODE_SELECT)) CLANG_SUBDIRS += $(OBJC_MODELS_DIR) endif all: ifeq ($(BUILD_C_ANALYZERS),yes) all: clang endif ifeq ($(BUILD_JAVA_ANALYZERS),yes) all: java endif .PHONY: java clang clean clean_specs $(CLANG_SUBDIRS) clean_specs: $(REMOVE) $(SPECS_LIB_DIR)/*.specs $(C_MODELS_FILE) $(CPP_MODELS_FILE) $(OBJC_MODELS_FILE) $(CLANG_SUBDIRS): $(QUIET)$(MAKE) -C $@ out/report.json # The clang deps have changed, so the models need to be rebuilt. If infer itself has changed, we # need to nuke the previous specs files in case the serialization has changed, otherwise we might # encounter a segfault reading them. $(CLANG_MODELS_FILE): $(CLANG_DEPS_NO_MODELS) $(QUIET)$(MAKE) clean_specs # Since [CLANG_DEPS_NO_MODELS] is newer than [CLANG_MODELS_FILE], it is also newer than the # previously built clang models, so they will all be rebuilt by the subdirs' Makefiles. $(QUIET)$(MAKE) $(CLANG_SUBDIRS) # Run the installs sequentially as the models shared some of the C procedures. This can cause # race conditions when copying specs files inside lib/specs/ $(QUIET)for clang_dir in $(CLANG_SUBDIRS); do $(MAKE) -C "$$clang_dir" install; done # Maintain the invariant that [CLANG_MODELS_FILE] is newer than the clang models. $(QUIET)touch $@ clang: $(CLANG_MODELS_FILE) # Run the sub-makes unconditionally since they know more about when they need to be # rebuilt. For instance, they need to be rebuilt when their source files change, which is not # taken into account by the dependencies of the $(CLANG_MODELS_FILE) target. If we rebuilt # $(CLANG_MODELS_FILE) already, then the command below will be a no-op (so we don't rebuild # the models twice). $(QUIET)$(MAKE) $(CLANG_SUBDIRS) java: $(QUIET)$(MAKE) -C $@ install clean: clean_specs $(QUIET)$(MAKE) -C $(JAVA_MODELS_DIR) clean $(QUIET)$(MAKE) -C $(C_MODELS_DIR) clean $(QUIET)$(MAKE) -C $(CPP_MODELS_DIR) clean ifneq (no, $(XCODE_SELECT)) $(QUIET)$(MAKE) -C $(OBJC_MODELS_DIR) clean endif