forked from jacobdufault/cquery
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwscript
More file actions
160 lines (135 loc) · 5.4 KB
/
wscript
File metadata and controls
160 lines (135 loc) · 5.4 KB
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#! /usr/bin/env python
# encoding: utf-8
from urllib2 import urlopen # Python 2
# from urllib.request import urlopen # Python 3
import os.path
from subprocess import call
import sys
VERSION='0.0.1'
APPNAME='indexer'
top = '.'
out = 'build'
# Example URLs
# http://releases.llvm.org/4.0.0/clang+llvm-4.0.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz
# http://releases.llvm.org/4.0.0/clang+llvm-4.0.0-x86_64-apple-darwin.tar.xz
# http://releases.llvm.org/4.0.0/LLVM-4.0.0-win64.exe
# TODO: windows support (it's an exe!)
global CLANG_PLATFORM_NAME
global CLANG_TARBALL_PLATFORM_NAME
if sys.platform == 'linux' or sys.platform == 'linux2':
CLANG_PLATFORM_NAME = 'x86_64-linux-gnu-ubuntu-14.04'
CLANG_TARBALL_PLATFORM_NAME = 'clang+llvm'
elif sys.platform == 'darwin':
CLANG_PLATFORM_NAME = 'x86_64-apple-darwin'
CLANG_TARBALL_PLATFORM_NAME = 'clang+llvm'
else:
sys.stderr.write('ERROR: Unknown platform {0}\n'.format(sys.platform))
sys.exit(1)
# Version of clang to download and use.
CLANG_VERSION = '4.0.0'
# Tarball name on clang servers that should be used.
CLANG_TARBALL_NAME = '{0}-{1}-{2}'.format(CLANG_TARBALL_PLATFORM_NAME, CLANG_VERSION, CLANG_PLATFORM_NAME)
# Directory clang has been extracted to.
CLANG_DIRECTORY = '{0}/{1}'.format(out, CLANG_TARBALL_NAME)
# URL of the tarball to download.
CLANG_TARBALL_URL = 'http://releases.llvm.org/{0}/{1}.tar.xz'.format(CLANG_VERSION, CLANG_TARBALL_NAME)
# Path to locally tarball.
CLANG_TARBALL_LOCAL_PATH = '{0}.tar.xz'.format(CLANG_DIRECTORY)
# Directory libcxx will be extracted to.
LIBCXX_DIRECTORY = '{0}/libcxx'.format(out)
# URL to download libcxx from.
LIBCXX_URL = 'http://releases.llvm.org/4.0.0/libcxx-4.0.0.src.tar.xz'
# Absolute path for where to download the URL.
LIBCXX_LOCAL_PATH = '{0}/libcxx-4.0.0.src.tar.xz'.format(out)
from waflib.Tools.compiler_cxx import cxx_compiler
cxx_compiler['linux'] = ['clang++', 'g++']
def options(opt):
opt.load('compiler_cxx')
def download_and_extract(destdir, dest, url):
# Download and save the compressed tarball as |compressed_file_name|.
if not os.path.isfile(dest):
print('Downloading tarball')
print(' destination: {0}'.format(dest))
print(' source: {0}'.format(url))
# TODO: verify checksum
response = urlopen(url)
with open(dest, 'wb') as f:
f.write(response.read())
else:
print('Found tarball at {0}'.format(dest))
# Extract the tarball.
if not os.path.isdir(destdir):
print('Extracting')
# TODO: make portable.
call(['tar', 'xf', dest, '-C', out])
else:
print('Found extracted at {0}'.format(destdir))
def configure(conf):
conf.load('compiler_cxx')
conf.check(header_name='stdio.h', features='cxx cxxprogram', mandatory=True)
conf.load('clang_compilation_database', tooldir='.')
print('Checking for clang')
download_and_extract(CLANG_DIRECTORY, CLANG_TARBALL_LOCAL_PATH, CLANG_TARBALL_URL)
#print('Checking for libcxx')
#download_and_extract(LIBCXX_DIRECTORY, LIBCXX_LOCAL_PATH, LIBCXX_URL)
"""
# Download and save the compressed tarball as |compressed_file_name|.
if not os.path.isfile(CLANG_TARBALL_LOCAL_PATH):
print('Downloading clang tarball')
print(' destination: {0}'.format(CLANG_TARBALL_LOCAL_PATH))
print(' source: {0}'.format(CLANG_TARBALL_URL))
# TODO: verify checksum
response = urlopen(CLANG_TARBALL_URL)
with open(CLANG_TARBALL_LOCAL_PATH, 'wb') as f:
f.write(response.read())
else:
print('Found clang tarball at {0}'.format(CLANG_TARBALL_LOCAL_PATH))
# Extract the tarball.
if not os.path.isdir(CLANG_DIRECTORY):
print('Extracting clang')
# TODO: make portable.
call(['tar', 'xf', CLANG_TARBALL_LOCAL_PATH, '-C', out])
else:
print('Found extracted clang at {0}'.format(CLANG_DIRECTORY))
"""
def build(bld):
# todo: configure vars
CLANG_INCLUDE_DIR = '{0}/include'.format(CLANG_DIRECTORY)
CLANG_LIB_DIR = '{0}/lib'.format(CLANG_DIRECTORY)
CLANG_INCLUDE_DIR = os.path.abspath(CLANG_INCLUDE_DIR)
CLANG_LIB_DIR = os.path.abspath(CLANG_LIB_DIR)
print('CLANG_INCLUDE_DIR: {0}'.format(CLANG_INCLUDE_DIR))
print('CLANG_LIB_DIR: {0}'.format(CLANG_LIB_DIR))
cc_files = bld.path.ant_glob(['src/**/*.cpp', 'src/**/*.cc'])
lib = ['clang']
if sys.platform == 'linux' or sys.platform == 'linux2':
lib.append('rt')
lib.append('pthread')
elif sys.platform == 'darwin':
lib.append('pthread')
bld.program(
source=cc_files,
cxxflags=['-g', '-O3', '-std=c++11', '-Wall', '-Werror'],
includes=[
'third_party/',
'third_party/doctest/',
'third_party/rapidjson/include/',
'third_party/sparsehash/src/',
'third_party/sparsepp/',
CLANG_INCLUDE_DIR],
lib=lib,
libpath=[CLANG_LIB_DIR],
rpath=[CLANG_LIB_DIR],
target='app')
#bld.shlib(source='a.cpp', target='mylib', vnum='9.8.7')
#bld.shlib(source='a.cpp', target='mylib2', vnum='9.8.7', cnum='9.8')
#bld.shlib(source='a.cpp', target='mylib3')
#bld.program(source=cc_files, target='app', use='mylib')
#bld.stlib(target='foo', source='b.cpp')
# just a test to check if the .c is compiled as c++ when no c compiler is found
#bld.program(features='cxx cxxprogram', source='main.c', target='app2')
#if bld.cmd != 'clean':
# from waflib import Logs
# bld.logger = Logs.make_logger('test.log', 'build') # just to get a clean output
# bld.check(header_name='sadlib.h', features='cxx cxxprogram', mandatory=False)
# bld.logger = None