blob: a86aeda364ee455d62505caa2d3d08811e3ff6ed [file] [log] [blame]
Greg Clayton4e651b12012-04-25 00:58:03 +00001#! /bin/sh -x
Chris Lattner24943d22010-06-08 16:52:24 +00002
3# finish-swig-Python.sh
4#
5# For the Python script interpreter (external to liblldb) to be able to import
Caroline Tice9dbe7172010-06-16 19:26:52 +00006# and use the lldb module, there must be two files, lldb.py and _lldb.so, that
7# it can find. lldb.py is generated by SWIG at the same time it generates the
8# C++ file. _lldb.so is actually a symlink file that points to the
9# LLDB shared library/framework.
10#
11# The Python script interpreter needs to be able to automatically find
12# these two files. On Darwin systems it searches in the LLDB.framework, as
13# well as in all the normal Python search paths. On non-Darwin systems
14# these files will need to be put someplace where Python will find them.
15#
16# This shell script creates the _lldb.so symlink in the appropriate place,
17# and copies the lldb.py (and embedded_interpreter.py) file to the correct
18# directory.
19#
Chris Lattner24943d22010-06-08 16:52:24 +000020
Caroline Tice9dbe7172010-06-16 19:26:52 +000021# SRC_ROOT is the root of the lldb source tree.
22# TARGET_DIR is where the lldb framework/shared library gets put.
23# CONFIG_BUILD_DIR is where the build-swig-Python-LLDB.sh shell script
24# put the lldb.py file it was generated from running SWIG.
25# PYTHON_INSTALL_DIR is where non-Darwin systems want to put the .py and .so
26# files so that Python can find them automatically.
27# debug_flag (optional) determines whether or not this script outputs
28# additional information when running.
29
30SRC_ROOT=$1
31TARGET_DIR=$2
32CONFIG_BUILD_DIR=$3
33PYTHON_INSTALL_DIR=$4
34debug_flag=$5
35
Greg Clayton3e4238d2011-11-04 03:34:56 +000036# Make sure SDKROOT is not set, since if it is this is an iOS build where python
37# is disabled
38if [ "x$SDKROOT" = "x" ] ; then
39
Caroline Tice9dbe7172010-06-16 19:26:52 +000040if [ -n "$debug_flag" -a "$debug_flag" == "-debug" ]
Chris Lattner24943d22010-06-08 16:52:24 +000041then
Caroline Tice9dbe7172010-06-16 19:26:52 +000042 Debug=1
43else
44 Debug=0
45fi
46
47OS_NAME=`uname -s`
48PYTHON_VERSION=`/usr/bin/python --version 2>&1 | sed -e 's,Python ,,' -e 's,[.][0-9],,2' -e 's,[a-z][a-z][0-9],,'`
49
50
51if [ $Debug == 1 ]
52then
53 echo "The current OS is $OS_NAME"
54 echo "The Python version is $PYTHON_VERSION"
55fi
56
57#
58# Determine where to put the files.
59
60if [ ${OS_NAME} == "Darwin" ]
61then
62 # We are on a Darwin system, so all the lldb Python files can go
63 # into the LLDB.framework/Resources/Python subdirectory.
64
65 if [ ! -d "${TARGET_DIR}/LLDB.framework" ]
66 then
67 echo "Error: Unable to find LLDB.framework" >&2
68 exit 1
69 else
70 if [ $Debug == 1 ]
71 then
72 echo "Found ${TARGET_DIR}/LLDB.framework."
73 fi
74 fi
75
76 # Make the Python directory in the framework if it doesn't already exist
77
Greg Clayton4e651b12012-04-25 00:58:03 +000078 framework_python_dir="${TARGET_DIR}/LLDB.framework/Resources/Python/lldb"
Caroline Tice9dbe7172010-06-16 19:26:52 +000079else
80 # We are on a non-Darwin system, so use the PYTHON_INSTALL_DIR argument,
81 # and append the python version directory to the end of it. Depending on
82 # the system other stuff may need to be put here as well.
83
Greg Clayton4e651b12012-04-25 00:58:03 +000084 framework_python_dir="${PYTHON_INSTALL_DIR}/python${PYTHON_VERSION}/lldb"
Caroline Tice9dbe7172010-06-16 19:26:52 +000085fi
86
87#
88# Look for the directory in which to put the Python files; if it does not
89# already exist, attempt to make it.
90#
91
92if [ $Debug == 1 ]
93then
94 echo "Python files will be put in ${framework_python_dir}"
95fi
96
Greg Clayton4e651b12012-04-25 00:58:03 +000097python_dirs="${framework_python_dir}"
Caroline Tice9dbe7172010-06-16 19:26:52 +000098
Greg Clayton4e651b12012-04-25 00:58:03 +000099for python_dir in $python_dirs
100do
101 if [ ! -d "${python_dir}" ]
102 then
103 if [ $Debug == 1 ]
104 then
105 echo "Making directory ${python_dir}"
106 fi
107 mkdir -p "${python_dir}"
108 else
109 if [ $Debug == 1 ]
110 then
111 echo "${python_dir} already exists."
112 fi
113 fi
114
115 if [ ! -d "${python_dir}" ]
116 then
117 echo "Error: Unable to find or create ${python_dir}" >&2
118 exit 1
119 fi
120done
Chris Lattner24943d22010-06-08 16:52:24 +0000121
Caroline Tice9dbe7172010-06-16 19:26:52 +0000122# Make the symlink that the script bridge for Python will need in the
123# Python framework directory
Chris Lattner24943d22010-06-08 16:52:24 +0000124
Chris Lattner24943d22010-06-08 16:52:24 +0000125if [ ! -L "${framework_python_dir}/_lldb.so" ]
126then
Caroline Tice9dbe7172010-06-16 19:26:52 +0000127 if [ $Debug == 1 ]
128 then
129 echo "Creating symlink for _lldb.so"
130 fi
131 if [ ${OS_NAME} == "Darwin" ]
132 then
133 cd "${framework_python_dir}"
Greg Clayton4e651b12012-04-25 00:58:03 +0000134 ln -s "../../../LLDB" _lldb.so
Caroline Tice9dbe7172010-06-16 19:26:52 +0000135 else
136 cd "${TARGET_DIR}"
Greg Clayton4e651b12012-04-25 00:58:03 +0000137 ln -s "../LLDB" _lldb.so
Caroline Tice9dbe7172010-06-16 19:26:52 +0000138 fi
139else
140 if [ $Debug == 1 ]
141 then
142 echo "${framework_python_dir}/_lldb.so already exists."
143 fi
Chris Lattner24943d22010-06-08 16:52:24 +0000144fi
145
Chris Lattner24943d22010-06-08 16:52:24 +0000146
Greg Clayton4e651b12012-04-25 00:58:03 +0000147function create_python_package {
148 package_dir="${framework_python_dir}$1"
149 package_files="$2"
Enrico Granataa5c2ce02012-04-25 17:53:41 +0000150 package_name=`echo $1 | tr '/' '.'`
151 package_name="lldb${package_name}"
Chris Lattner24943d22010-06-08 16:52:24 +0000152
Greg Clayton4e651b12012-04-25 00:58:03 +0000153 if [ ! -d "${package_dir}" ]
Enrico Granata074e3b62011-08-17 19:07:52 +0000154 then
Greg Clayton4e651b12012-04-25 00:58:03 +0000155 mkdir -p "${package_dir}"
Enrico Granata074e3b62011-08-17 19:07:52 +0000156 fi
Enrico Granata074e3b62011-08-17 19:07:52 +0000157
Greg Clayton4e651b12012-04-25 00:58:03 +0000158 for package_file in $package_files
159 do
160 if [ -f "${package_file}" ]
161 then
162 cp "${package_file}" "${package_dir}"
163 package_file_basename=$(basename "${package_file}")
164 fi
165 done
Enrico Granata66205ce2012-03-12 19:47:17 +0000166
Enrico Granatab8dc7332012-01-31 17:01:51 +0000167
Greg Clayton4e651b12012-04-25 00:58:03 +0000168 # Create a packate init file if there wasn't one
169 package_init_file="${package_dir}/__init__.py"
170 if [ ! -f "${package_init_file}" ]
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000171 then
Greg Clayton4e651b12012-04-25 00:58:03 +0000172 echo -n "__all__ = [" > "${package_init_file}"
173 python_module_separator=""
174 for package_file in $package_files
175 do
176 if [ -f "${package_file}" ]
177 then
178 package_file_basename=$(basename "${package_file}")
179 echo -n "${python_module_separator}\"${package_file_basename%.*}\"" >> "${package_init_file}"
180 python_module_separator=", "
181 fi
182 done
183 echo "]" >> "${package_init_file}"
Enrico Granataa5c2ce02012-04-25 17:53:41 +0000184 echo "for x in __all__:" >> "${package_init_file}"
185 echo " __import__('${package_name}.'+x)" >> "${package_init_file}"
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000186 fi
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000187
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000188
Greg Clayton4e651b12012-04-25 00:58:03 +0000189}
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000190
Greg Clayton4e651b12012-04-25 00:58:03 +0000191# Copy the lldb.py file into the lldb package directory and rename to __init_.py
192cp "${CONFIG_BUILD_DIR}/lldb.py" "${framework_python_dir}/__init__.py"
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000193
Greg Clayton4e651b12012-04-25 00:58:03 +0000194# lldb
195package_files="${SRC_ROOT}/source/Interpreter/embedded_interpreter.py"
196create_python_package "" "${package_files}"
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000197
Greg Clayton4e651b12012-04-25 00:58:03 +0000198# lldb/formatters/cpp
199package_files="${SRC_ROOT}/examples/synthetic/gnu_libstdcpp.py
200${SRC_ROOT}/examples/synthetic/libcxx.py"
201create_python_package "/formatters/cpp" "${package_files}"
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000202
Greg Clayton4e651b12012-04-25 00:58:03 +0000203# lldb/formatters/objc
Greg Clayton4e651b12012-04-25 00:58:03 +0000204package_files="${SRC_ROOT}/examples/summaries/cocoa/Selector.py
205${SRC_ROOT}/examples/summaries/objc.py
206${SRC_ROOT}/examples/summaries/cocoa/Class.py
207${SRC_ROOT}/examples/summaries/cocoa/CFArray.py
208${SRC_ROOT}/examples/summaries/cocoa/CFBag.py
209${SRC_ROOT}/examples/summaries/cocoa/CFBinaryHeap.py
210${SRC_ROOT}/examples/summaries/cocoa/CFBitVector.py
211${SRC_ROOT}/examples/summaries/cocoa/CFDictionary.py
212${SRC_ROOT}/examples/summaries/cocoa/CFString.py
213${SRC_ROOT}/examples/summaries/cocoa/NSBundle.py
214${SRC_ROOT}/examples/summaries/cocoa/NSData.py
215${SRC_ROOT}/examples/summaries/cocoa/NSDate.py
216${SRC_ROOT}/examples/summaries/cocoa/NSException.py
217${SRC_ROOT}/examples/summaries/cocoa/NSIndexSet.py
218${SRC_ROOT}/examples/summaries/cocoa/NSMachPort.py
219${SRC_ROOT}/examples/summaries/cocoa/NSNotification.py
220${SRC_ROOT}/examples/summaries/cocoa/NSNumber.py
221${SRC_ROOT}/examples/summaries/cocoa/NSSet.py
222${SRC_ROOT}/examples/summaries/cocoa/NSURL.py"
223create_python_package "/formatters/objc" "${package_files}"
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000224
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000225
Enrico Granata65e3dcb2012-04-25 01:26:37 +0000226# make an empty __init__.py in lldb/runtime
227# this is required for Python to recognize lldb.runtime as a valid package
228# (and hence, lldb.runtime.objc as a valid contained package)
229create_python_package "/runtime" ""
230
Greg Clayton4e651b12012-04-25 00:58:03 +0000231# lldb/runtime/objc
232package_files="${SRC_ROOT}/examples/summaries/cocoa/objc_runtime.py"
233create_python_package "/runtime/objc" "${package_files}"
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000234
Greg Clayton4e651b12012-04-25 00:58:03 +0000235# lldb/formatters
Enrico Granata65e3dcb2012-04-25 01:26:37 +0000236# having these files copied here ensures that lldb/formatters is a valid package itself
Greg Clayton4e651b12012-04-25 00:58:03 +0000237package_files="${SRC_ROOT}/examples/summaries/cocoa/cache.py
238${SRC_ROOT}/examples/summaries/cocoa/metrics.py
239${SRC_ROOT}/examples/summaries/cocoa/attrib_fromdict.py
240${SRC_ROOT}/examples/summaries/cocoa/Logger.py"
241create_python_package "/formatters" "${package_files}"
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000242
Greg Clayton4e651b12012-04-25 00:58:03 +0000243# lldb/utils
244package_files="${SRC_ROOT}/examples/python/symbolication.py"
245create_python_package "/utils" "${package_files}"
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000246
Greg Clayton6f2f0ab2012-04-25 01:49:50 +0000247if [ ${OS_NAME} == "Darwin" ]
248then
249 # lldb/macosx
250 package_files="${SRC_ROOT}/examples/python/crashlog.py
251 ${SRC_ROOT}/examples/darwin/heap_find/heap.py"
252 create_python_package "/macosx" "${package_files}"
Enrico Granata1328b142012-02-29 03:28:49 +0000253
Greg Clayton6f2f0ab2012-04-25 01:49:50 +0000254 # Copy files needed by lldb/macosx/heap.py to build libheap.dylib
255 heap_dir="${framework_python_dir}/macosx/heap"
256 if [ ! -d "${heap_dir}" ]
257 then
258 mkdir -p "${heap_dir}"
259 cp "${SRC_ROOT}/examples/darwin/heap_find/heap/heap_find.cpp" "${heap_dir}"
260 cp "${SRC_ROOT}/examples/darwin/heap_find/heap/Makefile" "${heap_dir}"
261 fi
262fi
Enrico Granata8f84cfb2012-02-23 23:10:03 +0000263
Greg Clayton3e4238d2011-11-04 03:34:56 +0000264fi
Greg Clayton6f2f0ab2012-04-25 01:49:50 +0000265
Chris Lattner24943d22010-06-08 16:52:24 +0000266exit 0
Caroline Tice9dbe7172010-06-16 19:26:52 +0000267