2014-09-04 12:44:01 +04:00
|
|
|
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], [
|
|
|
|
|
|
|
|
if test -n "$ENABLE_CLANG_PLUGIN"; then
|
2016-02-05 23:23:18 +03:00
|
|
|
if test -z "${CLANG_CC}${CLANG_CL}"; then
|
2014-09-04 12:44:01 +04:00
|
|
|
AC_MSG_ERROR([Can't use clang plugin without clang.])
|
|
|
|
fi
|
|
|
|
|
|
|
|
AC_MSG_CHECKING([for llvm-config])
|
|
|
|
if test -z "$LLVMCONFIG"; then
|
2016-02-05 23:23:18 +03:00
|
|
|
if test -n "$CLANG_CL"; then
|
|
|
|
CXX_COMPILER="$(dirname "$CXX")/clang"
|
|
|
|
else
|
|
|
|
CXX_COMPILER="${CXX}"
|
|
|
|
fi
|
|
|
|
LLVMCONFIG=`$CXX_COMPILER -print-prog-name=llvm-config`
|
2014-09-04 12:44:01 +04:00
|
|
|
fi
|
|
|
|
|
|
|
|
if test -z "$LLVMCONFIG"; then
|
2014-12-19 21:13:44 +03:00
|
|
|
LLVMCONFIG=`which llvm-config`
|
2014-09-04 12:44:01 +04:00
|
|
|
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
|
2016-06-02 21:14:57 +03:00
|
|
|
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
|
2019-03-15 04:28:55 +03:00
|
|
|
dnl
|
|
|
|
dnl For a similar reason, we remove any -gcc-toolchain arguments, since the
|
|
|
|
dnl directories specified by such arguments might not exist on the current
|
|
|
|
dnl machine.
|
|
|
|
LLVM_CXXFLAGS=`$LLVMCONFIG --cxxflags | sed -e 's/-isysroot [[^ ]]*//' -e 's/-gcc-toolchain [[^ ]]*//'`
|
2016-06-02 21:14:57 +03:00
|
|
|
|
|
|
|
LLVM_LDFLAGS=`$LLVMCONFIG --ldflags | tr '\n' ' '`
|
2014-09-04 12:44:01 +04:00
|
|
|
|
2015-09-20 20:02:30 +03:00
|
|
|
if test "${HOST_OS_ARCH}" = "Darwin"; then
|
2016-06-02 21:14:57 +03:00
|
|
|
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).
|
2017-01-27 22:24:20 +03:00
|
|
|
CLANG_LDFLAGS="-Wl,-flat_namespace -Wl,-undefined,suppress"
|
|
|
|
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
|
|
|
|
CLANG_LDFLAGS="$CLANG_LDFLAGS `$LLVMCONFIG --prefix`/lib/libclangASTMatchers.a"
|
|
|
|
dnl We need to remove -L/path/to/clang/lib from LDFLAGS to ensure that we
|
|
|
|
dnl don't accidentally link against the libc++ there which is a newer
|
|
|
|
dnl version that what our build machines have installed.
|
|
|
|
LLVM_LDFLAGS=`echo "$LLVM_LDFLAGS" | sed -E 's/-L[[^ ]]+\/clang\/lib//'`
|
2016-02-05 23:23:18 +03:00
|
|
|
elif test "${HOST_OS_ARCH}" = "WINNT"; then
|
2018-10-12 14:14:00 +03:00
|
|
|
CLANG_LDFLAGS="clangASTMatchers.lib clang.lib"
|
2014-09-04 12:44:01 +04:00
|
|
|
else
|
|
|
|
CLANG_LDFLAGS="-lclangASTMatchers"
|
|
|
|
fi
|
|
|
|
|
2016-02-05 23:23:18 +03:00
|
|
|
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"
|
2020-02-20 17:31:38 +03:00
|
|
|
dnl We'll also want to replace `-std:` with `-Xclang -std=` so that
|
|
|
|
dnl LLVM_CXXFLAGS can correctly override the `-Xclang -std=` set by
|
|
|
|
dnl toolchain.configure.
|
|
|
|
LLVM_CXXFLAGS=`echo "$LLVM_CXXFLAGS"|sed -e 's/ \(-Xclang \|\)-std[[:=]]/ -Xclang -std=/'`
|
2016-02-05 23:23:18 +03:00
|
|
|
|
|
|
|
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
|
|
|
|
|
2017-10-26 01:12:10 +03:00
|
|
|
CLANG_PLUGIN_FLAGS="-Xclang -load -Xclang $CLANG_PLUGIN -Xclang -add-plugin -Xclang moz-check"
|
|
|
|
|
2014-09-04 12:44:01 +04:00
|
|
|
AC_DEFINE(MOZ_CLANG_PLUGIN)
|
|
|
|
fi
|
|
|
|
|
2017-11-10 02:04:33 +03:00
|
|
|
if test -n "$ENABLE_MOZSEARCH_PLUGIN"; then
|
|
|
|
if test -z "${ENABLE_CLANG_PLUGIN}"; then
|
|
|
|
AC_MSG_ERROR([Can't use mozsearch plugin without --enable-clang-plugin.])
|
|
|
|
fi
|
|
|
|
|
|
|
|
dnl We use this construct rather than $_objdir to avoid getting /js/src in the
|
|
|
|
dnl path when compiling JS code.
|
|
|
|
OBJDIR="$(dirname $(dirname $(dirname $CLANG_PLUGIN)))"
|
|
|
|
|
|
|
|
CLANG_PLUGIN_FLAGS="$CLANG_PLUGIN_FLAGS -Xclang -add-plugin -Xclang mozsearch-index"
|
|
|
|
|
|
|
|
dnl Parameters are: srcdir, outdir (path where output JSON is stored), objdir.
|
|
|
|
CLANG_PLUGIN_FLAGS="$CLANG_PLUGIN_FLAGS -Xclang -plugin-arg-mozsearch-index -Xclang $_topsrcdir"
|
|
|
|
CLANG_PLUGIN_FLAGS="$CLANG_PLUGIN_FLAGS -Xclang -plugin-arg-mozsearch-index -Xclang $OBJDIR/mozsearch_index"
|
|
|
|
CLANG_PLUGIN_FLAGS="$CLANG_PLUGIN_FLAGS -Xclang -plugin-arg-mozsearch-index -Xclang $OBJDIR"
|
|
|
|
|
|
|
|
AC_DEFINE(MOZ_MOZSEARCH_PLUGIN)
|
|
|
|
fi
|
|
|
|
|
2017-10-26 01:12:10 +03:00
|
|
|
AC_SUBST_LIST(CLANG_PLUGIN_FLAGS)
|
2017-10-26 01:12:10 +03:00
|
|
|
AC_SUBST_LIST(LLVM_CXXFLAGS)
|
2017-11-02 21:47:48 +03:00
|
|
|
AC_SUBST_LIST(LLVM_LDFLAGS)
|
|
|
|
AC_SUBST_LIST(CLANG_LDFLAGS)
|
2014-09-04 12:44:01 +04:00
|
|
|
|
|
|
|
AC_SUBST(ENABLE_CLANG_PLUGIN)
|
2017-11-10 02:04:33 +03:00
|
|
|
AC_SUBST(ENABLE_MOZSEARCH_PLUGIN)
|
2014-09-04 12:44:01 +04:00
|
|
|
|
|
|
|
])
|