1#!/bin/sh
2
3# build-swig-Python.sh
4
5# SRC_ROOT is the root of the lldb source tree.
6# TARGET_DIR is where the lldb framework/shared library gets put.
7# CONFIG_BUILD_DIR is where the build-swig-Python-LLDB.sh  shell script
8#           put the lldb.py file it was generated from running SWIG.
9# PREFIX is the root directory used to determine where third-party modules
10#         for scripting languages should be installed.
11# debug_flag (optional) determines whether or not this script outputs
12#           additional information when running.
13
14SRC_ROOT=$1
15TARGET_DIR=$2
16CONFIG_BUILD_DIR=$3
17PYTHON_INSTALL_DIR=$4
18debug_flag=$5
19SWIG=$6
20makefile_flag=$7
21dependency_flag=$8
22
23if [ -n "$makefile_flag" -a "$makefile_flag" = "-m" ]
24then
25    MakefileCalled=1
26    if [ -n "$dependency_flag" -a "$dependency_flag" = "-M" ]
27    then
28        GenerateDependencies=1
29        swig_depend_file="${TARGET_DIR}/LLDBWrapPython.cpp.d"
30        SWIG_DEPEND_OPTIONS="-MMD -MF \"${swig_depend_file}.tmp\""
31    else
32        GenerateDependencies=0
33    fi
34else
35    MakefileCalled=0
36    GenerateDependencies=0
37fi
38
39if [ $MakefileCalled -eq 0 ]
40then
41  swig_output_file=${SRC_ROOT}/source/LLDBWrapPython.cpp
42else
43  swig_output_file=${TARGET_DIR}/LLDBWrapPython.cpp
44fi
45swig_input_file=${SRC_ROOT}/scripts/lldb.swig
46swig_python_extensions=${SRC_ROOT}/scripts/Python/python-extensions.swig
47swig_python_wrapper=${SRC_ROOT}/scripts/Python/python-wrapper.swig
48swig_python_typemaps=${SRC_ROOT}/scripts/Python/python-typemaps.swig
49swig_python_swigsafecast=${SRC_ROOT}/scripts/Python/python-swigsafecast.swig
50
51if [ "$LLDB_DISABLE_PYTHON" = "1" ] ; then
52    # We don't want Python for this build, but touch the output file so we don't have to
53    # conditionalize the build on this as well.
54    # Note, at present iOS doesn't have Python, so if you're building for iOS be sure to
55    # set LLDB_DISABLE_PYTHON to 1.
56    rm -rf ${swig_output_file}
57    touch ${swig_output_file}
58
59else
60
61if [ -n "$debug_flag" -a "$debug_flag" = "-debug" ]
62then
63    Debug=1
64else
65    Debug=0
66fi
67
68# If this project is being built with LLDB_DISABLE_PYTHON defined,
69# don't bother generating Python swig bindings -- we don't have
70# Python available.
71
72if echo $GCC_PREPROCESSOR_DEFINITIONS | grep LLDB_DISABLE_PYTHON
73then
74  echo "" > "${swig_output_file}"
75  exit 0
76fi
77
78HEADER_FILES="${SRC_ROOT}/include/lldb/lldb.h"\
79" ${SRC_ROOT}/include/lldb/lldb-defines.h"\
80" ${SRC_ROOT}/include/lldb/lldb-enumerations.h"\
81" ${SRC_ROOT}/include/lldb/lldb-forward.h"\
82" ${SRC_ROOT}/include/lldb/lldb-forward-rtti.h"\
83" ${SRC_ROOT}/include/lldb/lldb-types.h"\
84" ${SRC_ROOT}/include/lldb/API/SBAddress.h"\
85" ${SRC_ROOT}/include/lldb/API/SBBlock.h"\
86" ${SRC_ROOT}/include/lldb/API/SBBreakpoint.h"\
87" ${SRC_ROOT}/include/lldb/API/SBBreakpointLocation.h"\
88" ${SRC_ROOT}/include/lldb/API/SBBroadcaster.h"\
89" ${SRC_ROOT}/include/lldb/API/SBCommandInterpreter.h"\
90" ${SRC_ROOT}/include/lldb/API/SBCommandReturnObject.h"\
91" ${SRC_ROOT}/include/lldb/API/SBCommunication.h"\
92" ${SRC_ROOT}/include/lldb/API/SBCompileUnit.h"\
93" ${SRC_ROOT}/include/lldb/API/SBData.h"\
94" ${SRC_ROOT}/include/lldb/API/SBDebugger.h"\
95" ${SRC_ROOT}/include/lldb/API/SBError.h"\
96" ${SRC_ROOT}/include/lldb/API/SBEvent.h"\
97" ${SRC_ROOT}/include/lldb/API/SBExpressionOptions.h"\
98" ${SRC_ROOT}/include/lldb/API/SBFileSpec.h"\
99" ${SRC_ROOT}/include/lldb/API/SBFrame.h"\
100" ${SRC_ROOT}/include/lldb/API/SBFunction.h"\
101" ${SRC_ROOT}/include/lldb/API/SBHostOS.h"\
102" ${SRC_ROOT}/include/lldb/API/SBInputReader.h"\
103" ${SRC_ROOT}/include/lldb/API/SBInstruction.h"\
104" ${SRC_ROOT}/include/lldb/API/SBInstructionList.h"\
105" ${SRC_ROOT}/include/lldb/API/SBLineEntry.h"\
106" ${SRC_ROOT}/include/lldb/API/SBListener.h"\
107" ${SRC_ROOT}/include/lldb/API/SBModule.h"\
108" ${SRC_ROOT}/include/lldb/API/SBModuleSpec.h"\
109" ${SRC_ROOT}/include/lldb/API/SBProcess.h"\
110" ${SRC_ROOT}/include/lldb/API/SBSourceManager.h"\
111" ${SRC_ROOT}/include/lldb/API/SBStream.h"\
112" ${SRC_ROOT}/include/lldb/API/SBStringList.h"\
113" ${SRC_ROOT}/include/lldb/API/SBSymbol.h"\
114" ${SRC_ROOT}/include/lldb/API/SBSymbolContext.h"\
115" ${SRC_ROOT}/include/lldb/API/SBSymbolContextList.h"\
116" ${SRC_ROOT}/include/lldb/API/SBTarget.h"\
117" ${SRC_ROOT}/include/lldb/API/SBThread.h"\
118" ${SRC_ROOT}/include/lldb/API/SBType.h"\
119" ${SRC_ROOT}/include/lldb/API/SBTypeCategory.h"\
120" ${SRC_ROOT}/include/lldb/API/SBTypeFilter.h"\
121" ${SRC_ROOT}/include/lldb/API/SBTypeFormat.h"\
122" ${SRC_ROOT}/include/lldb/API/SBTypeNameSpecifier.h"\
123" ${SRC_ROOT}/include/lldb/API/SBTypeSummary.h"\
124" ${SRC_ROOT}/include/lldb/API/SBTypeSynthetic.h"\
125" ${SRC_ROOT}/include/lldb/API/SBValue.h"\
126" ${SRC_ROOT}/include/lldb/API/SBValueList.h"\
127" ${SRC_ROOT}/include/lldb/API/SBWatchpoint.h"
128
129INTERFACE_FILES="${SRC_ROOT}/scripts/Python/interface/SBAddress.i"\
130" ${SRC_ROOT}/scripts/Python/interface/SBBlock.i"\
131" ${SRC_ROOT}/scripts/Python/interface/SBBreakpoint.i"\
132" ${SRC_ROOT}/scripts/Python/interface/SBBreakpointLocation.i"\
133" ${SRC_ROOT}/scripts/Python/interface/SBBroadcaster.i"\
134" ${SRC_ROOT}/scripts/Python/interface/SBCommandInterpreter.i"\
135" ${SRC_ROOT}/scripts/Python/interface/SBCommandReturnObject.i"\
136" ${SRC_ROOT}/scripts/Python/interface/SBCommunication.i"\
137" ${SRC_ROOT}/scripts/Python/interface/SBCompileUnit.i"\
138" ${SRC_ROOT}/scripts/Python/interface/SBData.i"\
139" ${SRC_ROOT}/scripts/Python/interface/SBDebugger.i"\
140" ${SRC_ROOT}/scripts/Python/interface/SBDeclaration.i"\
141" ${SRC_ROOT}/scripts/Python/interface/SBError.i"\
142" ${SRC_ROOT}/scripts/Python/interface/SBEvent.i"\
143" ${SRC_ROOT}/scripts/Python/interface/SBExpressionOptions.i"\
144" ${SRC_ROOT}/scripts/Python/interface/SBFileSpec.i"\
145" ${SRC_ROOT}/scripts/Python/interface/SBFrame.i"\
146" ${SRC_ROOT}/scripts/Python/interface/SBFunction.i"\
147" ${SRC_ROOT}/scripts/Python/interface/SBHostOS.i"\
148" ${SRC_ROOT}/scripts/Python/interface/SBInputReader.i"\
149" ${SRC_ROOT}/scripts/Python/interface/SBInstruction.i"\
150" ${SRC_ROOT}/scripts/Python/interface/SBInstructionList.i"\
151" ${SRC_ROOT}/scripts/Python/interface/SBLineEntry.i"\
152" ${SRC_ROOT}/scripts/Python/interface/SBListener.i"\
153" ${SRC_ROOT}/scripts/Python/interface/SBModule.i"\
154" ${SRC_ROOT}/scripts/Python/interface/SBModuleSpec.i"\
155" ${SRC_ROOT}/scripts/Python/interface/SBProcess.i"\
156" ${SRC_ROOT}/scripts/Python/interface/SBSourceManager.i"\
157" ${SRC_ROOT}/scripts/Python/interface/SBStream.i"\
158" ${SRC_ROOT}/scripts/Python/interface/SBStringList.i"\
159" ${SRC_ROOT}/scripts/Python/interface/SBSymbol.i"\
160" ${SRC_ROOT}/scripts/Python/interface/SBSymbolContext.i"\
161" ${SRC_ROOT}/scripts/Python/interface/SBTarget.i"\
162" ${SRC_ROOT}/scripts/Python/interface/SBThread.i"\
163" ${SRC_ROOT}/scripts/Python/interface/SBType.i"\
164" ${SRC_ROOT}/scripts/Python/interface/SBTypeCategory.i"\
165" ${SRC_ROOT}/scripts/Python/interface/SBTypeFilter.i"\
166" ${SRC_ROOT}/scripts/Python/interface/SBTypeFormat.i"\
167" ${SRC_ROOT}/scripts/Python/interface/SBTypeNameSpecifier.i"\
168" ${SRC_ROOT}/scripts/Python/interface/SBTypeSummary.i"\
169" ${SRC_ROOT}/scripts/Python/interface/SBTypeSynthetic.i"\
170" ${SRC_ROOT}/scripts/Python/interface/SBValue.i"\
171" ${SRC_ROOT}/scripts/Python/interface/SBValueList.i"\
172" ${SRC_ROOT}/scripts/Python/interface/SBWatchpoint.i"
173
174if [ $Debug -eq 1 ]
175then
176    echo "Header files are:"
177    echo ${HEADER_FILES}
178fi
179
180if [ $Debug -eq 1 ]
181then
182    echo "SWIG interface files are:"
183    echo ${INTERFACE_FILES}
184fi
185
186NeedToUpdate=0
187
188
189if [ ! -f ${swig_output_file} ]
190then
191    NeedToUpdate=1
192    if [ $Debug -eq 1 ]
193    then
194        echo "Failed to find LLDBWrapPython.cpp"
195    fi
196fi
197
198if [ $NeedToUpdate -eq 0 ]
199then
200    for hdrfile in ${HEADER_FILES}
201    do
202        if [ $hdrfile -nt ${swig_output_file} ]
203        then
204            NeedToUpdate=1
205            if [ $Debug -eq 1 ]
206            then
207                echo "${hdrfile} is newer than ${swig_output_file}"
208                echo "swig file will need to be re-built."
209            fi
210            break
211        fi
212    done
213fi
214
215if [ $NeedToUpdate -eq 0 ]
216then
217    for intffile in ${INTERFACE_FILES}
218    do
219        if [ $intffile -nt ${swig_output_file} ]
220        then
221            NeedToUpdate=1
222            if [ $Debug -eq 1 ]
223            then
224                echo "${intffile} is newer than ${swig_output_file}"
225                echo "swig file will need to be re-built."
226            fi
227            break
228        fi
229    done
230fi
231
232if [ $NeedToUpdate -eq 0 ]
233then
234    if [ ${swig_input_file} -nt ${swig_output_file} ]
235    then
236        NeedToUpdate=1
237        if [ $Debug -eq 1 ]
238        then
239            echo "${swig_input_file} is newer than ${swig_output_file}"
240            echo "swig file will need to be re-built."
241        fi
242    fi
243fi
244
245if [ $NeedToUpdate -eq 0 ]
246then
247    if [ ${swig_python_extensions} -nt ${swig_output_file} ]
248    then
249        NeedToUpdate=1
250        if [ $Debug -eq 1 ]
251        then
252            echo "${swig_python_extensions} is newer than ${swig_output_file}"
253            echo "swig file will need to be re-built."
254        fi
255    fi
256fi
257
258if [ $NeedToUpdate -eq 0 ]
259then
260    if [ ${swig_python_wrapper} -nt ${swig_output_file} ]
261    then
262        NeedToUpdate=1
263        if [ $Debug -eq 1 ]
264        then
265            echo "${swig_python_wrapper} is newer than ${swig_output_file}"
266            echo "swig file will need to be re-built."
267        fi
268    fi
269fi
270
271if [ $NeedToUpdate -eq 0 ]
272then
273    if [ ${swig_python_typemaps} -nt ${swig_output_file} ]
274    then
275        NeedToUpdate=1
276        if [ $Debug -eq 1 ]
277        then
278            echo "${swig_python_typemaps} is newer than ${swig_output_file}"
279            echo "swig file will need to be re-built."
280        fi
281    fi
282fi
283
284if [ $NeedToUpdate -eq 0 ]
285then
286    if [ ${swig_python_swigsafecast} -nt ${swig_output_file} ]
287    then
288        NeedToUpdate=1
289        if [ $Debug -eq 1 ]
290        then
291            echo "${swig_python_swigsafecast} is newer than ${swig_output_file}"
292            echo "swig file will need to be re-built."
293        fi
294    fi
295fi
296
297python_version=`/usr/bin/env python --version 2>&1 | sed -e 's,Python ,,' -e 's,[.][0-9],,2' -e 's,[a-z][a-z][0-9],,'`
298
299if [ $MakefileCalled -eq 0 ]
300then
301    framework_python_dir="${TARGET_DIR}/LLDB.framework/Resources/Python/lldb"
302else
303    if [ -n "${PYTHON_INSTALL_DIR}" ]
304    then
305        framework_python_dir=`/usr/bin/env python -c "from distutils.sysconfig import get_python_lib; print get_python_lib(True, False, \"${PYTHON_INSTALL_DIR}\");"`/lldb
306    else
307        framework_python_dir=`/usr/bin/env python -c "from distutils.sysconfig import get_python_lib; print get_python_lib(True, False);"`/lldb
308    fi
309fi
310
311[ -n "${CONFIG_BUILD_DIR}" ] || CONFIG_BUILD_DIR=${framework_python_dir}
312
313if [ ! -L "${framework_python_dir}/_lldb.so" ]
314then
315    NeedToUpdate=1
316fi
317
318if [ ! -f "${framework_python_dir}/__init__.py" ]
319then
320    NeedToUpdate=1
321fi
322
323
324if [ $NeedToUpdate -eq 0 ]
325then
326    echo "Everything is up-to-date."
327    exit 0
328else
329    echo "SWIG needs to be re-run."
330    if [ -f ${swig_output_file} ]
331    then
332        rm ${swig_output_file}
333    fi
334fi
335
336
337# Build the SWIG C++ wrapper file for Python.
338
339if [ $GenerateDependencies -eq 1 ]
340then
341    if $SWIG -c++ -shadow -python -threads -I"${SRC_ROOT}/include" -I./. -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -MMD -MF "${swig_depend_file}.tmp" -outdir "${CONFIG_BUILD_DIR}" -o "${swig_output_file}" "${swig_input_file}"
342    then
343        mv -f "${swig_depend_file}.tmp" "${swig_depend_file}"
344    else
345        rm -f "${swig_depend_file}.tmp"
346        exit 1
347    fi
348else
349    $SWIG -c++ -shadow -python -threads -I"${SRC_ROOT}/include" -I./. -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -outdir "${CONFIG_BUILD_DIR}" -o "${swig_output_file}" "${swig_input_file}" || exit $?
350fi
351
352# Implement the iterator protocol and/or eq/ne operators for some lldb objects.
353# Append global variable to lldb Python module.
354# And initialize the lldb debugger subsystem.
355current_dir=`pwd`
356if [ -f "${current_dir}/modify-python-lldb.py" ]
357then
358    python ${current_dir}/modify-python-lldb.py ${CONFIG_BUILD_DIR}
359fi
360
361# Fix the "#include" statement in the swig output file
362
363if [ -f "${current_dir}/edit-swig-python-wrapper-file.py" ]
364then
365    if [ $MakefileCalled -eq 1 ]
366    then
367        python ${current_dir}/edit-swig-python-wrapper-file.py "${TARGET_DIR}"
368    else
369        python ${current_dir}/edit-swig-python-wrapper-file.py
370    fi
371    if [ -f "${swig_output_file}.edited" ]
372    then
373        mv "${swig_output_file}.edited" ${swig_output_file}
374    fi
375fi
376
377fi
378