diff options
Diffstat (limited to 'build/autoconf/clang-plugin.m4')
-rw-r--r-- | build/autoconf/clang-plugin.m4 | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/build/autoconf/clang-plugin.m4 b/build/autoconf/clang-plugin.m4 new file mode 100644 index 000000000..22a48976d --- /dev/null +++ b/build/autoconf/clang-plugin.m4 @@ -0,0 +1,162 @@ +dnl This Source Code Form is subject to the terms of the Mozilla Public +dnl License, v. 2.0. If a copy of the MPL was not distributed with this +dnl file, You can obtain one at http://mozilla.org/MPL/2.0/. + +AC_DEFUN([MOZ_CONFIG_CLANG_PLUGIN], [ + +MOZ_ARG_ENABLE_BOOL(clang-plugin, +[ --enable-clang-plugin Enable building with the mozilla clang plugin ], + ENABLE_CLANG_PLUGIN=1, + ENABLE_CLANG_PLUGIN= ) +if test -n "$ENABLE_CLANG_PLUGIN"; then + if test -z "${CLANG_CC}${CLANG_CL}"; then + AC_MSG_ERROR([Can't use clang plugin without clang.]) + fi + + AC_MSG_CHECKING([for llvm-config]) + if test -z "$LLVMCONFIG"; then + if test -n "$CLANG_CL"; then + CXX_COMPILER="$(dirname "$CXX")/clang" + else + CXX_COMPILER="${CXX}" + fi + LLVMCONFIG=`$CXX_COMPILER -print-prog-name=llvm-config` + fi + + if test -z "$LLVMCONFIG"; then + LLVMCONFIG=`which llvm-config` + fi + + if test ! -x "$LLVMCONFIG"; then + AC_MSG_RESULT([not found]) + AC_MSG_ERROR([Cannot find an llvm-config binary for building a clang plugin]) + fi + + AC_MSG_RESULT([$LLVMCONFIG]) + + if test -z "$LLVMCONFIG"; then + AC_MSG_ERROR([Cannot find an llvm-config binary for building a clang plugin]) + fi + dnl For some reason the llvm-config downloaded from clang.llvm.org for clang3_8 + dnl produces a -isysroot flag for a sysroot which might not ship when passed + dnl --cxxflags. We use sed to remove this argument so that builds work on OSX + LLVM_CXXFLAGS=`$LLVMCONFIG --cxxflags | sed -e 's/-isysroot [[^ ]]*//'` + + dnl We are loaded into clang, so we don't need to link to very many things, + dnl we just need to link to clangASTMatchers because it is not used by clang + LLVM_LDFLAGS=`$LLVMCONFIG --ldflags | tr '\n' ' '` + + if test "${HOST_OS_ARCH}" = "Darwin"; then + dnl We need to make sure that we use the symbols coming from the clang + dnl binary. In order to do this, we need to pass -flat_namespace and + dnl -undefined suppress to the linker. This makes sure that we link the + dnl symbols into the flat namespace provided by clang, and thus get + dnl access to all of the symbols which are undefined in our dylib as we + dnl are building it right now, and also that we don't fail the build + dnl due to undefined symbols (which will be provided by clang). + CLANG_LDFLAGS="-Wl,-flat_namespace -Wl,-undefined,suppress -lclangASTMatchers" + elif test "${HOST_OS_ARCH}" = "WINNT"; then + CLANG_LDFLAGS="clangASTMatchers.lib" + else + CLANG_LDFLAGS="-lclangASTMatchers" + fi + + if test -n "$CLANG_CL"; then + dnl The llvm-config coming with clang-cl may give us arguments in the + dnl /ARG form, which in msys will be interpreted as a path name. So we + dnl need to split the args and convert the leading slashes that we find + dnl into a dash. + LLVM_REPLACE_CXXFLAGS='' + for arg in $LLVM_CXXFLAGS; do + dnl The following expression replaces a leading slash with a dash. + dnl Also replace any backslashes with forward slash. + arg=`echo "$arg"|sed -e 's/^\//-/' -e 's/\\\\/\//g'` + LLVM_REPLACE_CXXFLAGS="$LLVM_REPLACE_CXXFLAGS $arg" + done + LLVM_CXXFLAGS="$LLVM_REPLACE_CXXFLAGS" + + LLVM_REPLACE_LDFLAGS='' + for arg in $LLVM_LDFLAGS; do + dnl The following expression replaces a leading slash with a dash. + dnl Also replace any backslashes with forward slash. + arg=`echo "$arg"|sed -e 's/^\//-/' -e 's/\\\\/\//g'` + LLVM_REPLACE_LDFLAGS="$LLVM_REPLACE_LDFLAGS $arg" + done + LLVM_LDFLAGS="$LLVM_REPLACE_LDFLAGS" + + CLANG_REPLACE_LDFLAGS='' + for arg in $CLANG_LDFLAGS; do + dnl The following expression replaces a leading slash with a dash. + dnl Also replace any backslashes with forward slash. + arg=`echo "$arg"|sed -e 's/^\//-/' -e 's/\\\\/\//g'` + CLANG_REPLACE_LDFLAGS="$CLANG_REPLACE_LDFLAGS $arg" + done + CLANG_LDFLAGS="$CLANG_REPLACE_LDFLAGS" + fi + + dnl Check for the new ASTMatcher API names. Since this happened in the + dnl middle of the 3.8 cycle, our CLANG_VERSION_FULL is impossible to use + dnl correctly, so we have to detect this at configure time. + AC_CACHE_CHECK(for new ASTMatcher API, + ac_cv_have_new_ASTMatcher_api, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + _SAVE_CXXFLAGS="$CXXFLAGS" + _SAVE_CXX="$CXX" + _SAVE_MACOSX_DEPLOYMENT_TARGET="$MACOSX_DEPLOYMENT_TARGET" + unset MACOSX_DEPLOYMENT_TARGET + CXXFLAGS="${LLVM_CXXFLAGS}" + CXX="${HOST_CXX}" + AC_TRY_COMPILE([#include "clang/ASTMatchers/ASTMatchers.h"], + [clang::ast_matchers::cxxConstructExpr();], + ac_cv_have_new_ASTMatcher_names="yes", + ac_cv_have_new_ASTMatcher_names="no") + CXX="$_SAVE_CXX" + CXXFLAGS="$_SAVE_CXXFLAGS" + export MACOSX_DEPLOYMENT_TARGET="$_SAVE_MACOSX_DEPLOYMENT_TARGET" + AC_LANG_RESTORE + ]) + if test "$ac_cv_have_new_ASTMatcher_names" = "yes"; then + LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DHAVE_NEW_ASTMATCHER_NAMES" + fi + + dnl Check if we can compile has(ignoringParenImpCasts()) because + dnl before 3.9 that ignoringParenImpCasts was done internally by "has". + dnl See https://www.mail-archive.com/cfe-commits@lists.llvm.org/msg25234.html + AC_CACHE_CHECK(for has with ignoringParenImpCasts, + ac_cv_has_accepts_ignoringParenImpCasts, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + _SAVE_CXXFLAGS="$CXXFLAGS" + _SAVE_CXX="$CXX" + _SAVE_MACOSX_DEPLOYMENT_TARGET="$MACOSX_DEPLOYMENT_TARGET" + unset MACOSX_DEPLOYMENT_TARGET + CXXFLAGS="${LLVM_CXXFLAGS}" + CXX="${HOST_CXX}" + AC_TRY_COMPILE([#include "clang/ASTMatchers/ASTMatchers.h"], + [using namespace clang::ast_matchers; + expr(has(ignoringParenImpCasts(declRefExpr()))); + ], + ac_cv_has_accepts_ignoringParenImpCasts="yes", + ac_cv_has_accepts_ignoringParenImpCasts="no") + CXX="$_SAVE_CXX" + CXXFLAGS="$_SAVE_CXXFLAGS" + export MACOSX_DEPLOYMENT_TARGET="$_SAVE_MACOSX_DEPLOYMENT_TARGET" + AC_LANG_RESTORE + ]) + if test "$ac_cv_has_accepts_ignoringParenImpCasts" = "yes"; then + LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DHAS_ACCEPTS_IGNORINGPARENIMPCASTS" + fi + + AC_DEFINE(MOZ_CLANG_PLUGIN) +fi + +AC_SUBST(LLVM_CXXFLAGS) +AC_SUBST(LLVM_LDFLAGS) +AC_SUBST(CLANG_LDFLAGS) + +AC_SUBST(ENABLE_CLANG_PLUGIN) + +]) |