# Copyright (c) 2000, 2020 IBM Corp. and others # # This program and the accompanying materials are made available under # the terms of the Eclipse Public License 2.0 which accompanies this # distribution and is available at https://www.eclipse.org/legal/epl-2.0/ # or the Apache License, Version 2.0 which accompanies this distribution and # is available at https://www.apache.org/licenses/LICENSE-2.0. # # This Source Code may also be made available under the following # Secondary Licenses when the conditions for such availability set # forth in the Eclipse Public License, v. 2.0 are satisfied: GNU # General Public License, version 2 with the GNU Classpath # Exception [1] and GNU General Public License, version 2 with the # OpenJDK Assembly Exception [2]. # # [1] https://www.gnu.org/software/classpath/license.html # [2] http://openjdk.java.net/legal/assembly-exception.html # # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception # To lint: # # PLATFORM=foo-bar-clang make -f linter.mk # .PHONY: linter linter: # Handy macro to check to make sure variables are set REQUIRE_VARS=$(foreach VAR,$(1),$(if $($(VAR)),,$(error $(VAR) must be set))) $(call REQUIRE_VARS,J9SRC) ifeq ($(PLATFORM),ppc64-linux64-clangLinter) export LLVM_CONFIG?=/tr/llvm_checker/ppc-64/sles11/bin/llvm-config export CC_PATH?=/tr/llvm_checker/ppc-64/sles11/bin/clang export CXX_PATH?=/tr/llvm_checker/ppc-64/sles11/bin/clang++ else #default paths, unless overridden export LLVM_CONFIG?=llvm-config export CC_PATH?=clang export CXX_PATH?=clang++ endif # # First setup some important paths # Personally, I feel it's best to default to out-of-tree build but who knows, there may be # differing opinions on that. # JIT_SRCBASE?=.. JIT_OBJBASE?=$(J9SRC)/objs/compiler_$(BUILD_CONFIG) JIT_DLL_DIR?=$(JIT_OBJBASE) # # Windows users will likely use backslashes, but Make tends to not like that so much # FIXED_SRCBASE=$(subst \,/,$(JIT_SRCBASE)) FIXED_OBJBASE=$(subst \,/,$(JIT_OBJBASE)) FIXED_DLL_DIR=$(subst \,/,$(JIT_DLL_DIR)) # TODO - "debug" as default? BUILD_CONFIG?=prod # # Dirs used internally by the makefiles # JIT_MAKE_DIR?=$(FIXED_SRCBASE)/compiler/build JIT_SCRIPT_DIR?=$(JIT_MAKE_DIR)/scripts # # First we set a bunch of tokens about the platform that the rest of the # makefile will use as conditionals # include $(JIT_MAKE_DIR)/platform/common.mk # # Now we include the names of all the files that will go into building the JIT # Will automatically include files needed from HOST and TARGET platform # include $(JIT_MAKE_DIR)/files/common.mk # # Now we configure all the tooling we will use to build the files # # There is quite a bit of shared stuff, but the overwhelming majority of this # is toolchain-dependent. # # That makes sense - You can't expect XLC and GCC to take the same arguments # include $(JIT_MAKE_DIR)/toolcfg/common.mk # Add include directories to find j9cfg.h and omrcfg.h if needed. # # If the linter is being run after a CMake build, it # results in j9cfg.h and omrcfg.h to be in a location that # is different from an automake build. # ifneq ("$(CMAKE_BUILD_DIR)","") CXX_INCLUDES+=$(CMAKE_BUILD_DIR)/runtime $(CMAKE_BUILD_DIR)/runtime/omr $(CMAKE_BUILD_DIR)/runtime/nls $(CMAKE_BUILD_DIR)/runtime/include $(CMAKE_BUILD_DIR)/runtime/compiler endif # # Add OMRChecker targets # # This likely ought to be using the OMRChecker fragment that # exists in that repo, but in the mean time, this is fine. # OMRCHECKER_DIR?=$(JIT_SRCBASE)/omr/tools/compiler/OMRChecker OMRCHECKER_OBJECT=$(OMRCHECKER_DIR)/OMRChecker.so OMRCHECKER_LDFLAGS=`$(LLVM_CONFIG) --ldflags` OMRCHECKER_CXXFLAGS=`$(LLVM_CONFIG) --cxxflags` $(OMRCHECKER_OBJECT): cd $(OMRCHECKER_DIR); sh smartmake.sh .PHONY: omrchecker omrchecker_test omrchecker_clean omrchecker_cleandll omrchecker_cleanall omrchecker: $(OMRCHECKER_OBJECT) omrchecker_test: $(OMRCHECKER_OBJECT) cd $(OMRCHECKER_DIR); make test omrchecker_clean: cd $(OMRCHECKER_DIR); make clean omrchecker_cleandll: cd $(OMRCHECKER_DIR); make cleandll omrchecker_cleanall: cd $(OMRCHECKER_DIR); make cleanall # The core linter bits. # # linter is the default target, and we construct a pre-req for each # .cpp file. # linter: omrchecker # The clang invocation magic line. LINTER_EXTRA=-Xclang -load -Xclang $(OMRCHECKER_OBJECT) -Xclang -add-plugin -Xclang omr-checker LINTER_FLAGS=-std=c++0x -w -fsyntax-only -ferror-limit=0 $(LINTER_FLAGS_EXTRA) define DEF_RULE.linter .PHONY: $(1).linted $(1).linted: $(1) omrchecker $$(CXX_CMD) $(LINTER_FLAGS) $(LINTER_EXTRA) $$(patsubst %,-D%,$$(CXX_DEFINES)) $$(patsubst %,-I'%',$$(CXX_INCLUDES)) -o $$@ -c $$< linter: $(1).linted endef # DEF_RULE.linter RULE.linter=$(eval $(DEF_RULE.linter)) # The list of sources. JIT_CPP_FILES=$(filter %.cpp,$(JIT_PRODUCT_SOURCE_FILES) $(JIT_PRODUCT_BACKEND_SOURCES)) # Construct lint dependencies. $(foreach SRCFILE,$(JIT_CPP_FILES),\ $(call RULE.linter,$(FIXED_SRCBASE)/$(SRCFILE)))