1
- import sys . process . _
1
+
2
2
3
3
name := " bblfsh-client"
4
4
organization := " org.bblfsh"
5
- version := " 1.11.0 "
5
+ version := " 2.0.0-SNAPSHOT "
6
6
7
7
scalaVersion := " 2.11.11"
8
- val libuastVersion = " 1.9.3 "
9
- val sdkVersion = " v1.17.0 "
10
- val sdkMajor = " v1 "
8
+ val libuastVersion = " 3.3.1 "
9
+ val sdkMajor = " v3 "
10
+ val sdkVersion = s " ${sdkMajor} .1.0 "
11
11
val protoDir = " src/main/proto"
12
12
13
13
mainClass in Compile := Some (" org.bblfsh.client.cli.ScalaClientCLI" )
@@ -92,35 +92,48 @@ getProtoFiles := {
92
92
93
93
println(s " Downloading and installing SDK $sdkMajor protocol buffer files... " )
94
94
95
- val bblfshProto = f " $ protoDir%s/gopkg.in /bblfsh"
96
- val sdkProto = f " $ bblfshProto%s /sdk. $ sdkMajor%s "
95
+ val bblfshProto = s " ${ protoDir} /github.com /bblfsh"
96
+ val sdkProto = s " ${ bblfshProto} /sdk/ ${ sdkMajor} "
97
97
98
- f " mkdir -p $sdkProto%s /protocol" !
98
+ s " mkdir -p ${ sdkProto} /protocol " !
99
99
100
- f " mkdir -p $sdkProto%s /uast" !
100
+ s " mkdir -p ${ sdkProto} /uast/role " !
101
101
102
102
val unzip_dir = " sdk-" + sdkVersion.substring(1 )
103
103
104
- f " curl -SL https://github.com/bblfsh/sdk/archive/ $sdkVersion%s.tar.gz " #| " tar xz" #&&
105
- f " cp $unzip_dir%s/protocol/generated.proto $sdkProto%s/protocol/ " #&&
106
- f " cp $unzip_dir%s/uast/generated.proto $sdkProto%s/uast/ " #&&
107
- f " rm -rf $unzip_dir%s " !
104
+ s " curl -SL https://github.com/bblfsh/sdk/archive/ ${sdkVersion}.tar.gz " #| " tar xz" #&&
105
+ s " cp ${unzip_dir}/protocol/driver.proto ${sdkProto}/protocol/ " #&&
106
+ s " cp ${unzip_dir}/uast/role/generated.proto ${sdkProto}/uast/role " #&&
107
+ s " rm -rf ${unzip_dir}" !
108
+
109
+ println(" Done unpacking SDK" )
108
110
}
109
111
110
112
val getLibuast = TaskKey [Unit ](" getLibuast" , " Retrieve libuast" )
111
113
getLibuast := {
112
114
import sys .process ._
113
115
114
- val releaseUrl = s " https://github.com/bblfsh/libuast/archive/v $libuastVersion.tar.gz "
115
- println(s " Downloading libuast from $releaseUrl" )
116
+ val ghUrl = " https://github.com/bblfsh/libuast"
117
+ val os = if (System .getProperty(" os.name" ).toLowerCase.contains(" mac os x" )) " darwin" else " linux"
118
+ val binaryReleaseUrl = s " ${ghUrl}/releases/download/v ${libuastVersion}/libuast- ${os}-amd64.tar.gz "
119
+ println(s " Downloading libuast binary from ${binaryReleaseUrl}" )
120
+
121
+ s " curl -sL ${binaryReleaseUrl} -o libuast-bin.tar.gz " #&&
122
+ " tar xzf libuast-bin.tar.gz" #&&
123
+ s " mv ${os}-amd64 libuast " #&&
124
+ " mkdir -p src/main/resources" #&&
125
+ " rm -rf src/main/resources/libuast" #&&
126
+ " mv libuast src/main/resources" #&&
127
+ " rm src/main/resources/libuast/libuast.so" #&& // always a static build
128
+ " rm libuast-bin.tar.gz" !
129
+
130
+ " find src/main/resources" !
116
131
117
- f " curl -SL $releaseUrl -o libuast.tar.gz " #&&
118
- " tar zxf libuast.tar.gz" #&&
119
- f " mv libuast- $libuastVersion libuast " #&&
120
- " rm -rf src/libuast-native" #&&
121
- " mv libuast/src/ src/libuast-native" #&&
122
- " rm -rf libuast" #&&
123
- " rm libuast.tar.gz" !
132
+ " nm src/main/resources/libuast/libuast.a" #| " grep -c UastDecode" !
133
+
134
+ " nm src/main/resources/libuast/libuast.a" #| " wc -l" !
135
+
136
+ println(" Done unpacking libuast" )
124
137
}
125
138
126
139
val compileScalaLibuast = TaskKey [Unit ](" compileScalaLibuast" , " Compile libScalaUast JNI library" )
@@ -131,15 +144,11 @@ compileScalaLibuast := {
131
144
132
145
" mkdir -p ./src/main/resources/lib/" !
133
146
134
- val sourceFiles = " src/main/scala/org/bblfsh/client/libuast/org_bblfsh_client_libuast_Libuast.cc " +
135
- " src/main/scala/org/bblfsh/client/libuast/jni_utils.cc " +
136
- " src/main/scala/org/bblfsh/client/libuast/nodeiface.cc " +
137
- " src/main/scala/org/bblfsh/client/libuast/memtracker.cc " +
138
- " src/libuast-native/uast.cc " +
139
- " src/libuast-native/roles.c "
147
+ val nativeSourceFiles = " src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc " +
148
+ " src/main/native/jni_utils.cc "
140
149
141
- compileUnix(sourceFiles )
142
- crossCompileMacOS(sourceFiles )
150
+ compileUnix(nativeSourceFiles )
151
+ crossCompileMacOS(nativeSourceFiles )
143
152
}
144
153
145
154
def compileUnix (sourceFiles : String ) = {
@@ -149,31 +158,32 @@ def compileUnix(sourceFiles: String) = {
149
158
if (javaHome == null ) {
150
159
javaHome = " /usr/lib/jvm/java-8-openjdk-amd64"
151
160
}
152
- val xml2Conf = " xml2-config --cflags --libs" !!
153
161
154
162
val osName = System .getProperty(" os.name" ).toLowerCase()
155
- if (osName.contains(" mac os x" )) {
156
- val cmd : String = " g++ -shared -Wall -fPIC -O2 -std=c++11 " +
163
+ if (osName.contains(" mac os x" )) { // TODO(bzz): change back to '-fPIC -O2' for release
164
+ val cmd : String = " g++ -shared -Wall -g -std=c++11 " +
157
165
" -I/usr/include " +
158
166
" -I" + javaHome + " /include/ " +
159
167
" -I" + javaHome + " /include/darwin " +
160
- " -Isrc/libuast-native/ " +
161
- " -o src/main/resources/lib/libscalauast.dylib " +
168
+ " -Isrc/main/resources/libuast " +
169
+ " -o src/main/resources/lib/libscalauast.dylib " + // sic, must be in the classpath for the test
162
170
sourceFiles +
163
- xml2Conf + " "
171
+ " src/main/resources/libuast/libuast.a "
164
172
165
173
checkedProcess(cmd, " macOS build" )
166
174
} else {
167
175
val cmd : String = " g++ -shared -Wall -fPIC -O2 -std=c++11 " +
168
176
" -I/usr/include " +
169
177
" -I" + javaHome + " /include/ " +
170
178
" -I" + javaHome + " /include/linux " +
171
- " -Isrc/libuast-native/ " +
179
+ " -Isrc/main/resources/libuast " +
172
180
" -o src/main/resources/lib/libscalauast.so " +
173
181
sourceFiles +
174
- xml2Conf + " "
182
+ " src/main/resources/libuast/libuast.a "
175
183
176
184
checkedProcess(cmd, " Linux build" )
185
+
186
+ " nm src/main/resources/lib/libscalauast.so" #| " grep -c UastDecode" !
177
187
}
178
188
}
179
189
@@ -183,22 +193,21 @@ def crossCompileMacOS(sourceFiles: String): Unit = {
183
193
println(" Skipping cross-compilation for macOS on macOS" )
184
194
return
185
195
}
186
- val osxHome = System .getenv(" OSXCROSS_PATH" )
187
196
197
+ val osxHome = System .getenv(" OSXCROSS_PATH" )
188
198
if (osxHome == null || osxHome.isEmpty) {
189
199
println(" OSXCROSS_PATH variable not defined, not cross-compiling for macOS" )
190
200
return
191
201
}
192
202
193
203
val cmd = osxHome + " /bin/o64-clang++-libc++ -shared -Wall -fPIC -O2 -lxml2 -std=c++11 " +
194
- " -I" + osxHome + " /SDK/MacOSX10.11.sdk/usr/include/libxml2/ " +
195
- " -I" + osxHome + " /SDK/src/libuast-native/roles.c " +
196
204
" -I" + osxHome + " /SDK/MacOSX10.11.sdk/usr/include/ " +
197
205
" -I/usr/lib/jvm/java-8-openjdk-amd64/include " +
198
206
" -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux " +
199
207
" -Isrc/libuast-native/ " +
200
208
" -o src/main/resources/lib/libscalauast.dylib " +
201
- sourceFiles
209
+ sourceFiles +
210
+ " src/main/resources/libuast/libuast.a "
202
211
203
212
checkedProcess(cmd, " macOS cross-compile build" )
204
213
}
@@ -214,4 +223,10 @@ def checkedProcess(cmd: String, name: String) {
214
223
}
215
224
}
216
225
226
+ cleanFiles ++= Seq (
227
+ baseDirectory.value / " src/main/resources/libuast" ,
228
+ baseDirectory.value / " src/main/resources/lib" ,
229
+ baseDirectory.value / s " ${protoDir}/github.com/bblfsh "
230
+ )
231
+
217
232
mainClass := Def .sequential(getProtoFiles, getLibuast, compileScalaLibuast, (mainClass in Compile )).value
0 commit comments