summaryrefslogtreecommitdiff
path: root/couchjs/c_src/SConscript
blob: 8529ad4dc5ca33b0c5d5803913e8b5620e9684c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# 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'])