105 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			105 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #!/usr/bin/bash | ||
|  | # cl_cpp_wrapper | ||
|  | # Wrapper around MS's cl.exe to make it act more like Unix cpp | ||
|  | 
 | ||
|  | PATH="$PATH:/usr/bin" | ||
|  | 
 | ||
|  | case $MACHTYPE in | ||
|  |     *-msys) | ||
|  |         slash="-" | ||
|  |         ;; | ||
|  |     *) | ||
|  |         slash="/" | ||
|  |         ;; | ||
|  | esac | ||
|  | 
 | ||
|  | # prog specifies the program that should be run cl.exe | ||
|  | prog=cl.exe | ||
|  | debug= | ||
|  | cppopt=("${slash}nologo") | ||
|  | cppopt+=("${slash}E") | ||
|  | verbose= | ||
|  | shared_index=-1 | ||
|  | 
 | ||
|  | processargs() | ||
|  | { | ||
|  | ### Run through every option and convert it to the proper MS one | ||
|  | while test $# -gt 0; do | ||
|  |     case "$1" in | ||
|  |     -D*) optarg= ;; | ||
|  |     -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; | ||
|  |     *) optarg= ;; | ||
|  |     esac | ||
|  |     gotparam=1 | ||
|  |     case "$1" in | ||
|  |     --help) | ||
|  |         usage | ||
|  |         exit 0 | ||
|  |         ;; | ||
|  |     --verbose) | ||
|  |         verbose=1 | ||
|  |         ;; | ||
|  |     -*) | ||
|  |         # Remaining '-' options are passed to the compiler | ||
|  |         if test x$optarg != x ; then | ||
|  |             cppopt+=("${slash}${1:1}=$optarg") | ||
|  |         else | ||
|  |             cppopt+=("${slash}${1:1}") | ||
|  |         fi | ||
|  |         ;; | ||
|  | 
 | ||
|  |     /*) | ||
|  |         # All '/' options are assumed to be for cpp and are passed through | ||
|  |         cppopt+=("${slash}${1:1}") | ||
|  |         ;; | ||
|  | 
 | ||
|  |     *) | ||
|  |         file=$1 | ||
|  |         #cppopt+=("$1") | ||
|  |         ;; | ||
|  |     esac | ||
|  |     shift | ||
|  | done | ||
|  | } | ||
|  | 
 | ||
|  | # Whitespace in paths is dealt with by setting IFS and using bash arrays | ||
|  | 
 | ||
|  | # processargs $CPP_FLAGS | ||
|  | IFS="" | ||
|  | processargs $@ | ||
|  | 
 | ||
|  | if test x$V = x1 ; then | ||
|  |     verbose=1 | ||
|  | fi | ||
|  | 
 | ||
|  | if test -n "$verbose" ; then | ||
|  |   echo -n "$prog" | ||
|  |   for opt in "${cppopt[@]}" ; do | ||
|  |     echo -n " \"$opt\"" | ||
|  |   done | ||
|  |   echo "" | ||
|  | fi | ||
|  | 
 | ||
|  | [ $# -ge 1 -a -f "$1" ] && input="$file" || input="-" | ||
|  | 
 | ||
|  | input_file="${file:-/proc/self/fd/0}" | ||
|  | if [ "$input_file" == "/proc/self/fd/0" ]; then | ||
|  |     #echo "STDIN" | ||
|  |     # CL does not support reading from STDIN so it is wrapped here.  | ||
|  |     tmpout=cpp_wrapper_$RANDOM.h | ||
|  |     /usr/bin/cp $input_file $tmpout | ||
|  |     # from https://stackoverflow.com/questions/36313562/how-to-redirect-stdin-to-file-in-bash | ||
|  |     #exec 3> cppstdtmp.h | ||
|  |     #while IFS= read -r line; do | ||
|  |     #  printf '%s' "$line" | ||
|  |     #done | ||
|  |     #exec 3<&- | ||
|  |     #echo "$(</dev/stdin)" > cppstdtmp.h | ||
|  |     exec $prog ${cppopt[@]} $tmpout | ||
|  |     rm -f $tmpout | ||
|  | else | ||
|  |     #echo "FILE" | ||
|  |     exec $prog ${cppopt[@]} $input_file | ||
|  | fi | ||
|  | 
 |