#! /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. 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 # [/-]I) args=("${args[@]}" "$1") shift args=("${args[@]}" "$(translate $1)") shift ;; # /I # [/-]I*) args=("${args[@]}" "$(split_translate 2 $1)") shift ;; # /f[om] # [/-]F[OM]) args=("${args[@]}" "$1") shift args=("${args[@]}" "$(translate $1)") shift ;; # /f[om] # [/-]F[OM]*) args=("${args[@]}" "$(split_translate 3 $1)") shift ;; # /q # [/-]Q) args=("${args[@]}" "$1") shift args=("${args[@]}" "$(translate $1)") shift ;; # /q # [/-]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[@]}"