diff options
author | Paul Joseph Davis <davisp@apache.org> | 2012-03-13 20:44:45 -0500 |
---|---|---|
committer | Paul Joseph Davis <davisp@apache.org> | 2012-03-18 01:22:50 -0500 |
commit | 29eac043f391b5df78b568606d1e8a18f6bcba54 (patch) | |
tree | be4de9aa657b49baf854aac9410e960e7fc5ff68 | |
parent | 589a923a8df58c7edeff83601484ee85a4c124bc (diff) | |
download | couchdb-29eac043f391b5df78b568606d1e8a18f6bcba54.tar.gz |
COUCHDB-1426 Ensure use of specified SpiderMonkey
There were a few bugs in configuration settings when users specified
--with-js-include and --with-js-lib for custom SpiderMonkey
installations when a SpiderMonkey library is installed globally. This
patch addresses this by reordering configuration checks to use the
specified variables without adding information from pkg-config checks or
from default settings.
There is also a new setting --with-js-lib-name which is required due to
SpiderMonkey having so many names for its libraries. If configuration or
building fails the most likely scenario is that it picked up an older
installed SpiderMonkey in the library search path. To fix you should
only need to add --with-js-lib-name with the value that should be passed
to the linker. Ie, -lfoo would be set as "--with-js-lib-name=foo".
-rw-r--r-- | INSTALL.Unix | 10 | ||||
-rw-r--r-- | configure.ac | 136 | ||||
-rw-r--r-- | src/couchdb/priv/Makefile.am | 1 |
3 files changed, 99 insertions, 48 deletions
diff --git a/INSTALL.Unix b/INSTALL.Unix index baf9d060b..7c4549eb3 100644 --- a/INSTALL.Unix +++ b/INSTALL.Unix @@ -79,6 +79,16 @@ The same is true for recent versions of Erlang: brew link erlang +If you are upgrading your version of CouchDB and have an older nspr and +Spidermonkey installed you may encounter an error during the ./configure step +below. This is generally due to nspr being installed without its pkg-config +description. To fix the issue: + + brew remove --force spidermonkey + brew remove --force nspr + brew update + brew install spidermonkey + You will need Homebrew installed to use the `brew` command. Learn more about Homebrew at: diff --git a/configure.ac b/configure.ac index 30a1d652e..de212ec9f 100644 --- a/configure.ac +++ b/configure.ac @@ -112,6 +112,20 @@ else AC_MSG_RESULT([no]) fi +AC_ARG_VAR([ERLC_FLAGS], [general flags to prepend to ERLC_FLAGS]) +AC_ARG_VAR([FLAGS], [general flags to prepend to LDFLAGS and CPPFLAGS]) +AS_CASE([$(uname -s)], + [CYGWIN*], [] , + [*], [ + CPPFLAGS="$CPPFLAGS -I/opt/local/include" + CPPFLAGS="$CPPFLAGS -I/usr/local/include" + CPPFLAGS="$CPPFLAGS -I/usr/include" + LDFLAGS="$LDFLAGS -L/opt/local/lib" + LDFLAGS="$LDFLAGS -L/usr/local/lib" +]) +CPPFLAGS="$CPPFLAGS $FLAGS" +LDFLAGS="$LDFLAGS $FLAGS" + AC_PATH_PROG([ERL], [erl]) AS_IF([test x${ERL} = x], [ AC_MSG_ERROR([Could not find the `erl' executable. Is Erlang installed?]) @@ -137,33 +151,59 @@ AC_ARG_WITH([erlang], [AC_HELP_STRING([--with-erlang=PATH], ]) AC_SUBST(ERLANG_FLAGS) -PKG_CHECK_MODULES([JS], [mozjs185], [ - JS_LIB_DIR="$(${PKG_CONFIG} --variable=libdir mozjs185)" +PKG_CHECK_EXISTS([mozjs185], [ + PKG_CHECK_EXISTS([nspr], [], [ + AC_MSG_WARN([ + +You have the pkg-config file for mozjs185 isntalled but no pkg-config +file for NSPR. More than likely configure will fail. If it does it most +likely means you need to find on install the pkg-config file for NSPR. +This most commonly occurs on Mac OS X with older versions of Homebrew. + +You can correct this by removing SpiderMonkey and NSPR, updating +Homebrew and reinstalling. + +])])]) + +AC_ARG_WITH([js-lib], [AC_HELP_STRING([--with-js-lib=PATH], + [set PATH to the SpiderMonkey library directory])], + [ + JS_LIB_DIR=$withval ], [ - PKG_CHECK_MODULES([JS], [mozilla-js >= 1.7], [ - JS_LIB_DIR="$(${PKG_CONFIG} --variable=sdkdir mozilla-js)/lib" + PKG_CHECK_MODULES([JS185], [mozjs185], [ + JS_LIB_DIR="$(${PKG_CONFIG} --variable=libdir mozjs185)" ], [ - JS_LIB_DIR="${libdir}" - JS_CFLAGS="-I/usr/include" - JS_CFLAGS="$JS_CFLAGS -I/usr/include/js" - JS_CFLAGS="$JS_CFLAGS -I/usr/include/mozjs" - JS_CFLAGS="$JS_CFLAGS -I/usr/local/include/js" - JS_CFLAGS="$JS_CFLAGS -I/opt/local/include/js" + PKG_CHECK_MODULES([JS], [mozilla-js >= 1.7], [ + JS_LIB_DIR="$(${PKG_CONFIG} --variable=sdkdir mozilla-js)/lib" + ], [ + JS_LIB_DIR="${libdir}" + ]) ]) ]) +JS_LDFLAGS="-L$JS_LIB_DIR $LDFLAGS" + AC_ARG_WITH([js-include], [AC_HELP_STRING([--with-js-include=PATH], [set PATH to the SpiderMonkey include directory])], [ JS_INCLUDE="$withval" JS_CFLAGS="-I$JS_INCLUDE" -], []) - -AC_ARG_WITH([js-lib], [AC_HELP_STRING([--with-js-lib=PATH], - [set PATH to the SpiderMonkey library directory])], - [ - JS_LIB_DIR=$withval - JS_LIBS="-L$withval" -], []) + JS_CFLAGS="$JS_CFLAGS -I$JS_INCLUDE/js" + JS_CFLAGS="$JS_CFLAGS -I$JS_INCLUDE/mozjs" +], [ + PKG_CHECK_MODULES([JS185], [mozjs185], [ + JS_CFLAGS="$(${PKG_CONFIG} --cflags mozjs185)" + ], [ + PKG_CHECK_MODULES([JS], [mozilla-js >= 1.7], [ + JS_CFLAGS="$(${PKG_CONFIG} --cflags mozilla-js)" + ], [ + JS_CFLAGS="-I/usr/include" + JS_CFLAGS="$JS_CFLAGS -I/usr/include/js" + JS_CFLAGS="$JS_CFLAGS -I/usr/include/mozjs" + JS_CFLAGS="$JS_CFLAGS -I/usr/local/include/js" + JS_CFLAGS="$JS_CFLAGS -I/opt/local/include/js" + ]) + ]) +]) use_js_trunk=no AC_ARG_ENABLE([js-trunk], [AC_HELP_STRING([--enable-js-trunk], @@ -171,23 +211,6 @@ AC_ARG_ENABLE([js-trunk], [AC_HELP_STRING([--enable-js-trunk], use_js_trunk=$enableval ], []) -AC_ARG_VAR([ERLC_FLAGS], [general flags to prepend to ERLC_FLAGS]) -AC_ARG_VAR([FLAGS], [general flags to prepend to LDFLAGS and CPPFLAGS]) -AS_CASE([$(uname -s)], - [CYGWIN*], [] , - [*], [ - CPPFLAGS="$CPPFLAGS -I/opt/local/include" - CPPFLAGS="$CPPFLAGS -I/opt/local/include/js" - CPPFLAGS="$CPPFLAGS -I/usr/local/include" - CPPFLAGS="$CPPFLAGS -I/usr/local/include/js" - CPPFLAGS="$CPPFLAGS -I/usr/include" - CPPFLAGS="$CPPFLAGS -I/usr/include/js" - LDFLAGS="$LDFLAGS -L/opt/local/lib" - LDFLAGS="$LDFLAGS -L/usr/local/lib" -]) -CPPFLAGS="$CPPFLAGS $FLAGS" -LDFLAGS="$LDFLAGS $FLAGS" - # The erlang cc.sh/ld.sh scripts will convert a -O option # into the same optimization flags erlang itself uses. CFLAGS="-O2 $CFLAGS" @@ -206,10 +229,12 @@ AS_CASE([$(uname -s)], AM_CONDITIONAL([WINDOWS], [test x$IS_WINDOWS = xTRUE]) -OLD_LIBS="$LIBS" -LIBS="$JS_LIBS $LIBS" OLD_CPPFLAGS="$CPPFLAGS" +OLD_LDFLAGS="$LDFLAGS" +OLD_LIBS="$LIBS" CPPFLAGS="$JS_CFLAGS $CPPFLAGS" +LDFLAGS="$JS_LDFLAGS" +LIBS="$JS_LIBS $LIBS" AC_CHECK_HEADER([jsapi.h], [], [ AC_CHECK_HEADER([js/jsapi.h], @@ -222,15 +247,24 @@ AC_CHECK_HEADER([jsapi.h], [], [ Are the Mozilla SpiderMonkey headers installed?]) ])]) -AC_CHECK_LIB([mozjs185], [JS_NewContext], [JS_LIB_BASE=mozjs185], [ - AC_CHECK_LIB([mozjs185-1.0], [JS_NewContext], [JS_LIB_BASE=mozjs185-1.0], [ - AC_CHECK_LIB([mozjs], [JS_NewContext], [JS_LIB_BASE=mozjs], [ - AC_CHECK_LIB([js], [JS_NewContext], [JS_LIB_BASE=js], [ - AC_CHECK_LIB([js3250], [JS_NewContext], [JS_LIB_BASE=js3250], [ - AC_CHECK_LIB([js32], [JS_NewContext], [JS_LIB_BASE=js32], [ - AC_MSG_ERROR([Could not find the js library. +AC_ARG_WITH([js-lib-name], [AC_HELP_STRING([--with-js-lib-name=NAME], + [set Spidermonkey library NAME])], [ + JS_LIB_BASE="$withval" + AC_CHECK_LIB([$JS_LIB_BASE], JS_NewObject, [], [ + AC_MSG_ERROR([Could not find the Spidermonkey library. + +Did you specify the correct library name?])]) + ], [ + AC_CHECK_LIB(mozjs, [JS_NewObject], [JS_LIB_BASE=mozjs], [ + AC_CHECK_LIB(js, [JS_NewObject], [JS_LIB_BASE=js], [ + AC_CHECK_LIB([js3250], [JS_NewObject], [JS_LIB_BASE=js3250], [ + AC_CHECK_LIB([js32], [JS_NewObject], [JS_LIB_BASE=js32], [ + AC_CHECK_LIB([mozjs185-1.0], [JS_NewObject], [JS_LIB_BASE=mozjs185-1.0], [ + AC_CHECK_LIB(mozjs185, [JS_NewObject], [JS_LIB_BASE=mozjs185], [ + AC_MSG_ERROR([Could not find the js library. Is the Mozilla SpiderMonkey library installed?])])])])])])]) +]) # Figure out what version of SpiderMonkey to use @@ -241,6 +275,8 @@ AC_CHECK_LIB([$JS_LIB_BASE], [JS_NewCompartmentAndGlobalObject], AC_CHECK_DECL([JSOPTION_ANONFUNFIX], [], [ AC_MSG_ERROR([Your SpiderMonkey library is too new. +NOTE: Check above for an error about NSPR + Versions of SpiderMonkey after the js185-1.0.0 release remove the optional enforcement of preventing anonymous functions in a statement context. This will most likely break your existing JavaScript code as well as render all @@ -318,12 +354,16 @@ if test x${IS_WINDOWS} = xTRUE; then fi fi -JS_LIBS="-l$JS_LIB_BASE -lm $JS_LIBS" -AC_SUBST(JS_LIBS) - -LIBS="$OLD_LIBS" +JS_CFLAGS="$CPPFLAGS" +JS_LDFLAGS="$LDFLAGS" +JS_LIBS="-l$JS_LIB_BASE -lm $LIBS" CPPFLAGS="$OLD_CPPFLAGS" +LDFLAGS="$OLD_LDFLAGS" +LIBS="$OLD_LIBS" +AC_SUBST(JS_CFLAGS) +AC_SUBST(JS_LDFLAGS) +AC_SUBST(JS_LIBS) AC_ARG_WITH([win32-icu-binaries], [AC_HELP_STRING([--with-win32-icu-binaries=PATH], [set PATH to the Win32 native ICU binaries directory])], [ diff --git a/src/couchdb/priv/Makefile.am b/src/couchdb/priv/Makefile.am index 704e8708d..ac027911f 100644 --- a/src/couchdb/priv/Makefile.am +++ b/src/couchdb/priv/Makefile.am @@ -61,6 +61,7 @@ COUCHJS_SRCS = \ locallibbin_PROGRAMS = couchjs couchjs_SOURCES = $(COUCHJS_SRCS) couchjs_CFLAGS = -g -Wall -Werror -D_BSD_SOURCE $(CURL_CFLAGS) $(JS_CFLAGS) +couchjs_LDFLAGS = $(JS_LDFLAGS) couchjs_LDADD = $(CURL_LIBS) $(JS_LIBS) couchpriv_DATA = stat_descriptions.cfg |