diff options
Diffstat (limited to 'msvc-common/msvc-rc-common')
-rwxr-xr-x | msvc-common/msvc-rc-common | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/msvc-common/msvc-rc-common b/msvc-common/msvc-rc-common new file mode 100755 index 0000000..ca986b4 --- /dev/null +++ b/msvc-common/msvc-rc-common @@ -0,0 +1,123 @@ +#! /usr/bin/env bash + +# Note: shouldn't be executed directly, src_dir must be set. + +# Common rc.exe driver that expects the SDKBIN and INCLUDE variables to be set +# for the specific MSVC version/configuration. + +trap "{ exit 1; }" ERR +set -o errtrace # Trap in functions. + +function info () { echo "$*" 1>&2; } +function error () { info "$*"; exit 1; } + +source "$src_dir/msvc-common/msvc-common" + +# Translate absolute paths from POSIX to Windows. Use bash array to store +# arguments in case they contain spaces. +# +# This needs to be done for both certain option values and arguments. +# Arguments are tricky in that unless we recognize every option, and option +# may look a lot like an absolute POSIX path (e.g., /nologo). The heuristics +# that we are going to use here is that if the argument starts with / and +# contains at least one more /, then we consider it an argument. Otherwise -- +# an options. We will also explicitly recognize certain options which may not +# fit this scheme well. +# +# Note that the order of the cases is important. Specifically, we want, e.g., +# /D before /D*. +# +# Note that rc.exe /? is missing some options that are documented in MSDN. +# +args=() + +while [ $# -gt 0 ]; do + case ${1^^} in # Uppercase for case-insensitive comparison. + + # /I <dir> + # + [/-]I) + args=("${args[@]}" "$1") + shift + args=("${args[@]}" "$(translate $1)") + shift + ;; + + # /I<dir> + # + [/-]I*) + args=("${args[@]}" "$(split_translate 2 $1)") + shift + ;; + + # /f[om] <file> + # + [/-]F[OM]) + args=("${args[@]}" "$1") + shift + args=("${args[@]}" "$(translate $1)") + shift + ;; + + # /f[om]<file> + # + [/-]F[OM]*) + args=("${args[@]}" "$(split_translate 3 $1)") + shift + ;; + + # /q <file> + # + [/-]Q) + args=("${args[@]}" "$1") + shift + args=("${args[@]}" "$(translate $1)") + shift + ;; + + # /q<file> + # + [/-]Q*) + args=("${args[@]}" "$(split_translate 2 $1)") + shift + ;; + + # Handle other options with separate values. This makes sure we don't try + # to path-translate them. + # + [/-]D | \ + [/-]U) + args=("${args[@]}" "$1") + shift + args=("${args[@]}" "$1") + shift + ;; + + # Handle other options with combined values that could possibly be + # interpreted as paths, for example /DFOO=foo/bar. + # + [/-]D*) + args=("${args[@]}" "$1") + shift + ;; + + # Option or argument. + # + *) + # If contains at least two slashes, treat it as a path. + # + if [[ "$1" == /*/* ]]; then + args=("${args[@]}" "$(translate $1)") + else + args=("${args[@]}" "$1") + fi + shift + ;; + esac +done + +export INCLUDE + +# rc.exe always sends diagnostics to stdout. +# +msvc_exec 1 "$SDKBIN\\rc.exe" "${args[@]}" |