You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
7.2 KiB

# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
.PHONY: clean all test all_ast_samples
LEVEL=..
include $(LEVEL)/Makefile.common
HEADERS+=SimplePluginASTAction.h FileUtils.h AttrParameterVectorStream.h
OBJS+=SimplePluginASTAction.o FileUtils.o AttrParameterVectorStream.o
# ASTExporter
HEADERS+=atdlib/ATDWriter.h ASTExporter.h NamePrinter.h
OBJS+=ASTExporter.o
# Json
PLUGINS+=JsonASTExporter
EXTS+=.json
# Yojson
PLUGINS+=YojsonASTExporter
EXTS+=.yjson
# biniou
BINIOU_PLUGIN=BiniouASTExporter
PLUGINS+=$(BINIOU_PLUGIN)
EXTS+=.biniou
all: build/FacebookClangPlugin.dylib
include $(LEVEL)/Makefile.rules
CLANG_FRONTEND=$(CLANG) -fsyntax-only -Xpreprocessor -detailed-preprocessing-record -Xclang -load -Xclang $(shell pwd)/build/FacebookClangPlugin.dylib
build/FacebookClangPlugin.dylib: $(OBJS:%=build/%) $(HEADERS)
@mkdir -p build
$(CXX) $(LDFLAGS_DYLIB) -o $@ $(OBJS:%=build/%) -lz -lpthread -lm
# Experimental tool. This requires clang static libraries.
AST_EXPORTER_OBJS=ast_exporter_bin.o SimplePluginASTAction.o FileUtils.o AttrParameterVectorStream.o
build/ast_exporter_bin: $(AST_EXPORTER_OBJS:%=build/%) $(HEADERS)
@mkdir -p build
$(CXX) -o $@ $(AST_EXPORTER_OBJS:%=build/%) $(LDFLAGS) $(LLVM_CXXFLAGS) $(CLANG_TOOL_LIBS) $(LLVM_LDFLAGS) -lz -lpthread -lm
TEST_DIRS=tests
OUT_TEST_FILES=${TEST_DIRS:%=%/*/*.out}
# To make sharing of test files easier, each source file should be
# found in 'tests'. A plugin will only use the source files for which
# a .exp file exists in the corresponding subdirectory.
EXPFILES_FORMULA=tests/$$P/*.exp
SRCFILE_FORMULA=tests/$$(basename $$TEST)
FILTERFILE_FORMULA=tests/$${P}/filter.sh
test: build/FacebookClangPlugin.dylib
@for P in $(PLUGINS); do \
if [ "$$P" == "BiniouASTExporter" ] && ! hash bdump 2>/dev/null; \
then continue; \
fi; \
echo "-- $$P --"; \
export CLANG_FRONTEND_PLUGIN__AST_WITH_POINTERS=0; \
rm -rf build/tmp_$$P; \
mkdir -p build/tmp_$$P; \
for EXPFILE in $(EXPFILES_FORMULA); do \
TEST=$${EXPFILE%.exp}; \
EXTRA_FLAGS=""; \
case "$(SRCFILE_FORMULA)" in \
*.m ) \
if [ "$(HAS_OBJC)" = "no" ]; then \
printf "[~] %s skipped (no Objective-C support)\n" \
"$$(basename $(SRCFILE_FORMULA))"; \
continue; \
fi; \
EXTRA_FLAGS="-ObjC -fblocks $(IOSFLAGS)"; \
;; \
*.cpp ) \
EXTRA_FLAGS="--std=c++14"; \
;; \
*.mm ) \
EXTRA_FLAGS="--std=c++14 -ObjC++ -fblocks $(IOSFLAGS)"; \
;; \
esac; \
$(RUNTEST) "$$TEST" $(FILTERFILE_FORMULA) \
$(CLANG_FRONTEND) $$EXTRA_FLAGS -Xclang -plugin -Xclang $$P \
-Xclang -plugin-arg-$$P -Xclang - \
-Xclang -plugin-arg-$$P -Xclang USE_TEMP_DIR_FOR_DEDUPLICATION=build/tmp_$$P \
-c $(SRCFILE_FORMULA); \
done; \
done
@if [ ! $$KEEP_TEST_OUTPUTS ]; then rm -f $(OUT_TEST_FILES); fi
record-test-outputs:
@$(MAKE) DEBUG=1 KEEP_TEST_OUTPUTS=1 test || true
@for F in $(OUT_TEST_FILES); do cp $$F $${F%.out}.exp; done
@rm -f $(OUT_TEST_FILES)
clean:
@rm -rf build/* $(OUT_TEST_FILES)
# -- AST samples for specific end-to-end tests --
REGULAR_SOURCES=$(wildcard tests/*.m) $(wildcard tests/*.c) $(wildcard tests/*.cpp) $(wildcard tests/*.mm)
AST_SAMPLE_FILES=ASTExporter.cpp $(REGULAR_SOURCES:tests/%=%)
all_ast_samples: $(AST_SAMPLE_FILES:%=build/ast_samples/%.json.gz) $(AST_SAMPLE_FILES:%=build/ast_samples/%.yjson.gz)
# dump samples files in Yojson using ASTExporter.cpp
YJ_DUMPER_ARGS=-Xclang -plugin -Xclang YojsonASTExporter -Xclang -plugin-arg-YojsonASTExporter -Xclang
build/ast_samples/%.cpp.yjson: %.cpp build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) $(CFLAGS) -Wno-ignored-qualifiers -I. $(YJ_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.cpp.yjson: tests/%.cpp build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) --std=c++14 $(YJ_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.c.yjson: tests/%.c build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) $(YJ_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.m.yjson: tests/%.m build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) $(IOSFLAGS) $(YJ_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.mm.yjson: tests/%.mm build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) --std=c++14 $(IOSFLAGS) $(YJ_DUMPER_ARGS) $@ -c $<
# dump sample files in Yojson using ASTExporter.cpp
J_DUMPER_ARGS=-Xclang -plugin -Xclang JsonASTExporter -Xclang -plugin-arg-JsonASTExporter -Xclang
build/ast_samples/%.cpp.json: %.cpp build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) $(CFLAGS) -Wno-ignored-qualifiers -I. $(J_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.cpp.json: tests/%.cpp build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) --std=c++14 $(J_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.c.json: tests/%.c build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) $(J_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.m.json: tests/%.m build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) $(IOSFLAGS) $(J_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.gz: build/ast_samples/%
@gzip -f < $< > $@
# generate a preprocessed version of ASTExporter.cpp where ATD directives can be read
# we do not include the C/C++ headers to avoid parsing issues with the 'traditional' cpp (needed for precisely expanding our /// comments)
build/ASTExporter.h.p: ASTExporter.h
@mkdir -p build
@cat $< | grep -v '#include *["<][^.]*\(\.h\)\?[">]' | $(ATD_CPP) -I$(CLANG_PREFIX)/include > $@