#
# makefile for generating a config file for the installed Clang version
#

# ******************************
# *       S E T T I N G S      *
# ******************************

# check whether llvm-config is available
ifeq ($(shell which $(LLVMCONF)),)
  $(error LLVMCONF ($(LLVMCONF)) is not found)
endif

LLVM_VERSION := $(shell $(LLVMCONF) --version)

LLVM_LIBDIR  := $(shell $(LLVMCONF) --libdir)
ifeq ($(_TARGET),win_x86_64) # handle '\' in path name
  LLVM_LIBDIR := $(subst \,/,$(LLVM_LIBDIR))
endif
LLVM_LIBS :=  $(LLVM_LIBDIR)/libclang*.a
# These functions need to be wrapped: parameters omitted to be more version independent
LLVM_KEY_COUNT := 12
LLVM_KEYS := _ZN5clang4Sema31ActOnStartCXXMemberDeclarations \
             _ZN5clang4Sema33ActOnFinishCXXMemberSpecification \
             _ZN5clang4Sema25ActOnEndOfTranslationUnit \
             _ZN5clang4Sema19canSkipFunctionBody \
             _ZN5clang4Sema24ActOnCXXMemberDeclarator \
             _ZN5clang4Sema15ActOnDeclarator \
             _ZN5clang12Preprocessor3Lex \
             _ZN5clang12Preprocessor9PeekAhead \
             _ZN5clang4Sema19ActOnBaseSpecifiers \
             _ZN5clang4Sema8ActOnTag \
             _ZN5clang4Sema22ActOnStartNamespaceDef \
             _ZN5clang4Sema23ActOnStartOfFunctionDefEPNS_5ScopeERNS_10Declarator
ifeq ($(_TARGET),macosx_x86_64) # on macOS the symbols have an additional '_'
  LLVM_KEYS := $(patsubst %, _%, $(LLVM_KEYS))
endif

# command to generate LLVM_SYMBOLS (a recursive variable!)
LLVM_SYMBOLS_GEN = $(foreach LLVM_KEY, $(LLVM_KEYS), $(filter _%, $(shell nm --defined-only $(LLVM_LIBS) | grep "T $(LLVM_KEY)")))

# ******************************
# *       R U L E S            *
# ******************************

clang: clang-$(LLVM_VERSION).mk

# find the exact symbols using the keys in the clang libraries
clang-$(LLVM_VERSION).mk:
	@echo Generating config file for Clang $(LLVM_VERSION)
	@echo LLVM_SYMBOLS := $(LLVM_SYMBOLS_GEN) > $@

