The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/tools/xcrun_cache.sh

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 #!/bin/sh
    2 
    3 #
    4 # This shell-script is argument-compatible with xcrun(1) as invoked
    5 # by xnu's Makefiles. Additionally, it supports caching tools
    6 # in the local build directory. It is tightly coupled to exactly
    7 # the queries that MakeInc.cmd makes, in exactly the order it makes
    8 # them. ./tools/remote_build.sh invokes this indirectly in caching
    9 # mode, so '$(XCRUN) -sdk foo -find bar' copies 'bar' from wherever
   10 # it is on-disk into ./BUILD/BuildData, and returns that path to the
   11 # caller. In '-u' mode on a remote build server, cache tools
   12 # relative to the current build directory are returned without
   13 # actually calling through to xcrun(1), since the remote build
   14 # server may not even have Xcode installed.
   15 #
   16 
   17 SDKROOT=""
   18 FINDTOOL=""
   19 SDKQUERY=""
   20 VERBOSE=""
   21 OBJROOT=""
   22 CACHE=0
   23 
   24 # echo "Calling $0 $@" 1>&2
   25 
   26 while [ $# -gt 0 ]; do
   27     case "$1" in
   28         -c)
   29             CACHE=1
   30             shift
   31             OBJROOT="$1"
   32             shift
   33             ;;
   34         -u)
   35             CACHE=0
   36             shift
   37             OBJROOT="$1"
   38             shift
   39             ;;
   40         -sdk)
   41             shift
   42             SDKROOT="$1"
   43             shift
   44             ;;
   45         -verbose)
   46             VERBOSE="$1"
   47             shift
   48             set -x
   49             ;;
   50         -find)
   51             shift
   52             FINDTOOL="$1"
   53             shift
   54             ;;
   55         -show-sdk-path)
   56             SDKQUERY="$1"
   57             shift
   58             ;;
   59         -show-sdk-platform-path)
   60             SDKQUERY="$1"
   61             shift
   62             ;;
   63         -show-sdk-version)
   64             SDKQUERY="$1"
   65             shift
   66             ;;
   67         *)
   68             echo "Unrecognized argument $1" 1>&2
   69             exit 1
   70     esac    
   71 done
   72 
   73 CreateFile() {
   74     local string="$1"
   75     local filepath="$2"
   76     echo "${string}" > "${filepath}.new"
   77     cmp -s "${filepath}" "${filepath}.new"
   78     if [ $? -eq 0 ]; then
   79         rm "${filepath}.new"
   80     else
   81         mv "${filepath}.new" "${filepath}"
   82     fi
   83 }
   84 
   85 if [ $CACHE -eq 1 ]; then
   86 
   87     if [ -n "$SDKQUERY" ]; then
   88         # MakeInc.cmd makes SDK queries up-front first. Generally the
   89         # SDKROOT that is an input to these are one of:
   90         # "macosx" => Host SDK
   91         # "iphonehostXXX" => iPhone Host SDK
   92         # other shortcut or full path => Target SDK
   93         #
   94         # Once an initial lookup is made, subsequent SDKROOTs for
   95         # that same SDK may use a full path or cached path
   96         SDKTYPE=""
   97         case "$SDKROOT" in
   98             macosx)
   99                 SDKTYPE="host"
  100                 ;;
  101             iphonehost*)
  102                 SDKTYPE="iphonehost"
  103                 ;;
  104             *)
  105                 if [ -f "$SDKROOT/.sdktype" ]; then
  106                     SDKTYPE=`cat "$SDKROOT/.sdktype"`
  107                 else
  108                     SDKTYPE="target"
  109                 fi
  110                 ;;
  111         esac
  112 
  113         # A cached SDK path can be passed to xcrun, so
  114         # we need the original on-disk path
  115         if [ -f "$SDKROOT/.realsdkpath" ]; then
  116             REALSDKROOT=`cat "$SDKROOT/.realsdkpath"`
  117         else
  118             REALSDKROOT="$SDKROOT"
  119         fi
  120 
  121         SDKPROPERTY=`/usr/bin/xcrun $VERBOSE -sdk "$REALSDKROOT" "$SDKQUERY"`
  122         if [ $? -ne 0 ]; then
  123             exit $?
  124         fi
  125         
  126         case $SDKQUERY in
  127             -show-sdk-path)
  128                 # Cache the SDK locally, and transform the resulting SDKPROPERTY
  129                 if [ -z "$SDKPROPERTY" ]; then
  130                     SDKPROPERTY="/"
  131                     SDKNAME="Slash.sdk"
  132                 else
  133                     SDKNAME=$(basename "${SDKPROPERTY}")
  134                 fi
  135                 mkdir -p "${OBJROOT}/BuildTools/${SDKNAME}"
  136                 mkdir -p "${OBJROOT}/BuildTools/${SDKNAME}/usr/include"
  137                 rsync -aq --exclude=c++ --exclude=php --exclude=soc "${SDKPROPERTY}/usr/include/" "${OBJROOT}/BuildTools/${SDKNAME}/usr/include/"
  138                 if [ "$SDKTYPE" = "iphonehost" ]; then
  139                     mkdir -p "${OBJROOT}/BuildTools/${SDKNAME}/usr/local/lib/system"
  140                     rsync -aq "${SDKPROPERTY}/usr/local/lib/system/" "${OBJROOT}/BuildTools/${SDKNAME}/usr/local/lib/system/"
  141                 else
  142                     mkdir -p "${OBJROOT}/BuildTools/${SDKNAME}/usr/lib"
  143                     rsync -aq "${SDKPROPERTY}/usr/lib/libSystem"* "${OBJROOT}/BuildTools/${SDKNAME}/usr/lib/"
  144                     rsync -aq "${SDKPROPERTY}/usr/lib/libc++"* "${OBJROOT}/BuildTools/${SDKNAME}/usr/lib/"
  145                     rsync -aq "${SDKPROPERTY}/usr/lib/libstdc++"* "${OBJROOT}/BuildTools/${SDKNAME}/usr/lib/"
  146                     mkdir -p "${OBJROOT}/BuildTools/${SDKNAME}/usr/lib/system"
  147                     rsync -aq --exclude=\*_debug.dylib --exclude=\*_profile.dylib "${SDKPROPERTY}/usr/lib/system/" "${OBJROOT}/BuildTools/${SDKNAME}/usr/lib/system/"
  148                 fi
  149                 if [ -f "${SDKPROPERTY}/usr/local/libexec/availability.pl" ]; then
  150                     mkdir -p "${OBJROOT}/BuildTools/${SDKNAME}/usr/local/libexec"
  151                     rsync -aq "${SDKPROPERTY}/usr/local/libexec/availability.pl" "${OBJROOT}/BuildTools/${SDKNAME}/usr/local/libexec/"
  152                 fi
  153                 CreateFile "${SDKPROPERTY}" "${OBJROOT}/BuildTools/${SDKNAME}/.realsdkpath"
  154                 CreateFile "${SDKTYPE}" "${OBJROOT}/BuildTools/${SDKNAME}/.sdktype"
  155                 CreateFile "BuildTools/${SDKNAME}" "${OBJROOT}/BuildTools/.${SDKTYPE}sdk"
  156                 echo "${OBJROOT}/BuildTools/${SDKNAME}"
  157                 exit 0
  158                 ;;
  159             -show-sdk-platform-path)
  160                 PLATFORMNAME=$(basename "${SDKPROPERTY}")
  161                 mkdir -p "${OBJROOT}/BuildTools/${PLATFORMNAME}"
  162                 if [ -f "${SDKPROPERTY}/usr/local/standalone/firmware/device_map.db" ]; then
  163                     mkdir -p "${OBJROOT}/BuildTools/${PLATFORMNAME}/usr/local/standalone/firmware"
  164                     rsync -aq "${SDKPROPERTY}/usr/local/standalone/firmware/device_map.db" \
  165                         "${OBJROOT}/BuildTools/${PLATFORMNAME}/usr/local/standalone/firmware/"
  166                 fi
  167                 CreateFile "BuildTools/${PLATFORMNAME}" "${OBJROOT}/BuildTools/.targetplatform"
  168                 echo "${OBJROOT}/BuildTools/${PLATFORMNAME}"
  169                 exit 0
  170                 ;;
  171             -show-sdk-version)
  172                 CreateFile "${SDKPROPERTY}" "${OBJROOT}/BuildTools/.targetsdkversion"
  173                 echo "${SDKPROPERTY}"
  174                 exit 0
  175                 ;;
  176         esac
  177 
  178     elif [ -n "$FINDTOOL" ]; then
  179 
  180         # We assume SDK Queries have been performed first and subsequent
  181         # SDKROOTs used to find tools are all using cached SDKs in
  182         # the build directory, in which case metadata is present
  183 
  184         if [ ! -f "$SDKROOT/.realsdkpath" ]; then
  185             exit 1
  186         fi
  187         REALSDKROOT=`cat "$SDKROOT/.realsdkpath"`
  188 
  189         if [ ! -f "$SDKROOT/.sdktype" ]; then
  190             exit 1
  191         fi
  192         SDKTYPE=`cat "$SDKROOT/.sdktype"`
  193 
  194         TOOLPATH=`/usr/bin/xcrun $VERBOSE -sdk "$REALSDKROOT" -find "$FINDTOOL"`
  195         if [ $? -ne 0 ]; then
  196             exit $?
  197         fi
  198 
  199         # Keep the parent directory when caching tools, along with Host vs. Target
  200         TOOLNAME=$(basename "${TOOLPATH}")
  201         TOOLDIR=$(basename $(dirname "${TOOLPATH}"))
  202         if [ "$SDKTYPE" = "host" ]; then
  203             NEWTOOLPATH="${OBJROOT}/BuildTools/Host/${TOOLDIR}/${TOOLNAME}"
  204             mkdir -p "${OBJROOT}/BuildTools/Host"
  205             CreateFile "BuildTools/Host/${TOOLDIR}/${TOOLNAME}" "${OBJROOT}/BuildTools/Host/.${TOOLNAME}"
  206         else
  207             NEWTOOLPATH="${OBJROOT}/BuildTools/Target/${TOOLDIR}/${TOOLNAME}"
  208             mkdir -p "${OBJROOT}/BuildTools/Target"
  209             CreateFile "BuildTools/Target/${TOOLDIR}/${TOOLNAME}" "${OBJROOT}/BuildTools/Target/.${TOOLNAME}"
  210         fi
  211         mkdir -p $(dirname "${NEWTOOLPATH}")
  212         rsync -aq "${TOOLPATH}" "${NEWTOOLPATH}"
  213         case "${TOOLNAME}" in
  214             clang)
  215                 mkdir -p $(dirname $(dirname "${NEWTOOLPATH}"))/lib/clang
  216                 rsync -aq $(dirname "${TOOLPATH}")/ld $(dirname "${NEWTOOLPATH}")/ld
  217                 rsync -aq $(dirname $(dirname "${TOOLPATH}"))/lib/clang/ $(dirname $(dirname "${NEWTOOLPATH}"))/lib/clang/
  218                 rsync -aq $(dirname $(dirname "${TOOLPATH}"))/lib/libLTO.dylib $(dirname $(dirname "${NEWTOOLPATH}"))/lib/libLTO.dylib
  219                 ;;
  220             bison)
  221                 mkdir -p $(dirname $(dirname "${NEWTOOLPATH}"))/share/bison
  222                 rsync -aq $(dirname $(dirname "${TOOLPATH}"))/share/bison/ $(dirname $(dirname "${NEWTOOLPATH}"))/share/bison/
  223                 ;;
  224         esac
  225 
  226         echo "${NEWTOOLPATH}"
  227         exit 0
  228     else
  229         echo "Unrecognized option" 1>&2
  230         exit 1
  231     fi
  232 fi
  233 
  234 # When using cached SDK information, first try to do
  235 # an initial classification, and then read properties from
  236 # cached locations
  237 SDKTYPE=""
  238 case "$SDKROOT" in
  239     macosx)
  240         SDKTYPE="host"
  241         ;;
  242     iphonehost*)
  243         SDKTYPE="iphonehost"
  244         ;;
  245     *)
  246         if [ -f "$SDKROOT/.sdktype" ]; then
  247             SDKTYPE=`cat "$SDKROOT/.sdktype"`
  248         else
  249             SDKTYPE="target"
  250         fi
  251         ;;
  252 esac
  253 
  254 if [ -n "$FINDTOOL" ]; then
  255     TOOLNAME=$(basename "${FINDTOOL}")
  256     if [ "${SDKTYPE}" = "host" ]; then
  257         RELPATH=`cat ${OBJROOT}/BuildTools/Host/.${TOOLNAME}`
  258     else
  259         RELPATH=`cat ${OBJROOT}/BuildTools/Target/.${TOOLNAME}`
  260     fi
  261     echo "${OBJROOT}/${RELPATH}"
  262 else    
  263     case $SDKQUERY in
  264         -show-sdk-path)
  265             RELPATH=`cat ${OBJROOT}/BuildTools/.${SDKTYPE}sdk`
  266             echo "${OBJROOT}/${RELPATH}"
  267             ;;
  268         -show-sdk-platform-path)
  269             RELPATH=`cat ${OBJROOT}/BuildTools/.targetplatform`
  270             echo "${OBJROOT}/${RELPATH}"
  271             ;;
  272         -show-sdk-version)
  273             echo `cat ${OBJROOT}/BuildTools/.targetsdkversion`
  274             ;;
  275     esac
  276 fi

Cache object: c2abdb045df387f69100f8d134a48cc8


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.