Home | History | Annotate | Download | only in Python
      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