sodium-native
Version:
Low level bindings for libsodium
77 lines (66 loc) • 2 kB
JavaScript
var os = require('os')
var fs = require('fs')
var path = require('path')
var proc = require('child_process')
var ini = require('ini')
var release = path.join(__dirname, 'build/Release')
var debug = path.join(__dirname, 'build/Debug')
var tmp = path.join(__dirname, 'tmp')
var build = fs.existsSync(release) ? release : debug
var arch = process.env.PREBUILD_ARCH || os.arch()
switch (os.platform()) {
case 'win32':
buildWindows()
break
case 'darwin':
buildDarwin()
break
case 'freebsd':
case 'openbsd':
default:
buildUnix()
break
}
function buildWindows () {
var lib = path.join(__dirname, 'lib/libsodium-' + arch + '.dll')
var dst = path.join(build, 'libsodium.dll')
if (fs.existsSync(dst)) return
copy(lib, dst, function (err) {
if (err) throw err
})
}
function buildUnix () {
var lib = fs.realpathSync(path.join(__dirname, 'lib/libsodium-' + arch + '.so'))
var la = ini.decode(fs.readFileSync(path.join(tmp, 'lib/libsodium.la')).toString())
var dst = path.join(build, la.dlname)
if (fs.existsSync(dst)) return
copy(lib, dst, function (err) {
if (err) throw err
})
}
function buildDarwin () {
var lib = path.join(__dirname, 'lib/libsodium-' + arch + '.dylib')
var dst = path.join(build, 'libsodium.dylib')
if (fs.existsSync(dst)) return
copy(lib, dst, function (err) {
if (err) throw err
proc.exec('install_name_tool -id "@loader_path/libsodium.dylib" libsodium.dylib', { cwd: build }, function (err) {
if (err) throw err
proc.exec('install_name_tool -change "' + lib + '" "@loader_path/libsodium.dylib" sodium.node', { cwd: build }, function (err) {
if (err) throw err
})
})
})
}
function copy (a, b, cb) {
fs.stat(a, function (err, st) {
if (err) return cb(err)
fs.readFile(a, function (err, buf) {
if (err) return cb(err)
fs.writeFile(b, buf, function (err) {
if (err) return cb(err)
fs.chmod(b, st.mode, cb)
})
})
})
}