mirror of https://github.com/tp4a/teleport
develop on MacOS.
parent
15e5c47125
commit
53889c4592
37
build.sh
37
build.sh
|
@ -1,8 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
|
||||||
PATH_ROOT=$(cd "$(dirname "$0")"; pwd)
|
PATH_ROOT=$(cd "$(dirname "$0")"; pwd)
|
||||||
PYEXEC=${PATH_ROOT}/external/linux/release/bin/python3.4
|
|
||||||
PYSTATIC=${PATH_ROOT}/external/linux/release/lib/libpython3.4m.a
|
|
||||||
|
|
||||||
function on_error()
|
function on_error()
|
||||||
{
|
{
|
||||||
|
@ -14,14 +13,34 @@ function on_error()
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ ! -f "${PYSTATIC}" ]; then
|
function build_linux
|
||||||
echo "python static not found, now build it..."
|
{
|
||||||
"${PATH_ROOT}/build/build-py-static.sh"
|
PYEXEC=${PATH_ROOT}/external/linux/release/bin/python3.4
|
||||||
|
PYSTATIC=${PATH_ROOT}/external/linux/release/lib/libpython3.4m.a
|
||||||
|
|
||||||
if [ ! -f "${PYSTATIC}" ]; then
|
if [ ! -f "${PYSTATIC}" ]; then
|
||||||
on_error "can not build python static."
|
echo "python static not found, now build it..."
|
||||||
|
"${PATH_ROOT}/build/build-py-static.sh"
|
||||||
|
|
||||||
|
if [ ! -f "${PYSTATIC}" ]; then
|
||||||
|
on_error "can not build python static."
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
${PYEXEC} -B "${PATH_ROOT}/build/build.py" $@
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_macos
|
||||||
|
{
|
||||||
|
python3 -B "${PATH_ROOT}/build/build.py" $@
|
||||||
|
}
|
||||||
|
|
||||||
|
SYSTEM=`uname -s`
|
||||||
|
if [ $SYSTEM = "Linux" ] ; then
|
||||||
|
build_linux
|
||||||
|
elif [ $SYSTEM = "Darwin" ] ; then
|
||||||
|
build_macos
|
||||||
|
else
|
||||||
|
echo "Unsupported platform."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
${PYEXEC} -B "${PATH_ROOT}/build/build.py" $@
|
|
||||||
|
|
|
@ -514,11 +514,276 @@ class BuilderLinux(BuilderBase):
|
||||||
utils.remove(_path)
|
utils.remove(_path)
|
||||||
|
|
||||||
|
|
||||||
|
class BuilderMacOS(BuilderBase):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
def _init_path(self):
|
||||||
|
self.PATH_TMP = os.path.join(PATH_EXTERNAL, 'macos', 'tmp')
|
||||||
|
self.PATH_RELEASE = os.path.join(PATH_EXTERNAL, 'macos', 'release')
|
||||||
|
self.OPENSSL_PATH_SRC = os.path.join(self.PATH_TMP, 'openssl-{}'.format(env.ver_openssl))
|
||||||
|
self.LIBUV_PATH_SRC = os.path.join(self.PATH_TMP, 'libuv-{}'.format(env.ver_libuv))
|
||||||
|
self.MBEDTLS_PATH_SRC = os.path.join(self.PATH_TMP, 'mbedtls-mbedtls-{}'.format(env.ver_mbedtls))
|
||||||
|
self.LIBSSH_PATH_SRC = os.path.join(self.PATH_TMP, 'libssh-{}'.format(env.ver_libssh))
|
||||||
|
self.SQLITE_PATH_SRC = os.path.join(self.PATH_TMP, 'sqlite-autoconf-{}'.format(env.ver_sqlite))
|
||||||
|
|
||||||
|
self.JSONCPP_PATH_SRC = os.path.join(PATH_EXTERNAL, 'jsoncpp')
|
||||||
|
self.MONGOOSE_PATH_SRC = os.path.join(PATH_EXTERNAL, 'mongoose')
|
||||||
|
|
||||||
|
if not os.path.exists(self.PATH_TMP):
|
||||||
|
utils.makedirs(self.PATH_TMP)
|
||||||
|
|
||||||
|
def _build_jsoncpp(self, file_name):
|
||||||
|
cc.n('prepare jsoncpp source code...', end='')
|
||||||
|
if not os.path.exists(self.JSONCPP_PATH_SRC):
|
||||||
|
cc.v('')
|
||||||
|
os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, PATH_EXTERNAL))
|
||||||
|
os.rename(os.path.join(PATH_EXTERNAL, 'jsoncpp-{}'.format(env.ver_jsoncpp)), self.JSONCPP_PATH_SRC)
|
||||||
|
else:
|
||||||
|
cc.w('already exists, skip.')
|
||||||
|
|
||||||
|
def _build_mongoose(self, file_name):
|
||||||
|
cc.n('prepare mongoose source code...', end='')
|
||||||
|
if not os.path.exists(self.MONGOOSE_PATH_SRC):
|
||||||
|
cc.v('')
|
||||||
|
os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, PATH_EXTERNAL))
|
||||||
|
os.rename(os.path.join(PATH_EXTERNAL, 'mongoose-{}'.format(env.ver_mongoose)), self.MONGOOSE_PATH_SRC)
|
||||||
|
else:
|
||||||
|
cc.w('already exists, skip.')
|
||||||
|
|
||||||
|
def _build_openssl(self, file_name):
|
||||||
|
pass # we do not need build openssl anymore, because first time run build.sh we built Python, it include openssl.
|
||||||
|
|
||||||
|
# if not os.path.exists(self.OPENSSL_PATH_SRC):
|
||||||
|
# os.system('tar -zxvf "{}/{}" -C "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP))
|
||||||
|
#
|
||||||
|
# cc.n('build openssl static...')
|
||||||
|
# if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssl.a')):
|
||||||
|
# cc.w('already exists, skip.')
|
||||||
|
# return
|
||||||
|
#
|
||||||
|
# old_p = os.getcwd()
|
||||||
|
# os.chdir(self.OPENSSL_PATH_SRC)
|
||||||
|
# #os.system('./config --prefix={} --openssldir={}/openssl no-zlib no-shared'.format(self.PATH_RELEASE, self.PATH_RELEASE))
|
||||||
|
# os.system('./config --prefix={} --openssldir={}/openssl -fPIC no-zlib no-shared'.format(self.PATH_RELEASE, self.PATH_RELEASE))
|
||||||
|
# os.system('make')
|
||||||
|
# os.system('make install')
|
||||||
|
# os.chdir(old_p)
|
||||||
|
|
||||||
|
def _build_libuv(self, file_name):
|
||||||
|
cc.w('build libuv...skip')
|
||||||
|
return
|
||||||
|
if not os.path.exists(self.LIBUV_PATH_SRC):
|
||||||
|
# os.system('tar -zxvf "{}/{}" -C "{}"'.format(PATH_DOWNLOAD, file_name, PATH_TMP))
|
||||||
|
os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP))
|
||||||
|
|
||||||
|
cc.n('build libuv...', end='')
|
||||||
|
if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libuv.a')):
|
||||||
|
cc.w('already exists, skip.')
|
||||||
|
return
|
||||||
|
cc.v('')
|
||||||
|
|
||||||
|
# we need following...
|
||||||
|
# apt-get install autoconf aptitude libtool gcc-c++
|
||||||
|
|
||||||
|
old_p = os.getcwd()
|
||||||
|
os.chdir(self.LIBUV_PATH_SRC)
|
||||||
|
os.system('sh autogen.sh')
|
||||||
|
os.system('./configure --prefix={} --with-pic'.format(self.PATH_RELEASE))
|
||||||
|
os.system('make')
|
||||||
|
os.system('make install')
|
||||||
|
os.chdir(old_p)
|
||||||
|
|
||||||
|
def _build_mbedtls(self, file_name):
|
||||||
|
if not os.path.exists(self.MBEDTLS_PATH_SRC):
|
||||||
|
# os.system('tar -zxvf "{}/{}" -C "{}"'.format(PATH_DOWNLOAD, file_name, PATH_TMP))
|
||||||
|
os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP))
|
||||||
|
|
||||||
|
cc.n('build mbedtls...', end='')
|
||||||
|
if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libmbedtls.a')):
|
||||||
|
cc.w('already exists, skip.')
|
||||||
|
return
|
||||||
|
cc.v('')
|
||||||
|
|
||||||
|
# fix the Makefile
|
||||||
|
mkfile = os.path.join(self.MBEDTLS_PATH_SRC, 'Makefile')
|
||||||
|
f = open(mkfile)
|
||||||
|
fl = f.readlines()
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
fixed = False
|
||||||
|
for i in range(len(fl)):
|
||||||
|
x = fl[i].split('=')
|
||||||
|
if x[0] == 'DESTDIR':
|
||||||
|
fl[i] = 'DESTDIR={}\n'.format(self.PATH_RELEASE)
|
||||||
|
fixed = True
|
||||||
|
break
|
||||||
|
|
||||||
|
if not fixed:
|
||||||
|
cc.e('can not fix Makefile of mbedtls.')
|
||||||
|
return
|
||||||
|
|
||||||
|
f = open(mkfile, 'w')
|
||||||
|
f.writelines(fl)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
# # fix config.h
|
||||||
|
# mkfile = os.path.join(self.MBEDTLS_PATH_SRC, 'include', 'mbedtls', 'config.h')
|
||||||
|
# f = open(mkfile)
|
||||||
|
# fl = f.readlines()
|
||||||
|
# f.close()
|
||||||
|
#
|
||||||
|
# for i in range(len(fl)):
|
||||||
|
# if fl[i].find('#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED') >= 0:
|
||||||
|
# fl[i] = '//#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED\n'
|
||||||
|
# elif fl[i].find('#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED') >= 0:
|
||||||
|
# fl[i] = '//#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED\n'
|
||||||
|
# elif fl[i].find('#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED') >= 0:
|
||||||
|
# fl[i] = '//#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED\n'
|
||||||
|
# elif fl[i].find('#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED') >= 0:
|
||||||
|
# fl[i] = '//#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED\n'
|
||||||
|
# elif fl[i].find('#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED') >= 0:
|
||||||
|
# fl[i] = '//#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED\n'
|
||||||
|
# elif fl[i].find('#define MBEDTLS_SELF_TEST') >= 0:
|
||||||
|
# fl[i] = '//#define MBEDTLS_SELF_TEST\n'
|
||||||
|
# elif fl[i].find('#define MBEDTLS_SSL_RENEGOTIATION') >= 0:
|
||||||
|
# fl[i] = '//#define MBEDTLS_SSL_RENEGOTIATION\n'
|
||||||
|
# elif fl[i].find('#define MBEDTLS_ECDH_C') >= 0:
|
||||||
|
# fl[i] = '//#define MBEDTLS_ECDH_C\n'
|
||||||
|
# elif fl[i].find('#define MBEDTLS_ECDSA_C') >= 0:
|
||||||
|
# fl[i] = '//#define MBEDTLS_ECDSA_C\n'
|
||||||
|
# elif fl[i].find('#define MBEDTLS_ECP_C') >= 0:
|
||||||
|
# fl[i] = '//#define MBEDTLS_ECP_C\n'
|
||||||
|
# elif fl[i].find('#define MBEDTLS_NET_C') >= 0:
|
||||||
|
# fl[i] = '//#define MBEDTLS_NET_C\n'
|
||||||
|
#
|
||||||
|
# elif fl[i].find('#define MBEDTLS_RSA_NO_CRT') >= 0:
|
||||||
|
# fl[i] = '#define MBEDTLS_RSA_NO_CRT\n'
|
||||||
|
# elif fl[i].find('#define MBEDTLS_SSL_PROTO_SSL3') >= 0:
|
||||||
|
# fl[i] = '#define MBEDTLS_SSL_PROTO_SSL3\n'
|
||||||
|
#
|
||||||
|
# f = open(mkfile, 'w')
|
||||||
|
# f.writelines(fl)
|
||||||
|
# f.close()
|
||||||
|
|
||||||
|
# fix source file
|
||||||
|
utils.ensure_file_exists(os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'include', 'mbedtls', 'config.h'))
|
||||||
|
utils.copy_file(os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'include', 'mbedtls'), os.path.join(self.MBEDTLS_PATH_SRC, 'include', 'mbedtls'), 'config.h')
|
||||||
|
utils.ensure_file_exists(os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'library', 'rsa.c'))
|
||||||
|
utils.copy_file(os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'library'), os.path.join(self.MBEDTLS_PATH_SRC, 'library'), 'rsa.c')
|
||||||
|
|
||||||
|
old_p = os.getcwd()
|
||||||
|
os.chdir(self.MBEDTLS_PATH_SRC)
|
||||||
|
os.system('make CFLAGS="-fPIC" lib')
|
||||||
|
os.system('make install')
|
||||||
|
os.chdir(old_p)
|
||||||
|
|
||||||
|
def _build_libssh(self, file_name):
|
||||||
|
if not os.path.exists(self.LIBSSH_PATH_SRC):
|
||||||
|
# os.system('tar -zxvf "{}/{}" -C "{}"'.format(PATH_DOWNLOAD, file_name, PATH_TMP))
|
||||||
|
os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP))
|
||||||
|
# os.rename(os.path.join(self.PATH_TMP, 'master'), os.path.join(self.PATH_TMP, 'libssh-{}'.format(LIBSSH_VER)))
|
||||||
|
|
||||||
|
cc.n('build libssh...', end='')
|
||||||
|
if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh.a')) and os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh_threads.a')):
|
||||||
|
cc.w('already exists, skip.')
|
||||||
|
return
|
||||||
|
cc.v('')
|
||||||
|
|
||||||
|
build_path = os.path.join(self.LIBSSH_PATH_SRC, 'build')
|
||||||
|
# utils.makedirs(build_path)
|
||||||
|
|
||||||
|
# here is a bug in cmake v2.8.11 (default on ubuntu14), in FindOpenSSL.cmake,
|
||||||
|
# it parse opensslv.h, use regex like this:
|
||||||
|
# REGEX "^#define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*")
|
||||||
|
# but in openssl-1.0.2h, the version define line is:
|
||||||
|
# # define OPENSSL_VERSION_NUMBER 0x1000208fL
|
||||||
|
# notice there is a space char between # and define, so find openssl always fail.
|
||||||
|
|
||||||
|
# old_p = os.getcwd()
|
||||||
|
# os.chdir(build_path)
|
||||||
|
# cmd = 'cmake' \
|
||||||
|
# ' -DCMAKE_INSTALL_PREFIX={}' \
|
||||||
|
# ' -D_OPENSSL_VERSION={}' \
|
||||||
|
# ' -DOPENSSL_INCLUDE_DIR={}/include' \
|
||||||
|
# ' -DOPENSSL_LIBRARIES={}/lib' \
|
||||||
|
# ' -DCMAKE_BUILD_TYPE=Release' \
|
||||||
|
# ' -DWITH_GSSAPI=OFF' \
|
||||||
|
# ' -DWITH_ZLIB=OFF' \
|
||||||
|
# ' -DWITH_STATIC_LIB=ON' \
|
||||||
|
# ' -DWITH_PCAP=OFF' \
|
||||||
|
# ' -DWITH_EXAMPLES=OFF' \
|
||||||
|
# ' -DWITH_NACL=OFF' \
|
||||||
|
# ' ..'.format(self.PATH_RELEASE, OPENSSL_VER, self.PATH_RELEASE, self.PATH_RELEASE)
|
||||||
|
# cc.n(cmd)
|
||||||
|
# os.system(cmd)
|
||||||
|
# # os.system('make ssh_static ssh_threads_static')
|
||||||
|
# os.system('make ssh_static')
|
||||||
|
# # os.system('make install')
|
||||||
|
# os.chdir(old_p)
|
||||||
|
|
||||||
|
cmake_define = ' -DCMAKE_INSTALL_PREFIX={}' \
|
||||||
|
' -D_OPENSSL_VERSION={}' \
|
||||||
|
' -DOPENSSL_INCLUDE_DIR={}/include' \
|
||||||
|
' -DOPENSSL_LIBRARIES={}/lib' \
|
||||||
|
' -DWITH_GSSAPI=OFF' \
|
||||||
|
' -DWITH_ZLIB=OFF' \
|
||||||
|
' -DWITH_STATIC_LIB=ON' \
|
||||||
|
' -DWITH_PCAP=OFF' \
|
||||||
|
' -DWITH_TESTING=OFF' \
|
||||||
|
' -DWITH_CLIENT_TESTING=OFF' \
|
||||||
|
' -DWITH_EXAMPLES=OFF' \
|
||||||
|
' -DWITH_BENCHMARKS=OFF' \
|
||||||
|
' -DWITH_NACL=OFF' \
|
||||||
|
' ..'.format(self.PATH_RELEASE, env.ver_openssl_number, self.PATH_RELEASE, self.PATH_RELEASE)
|
||||||
|
|
||||||
|
try:
|
||||||
|
utils.cmake(build_path, 'Release', False, cmake_define)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# because make install will fail because we can not disable ssh_shared target,
|
||||||
|
# so we copy necessary files ourselves.
|
||||||
|
utils.ensure_file_exists(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'libssh.a'))
|
||||||
|
utils.ensure_file_exists(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'threads', 'libssh_threads.a'))
|
||||||
|
utils.copy_file(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src'), os.path.join(self.PATH_RELEASE, 'lib'), 'libssh.a')
|
||||||
|
utils.copy_file(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'threads'), os.path.join(self.PATH_RELEASE, 'lib'), 'libssh_threads.a')
|
||||||
|
utils.copy_ex(os.path.join(self.LIBSSH_PATH_SRC, 'include'), os.path.join(self.PATH_RELEASE, 'include'), 'libssh')
|
||||||
|
|
||||||
|
def _build_sqlite(self, file_name):
|
||||||
|
if not os.path.exists(self.SQLITE_PATH_SRC):
|
||||||
|
os.system('tar -zxvf "{}/{}" -C "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP))
|
||||||
|
|
||||||
|
cc.n('build sqlite static...', end='')
|
||||||
|
if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libsqlite3.a')):
|
||||||
|
cc.w('already exists, skip.')
|
||||||
|
return
|
||||||
|
cc.v('')
|
||||||
|
|
||||||
|
old_p = os.getcwd()
|
||||||
|
os.chdir(self.SQLITE_PATH_SRC)
|
||||||
|
os.system('./configure --prefix={}'.format(self.PATH_RELEASE))
|
||||||
|
os.system('make')
|
||||||
|
os.system('make install')
|
||||||
|
os.chdir(old_p)
|
||||||
|
|
||||||
|
def fix_output(self):
|
||||||
|
# remove .so files, otherwise will link to .so but not .a in default.
|
||||||
|
# rm = ['libsqlite3.la', 'libsqlite3.so.0', 'libsqlite3.so', 'libsqlite3.so.0.8.6', 'libuv.la', 'libuv.so.1', 'libuv.so', 'libuv.so.1.0.0']
|
||||||
|
rm = ['libuv.la', 'libuv.so.1', 'libuv.so', 'libuv.so.1.0.0']
|
||||||
|
for i in rm:
|
||||||
|
_path = os.path.join(self.PATH_RELEASE, 'lib', i)
|
||||||
|
if os.path.exists(_path):
|
||||||
|
utils.remove(_path)
|
||||||
|
|
||||||
|
|
||||||
def gen_builder(dist):
|
def gen_builder(dist):
|
||||||
if dist == 'windows':
|
if dist == 'windows':
|
||||||
builder = BuilderWin()
|
builder = BuilderWin()
|
||||||
elif dist == 'linux':
|
elif dist == 'linux':
|
||||||
builder = BuilderLinux()
|
builder = BuilderLinux()
|
||||||
|
elif dist == 'macos':
|
||||||
|
builder = BuilderMacOS()
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('unsupported platform.')
|
raise RuntimeError('unsupported platform.')
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<module classpath="CMake" type="CPP_MODULE" version="4" />
|
<module classpath="CMake" type="CPP_MODULE" version="4" />
|
Loading…
Reference in New Issue