# Copyright 2010-2012 Cloudant # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. import os import commands import platform def require_lib(name): if not conf.CheckLib(name): print 'Could not find required library', name Exit(1) def runcmd(cmd): return commands.getstatusoutput(cmd) # support --static for static builds AddOption('--static', dest='static', action="store_true", default=False) # support --nocurl to build without curl AddOption('--nocurl', dest='usecurl', action="store_false", default=True) env = Environment(CC="c++", CCFLAGS='-g -O2 -DXP_UNIX', CPPPATH=os.getenv("CPPPATH")) # possibly attempt a static build of couchjs # warning! requires a libmozjs with --disable-threads! if GetOption('static'): env.Append(LINKFLAGS=['-static', '-static-libgcc', '-static-libstdc++']) if os.uname()[0] == 'SunOS': env['CC'] = '/usr/sfw/bin/gcc' env['CCFLAGS'] += ' -I/opt/local/include' env.Append(LINKFLAGS=['-L/opt/local/lib']) if os.uname()[0] == 'FreeBSD': env['CCFLAGS'] += ' -I/usr/local/include' env.Append(LINKFLAGS=['-L/usr/local/lib']) env['LIB_DL'] = env['LIB_RT'] = '' env['LIB_COMPAT'] = 'compat' if os.path.exists('/usr/bin/pkg-config'): for pkg in ["mozilla-js-185", "mozilla-js", "mozjs185"]: (s1, output) = runcmd("/usr/bin/pkg-config %s --cflags" % pkg) if s1 == 0: env.Append(CCFLAGS=" " + output) (s2, output) = runcmd("/usr/bin/pkg-config %s --libs-only-L" % pkg) if s2 == 0: env.Append(LINKFLAGS=output) if s1 == 0 or s2 == 0: break if not env.GetOption('clean'): conf = Configure(env, config_h='config.h') ## check for SpiderMonkey development header if conf.CheckHeader('mozjs/jsapi.h'): jsapi = 'mozjs/jsapi.h' elif conf.CheckHeader('js/jsapi.h'): jsapi = 'js/jsapi.h' elif conf.CheckHeader('jsapi.h'): jsapi = 'jsapi.h' else: print 'Could not find jsapi.h.', \ 'Are Mozilla SpiderMonkey headers installed?' Exit(1) ## check for SpiderMonkey library as libjs or libmozjs if not conf.CheckLibWithHeader('mozjs185-1.0', jsapi, 'c', autoadd=1): if not conf.CheckLibWithHeader('mozjs185', jsapi, 'c', autoadd=1): if not conf.CheckLibWithHeader('mozjs', jsapi, 'c', autoadd=1): if not conf.CheckLibWithHeader('js', jsapi, 'c', autoadd=1): print 'Could not find JS library.', \ 'Is Mozilla SpiderMonkey installed?' Exit(1) ## Detect the version of SpiderMonkey we're using jsheader = "#include <%s>" % jsapi versions = [ ("JS_NewCompartmentAndGlobalObject", "SM185"), ("JS_ThrowStopIteration", "SM180"), ("JS_GetStringCharsAndLength", "SM170") ] for func, vsn in versions: if conf.CheckDeclaration(func, jsheader): conf.Define(vsn) break ## Find the proper type for JS script objects if conf.CheckType("JSScript*", '#include "%s"' % jsapi): conf.Define("JSSCRIPT_TYPE", "JSScript*") else: conf.Define("JSSCRIPT_TYPE", "JSObject*") ## Check if curl is available if GetOption('usecurl'): try: vsn = runcmd("curl-config --version")[1] vsn = vsn.split()[-1].strip().split(".") vsn = tuple(map(int, vsn)) if vsn > (7, 18, 0): require_lib('curl') except: pass ## Must be specified after js/curl in this order for a static build if not GetOption('static'): require_lib('nspr4') require_lib('pthread') require_lib('m') ## Define properties for -h / -V (_, vsn) = runcmd("git describe --match 1.*") conf.Define("PACKAGE_STRING", '"%s"' % vsn.rstrip()) conf.Define("PACKAGE_NAME", '"Cloudant BigCouch"') conf.Define("PACKAGE_BUGREPORT", '"https://github.com/cloudant/bigcouch/issues"') env = conf.Finish() env.Program('couchjs', ['main.c', 'http.c', 'utf8.c', 'util.c'])