blob: 83ea221ba246085e13d768ede3086e567e5b9021 [file] [log] [blame]
#!/usr/bin/python
#
# Copyright (c) 2014-2017 Nest Labs, Inc.
# All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# @file
# This file implements a trampoline script for other Nest Weave
# SDK executables to ensure that the dynamic loader can find
# the SDK DSOs/DLLs in the appropriate location(s).
#
import os
import sys
# Determine whether or not this is running on Darwin where the dynamic
# loader is dyld and uses DYLD_LIBRARY path; otherwise, the dynamic
# loader is ld and uses LD_LIBRARY_PATH.
if sys.platform == "darwin":
loader = "DYLD_LIBRARY_PATH"
else:
loader = "LD_LIBRARY_PATH"
# Shared libraries that Weave SDK executables or Python scripts are
# looking for may live in one or more of the following places:
#
# 1) SDK_ROOT/lib/...
# 2) SDK_ROOT/lib/python/PACKAGE/...
# 3) SDK_ROOT/lib/pythonPYTHON_VERSION/dist-packages/PACKAGE/...
# 4) SDK_ROOT/lib/pythonPYTHON_VERSION/site-packages/PACKAGE/...
#
# where SDK_ROOT is either:
#
# A) WEAVE_HOME
#
# or:
#
# B) One path component "up" from this executabe.
#
# If WEAVE_HOME is set, then form up 1A, 2A, 3A, and 4A; otherwise,
# form up 1B, 2B, 3B, and 4B and append them to help the loader find
# any Weave SDK DLLs/DSOs.
pyversion = sys.version[:3]
pkgsdklibdirs = [ "lib",
"lib/python/weave",
"lib/python" + pyversion + "/dist-packages/weave",
"lib/python" + pyversion + "/site-packages/weave" ]
# Determine the root of the Weave SDK
if os.environ.has_key("WEAVE_HOME"):
pkgsdkrootdir = os.environ["WEAVE_HOME"]
else:
pkgsdkrootdir = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
# Build up the dynamic loader search paths as described above.
for pkgsdklibdir in pkgsdklibdirs:
try:
loaderpaths += os.pathsep + os.path.normpath(os.path.join(pkgsdkrootdir, pkgsdklibdir))
except NameError:
loaderpaths = os.path.normpath(os.path.join(pkgsdkrootdir, pkgsdklibdir))
# Append to or create the dynamic loader search paths in the OS environment.
if os.environ.has_key(loader):
os.environ[loader] += os.pathsep + loaderpaths
else:
os.environ[loader] = loaderpaths
# We have been trampolined into this script from a symbolic link. The
# real executable lives in libexec/... as a sibling directory to the
# library loader path.
execpath = os.path.join(pkgsdkrootdir, "libexec", os.path.basename(sys.argv[0]))
# Re-execute the real executable with the new loader path in effect.
os.execl(execpath, os.path.basename(execpath), *sys.argv[1:])