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