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 14 SRC_ROOT=$1 15 TARGET_DIR=$2 16 CONFIG_BUILD_DIR=$3 17 PYTHON_INSTALL_DIR=$4 18 debug_flag=$5 19 SWIG=$6 20 makefile_flag=$7 21 dependency_flag=$8 22 23 if [ -n "$makefile_flag" -a "$makefile_flag" = "-m" ] 24 then 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 34 else 35 MakefileCalled=0 36 GenerateDependencies=0 37 fi 38 39 if [ $MakefileCalled -eq 0 ] 40 then 41 swig_output_file=${SRC_ROOT}/source/LLDBWrapPython.cpp 42 else 43 swig_output_file=${TARGET_DIR}/LLDBWrapPython.cpp 44 fi 45 swig_input_file=${SRC_ROOT}/scripts/lldb.swig 46 swig_python_extensions=${SRC_ROOT}/scripts/Python/python-extensions.swig 47 swig_python_wrapper=${SRC_ROOT}/scripts/Python/python-wrapper.swig 48 swig_python_typemaps=${SRC_ROOT}/scripts/Python/python-typemaps.swig 49 swig_python_swigsafecast=${SRC_ROOT}/scripts/Python/python-swigsafecast.swig 50 51 if [ "$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 59 else 60 61 if [ -n "$debug_flag" -a "$debug_flag" = "-debug" ] 62 then 63 Debug=1 64 else 65 Debug=0 66 fi 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 72 if echo $GCC_PREPROCESSOR_DEFINITIONS | grep LLDB_DISABLE_PYTHON 73 then 74 echo "" > "${swig_output_file}" 75 exit 0 76 fi 77 78 HEADER_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 129 INTERFACE_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 174 if [ $Debug -eq 1 ] 175 then 176 echo "Header files are:" 177 echo ${HEADER_FILES} 178 fi 179 180 if [ $Debug -eq 1 ] 181 then 182 echo "SWIG interface files are:" 183 echo ${INTERFACE_FILES} 184 fi 185 186 NeedToUpdate=0 187 188 189 if [ ! -f ${swig_output_file} ] 190 then 191 NeedToUpdate=1 192 if [ $Debug -eq 1 ] 193 then 194 echo "Failed to find LLDBWrapPython.cpp" 195 fi 196 fi 197 198 if [ $NeedToUpdate -eq 0 ] 199 then 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 213 fi 214 215 if [ $NeedToUpdate -eq 0 ] 216 then 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 230 fi 231 232 if [ $NeedToUpdate -eq 0 ] 233 then 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 243 fi 244 245 if [ $NeedToUpdate -eq 0 ] 246 then 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 256 fi 257 258 if [ $NeedToUpdate -eq 0 ] 259 then 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 269 fi 270 271 if [ $NeedToUpdate -eq 0 ] 272 then 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 282 fi 283 284 if [ $NeedToUpdate -eq 0 ] 285 then 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 295 fi 296 297 python_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 299 if [ $MakefileCalled -eq 0 ] 300 then 301 framework_python_dir="${TARGET_DIR}/LLDB.framework/Resources/Python/lldb" 302 else 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 309 fi 310 311 [ -n "${CONFIG_BUILD_DIR}" ] || CONFIG_BUILD_DIR=${framework_python_dir} 312 313 if [ ! -L "${framework_python_dir}/_lldb.so" ] 314 then 315 NeedToUpdate=1 316 fi 317 318 if [ ! -f "${framework_python_dir}/__init__.py" ] 319 then 320 NeedToUpdate=1 321 fi 322 323 324 if [ $NeedToUpdate -eq 0 ] 325 then 326 echo "Everything is up-to-date." 327 exit 0 328 else 329 echo "SWIG needs to be re-run." 330 if [ -f ${swig_output_file} ] 331 then 332 rm ${swig_output_file} 333 fi 334 fi 335 336 337 # Build the SWIG C++ wrapper file for Python. 338 339 if [ $GenerateDependencies -eq 1 ] 340 then 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 348 else 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 $? 350 fi 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. 355 current_dir=`pwd` 356 if [ -f "${current_dir}/modify-python-lldb.py" ] 357 then 358 python ${current_dir}/modify-python-lldb.py ${CONFIG_BUILD_DIR} 359 fi 360 361 # Fix the "#include" statement in the swig output file 362 363 if [ -f "${current_dir}/edit-swig-python-wrapper-file.py" ] 364 then 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 375 fi 376 377 fi 378