blob: de0f9dc590f4c00eb00dad6ae27b2ce59155b166 [file] [log] [blame]
#! /usr/bin/env python
# encoding: utf-8
# Yingdi Yu (UCLA) 2016
'''
When using this tool, the wscript will look like:
def options(opt):
opt.load('openssl')
def configure(conf):
conf.load('compiler_cxx openssl')
conf.check_openssl()
def build(bld):
bld(source='main.cpp', target='app', use='OPENSSL')
'''
import re
from waflib import Utils, Logs
from waflib.Configure import conf
OPENSSL_VERSION_FILE = 'opensslv.h'
OPENSSL_DIR_OSX = ['/usr/local', '/opt/local', '/usr/local/opt/openssl']
OPENSSL_DIR = ['/usr', '/usr/local', '/opt/local', '/sw']
def options(opt):
opt.add_option('--with-openssl', type='string', default=None, dest='openssl_dir',
help='''Path to where OpenSSL is installed, e.g., /usr/local''')
@conf
def __openssl_get_version_file(self, dir):
try:
return self.root.find_dir(dir).find_node('%s/%s' % ('include/openssl',
OPENSSL_VERSION_FILE))
except:
return None
@conf
def __openssl_find_root_and_version_file(self, *k, **kw):
root = k and k[0] or kw.get('path', self.options.openssl_dir)
file = self.__openssl_get_version_file(root)
if root and file:
return (root, file)
openssl_dir = [];
if Utils.unversioned_sys_platform() == "darwin":
openssl_dir = OPENSSL_DIR_OSX
else:
openssl_dir = OPENSSL_DIR
if not root:
for dir in openssl_dir:
file = self.__openssl_get_version_file(dir)
if file:
return (dir, file)
if root:
self.fatal('OpenSSL not found in %s' % root)
else:
self.fatal('OpenSSL not found, please provide a --with-openssl=PATH argument (see help)')
@conf
def check_openssl(self, *k, **kw):
atleast_version = kw.get('atleast_version', 0)
var = kw.get('uselib_store', 'OPENSSL')
self.start_msg('Checking for OpenSSL lib')
(root, file) = self.__openssl_find_root_and_version_file(*k, **kw)
try:
txt = file.read()
re_version = re.compile('^#\\s*define\\s+OPENSSL_VERSION_NUMBER\\s+(.*)L', re.M)
version_number = re_version.search(txt)
re_version_text = re.compile('^#\\s*define\\s+OPENSSL_VERSION_TEXT\\s+(.*)', re.M)
version_text = re_version_text.search(txt)
if version_number and version_text:
version = version_number.group(1)
self.end_msg(version_text.group(1))
else:
self.fatal('OpenSSL version file is present, but is not recognizable')
except:
self.fatal('OpenSSL version file is not found or is not usable')
if int(version, 16) < atleast_version:
self.fatal("The version of OpenSSL is too old\n" +
"Please upgrade your distribution or install newer version of OpenSSL library")
kwargs = {}
if root:
kwargs['includes'] = "%s/include" % root
kwargs['libpath'] = "%s/lib" % root
libcrypto = self.check_cxx(lib=['ssl', 'crypto'],
msg='Checking if OpenSSL library works',
define_name='HAVE_%s' % var,
uselib_store=var,
mandatory=True,
**kwargs)