123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- const query = process.argv[2]
- const fs = require('fs')
- const childProcess = require('child_process')
- const SYSTEM_PATHS = [
- '/lib',
- '/usr/lib',
- '/usr/lib64',
- '/usr/local/lib',
- '/opt/local/lib',
- '/opt/homebrew/lib',
- '/usr/lib/x86_64-linux-gnu',
- '/usr/lib/i386-linux-gnu',
- '/usr/lib/arm-linux-gnueabihf',
- '/usr/lib/arm-linux-gnueabi',
- '/usr/lib/aarch64-linux-gnu'
- ]
- /**
- * Checks for lib using ldconfig if present, or searching SYSTEM_PATHS
- * otherwise.
- * @param {string} lib - library name, e.g. 'jpeg' in 'libjpeg64.so' (see first line)
- * @return {boolean} exists
- */
- function hasSystemLib (lib) {
- const libName = 'lib' + lib + '.+(so|dylib)'
- const libNameRegex = new RegExp(libName)
- // Try using ldconfig on linux systems
- if (hasLdconfig()) {
- try {
- if (childProcess.execSync('ldconfig -p 2>/dev/null | grep -E "' + libName + '"').length) {
- return true
- }
- } catch (err) {
- // noop -- proceed to other search methods
- }
- }
- // Try checking common library locations
- return SYSTEM_PATHS.some(function (systemPath) {
- try {
- const dirListing = fs.readdirSync(systemPath)
- return dirListing.some(function (file) {
- return libNameRegex.test(file)
- })
- } catch (err) {
- return false
- }
- })
- }
- /**
- * Checks for ldconfig on the path and /sbin
- * @return {boolean} exists
- */
- function hasLdconfig () {
- try {
- // Add /sbin to path as ldconfig is located there on some systems -- e.g.
- // Debian (and it can still be used by unprivileged users):
- childProcess.execSync('export PATH="$PATH:/sbin"')
- process.env.PATH = '...'
- // execSync throws on nonzero exit
- childProcess.execSync('hash ldconfig 2>/dev/null')
- return true
- } catch (err) {
- return false
- }
- }
- /**
- * Checks for freetype2 with --cflags-only-I
- * @return Boolean exists
- */
- function hasFreetype () {
- try {
- if (childProcess.execSync('pkg-config cairo --cflags-only-I 2>/dev/null | grep freetype2').length) {
- return true
- }
- } catch (err) {
- // noop
- }
- return false
- }
- /**
- * Checks for lib using pkg-config.
- * @param {string} lib - library name
- * @return {boolean} exists
- */
- function hasPkgconfigLib (lib) {
- try {
- // execSync throws on nonzero exit
- childProcess.execSync('pkg-config --exists "' + lib + '" 2>/dev/null')
- return true
- } catch (err) {
- return false
- }
- }
- function main (query) {
- switch (query) {
- case 'gif':
- case 'cairo':
- return hasSystemLib(query)
- case 'pango':
- return hasPkgconfigLib(query)
- case 'freetype':
- return hasFreetype()
- case 'jpeg':
- return hasPkgconfigLib('libjpeg')
- case 'rsvg':
- return hasPkgconfigLib('librsvg-2.0')
- default:
- throw new Error('Unknown library: ' + query)
- }
- }
- process.stdout.write(main(query).toString())
|