1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#!/bin/bash
2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang##
3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang##  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang##
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang##  Use of this source code is governed by a BSD-style license
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang##  that can be found in the LICENSE file in the root of the source
7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang##  tree. An additional intellectual property rights grant can be found
8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang##  in the file PATENTS.  All contributing project authors may
9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang##  be found in the AUTHORS file in the root of the source tree.
10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang##
11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangself=$0
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangself_basename=${self##*/}
14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangself_dirname=$(dirname "$0")
15ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
16ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian. "$self_dirname/msvs_common.sh"|| exit 127
17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangshow_help() {
19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cat <<EOF
20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangUsage: ${self_basename} --name=projname [options] file1 [file2 ...]
21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangThis script generates a Visual Studio project file from a list of source
23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangcode files.
24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangOptions:
26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    --help                      Print this message
27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    --exe                       Generate a project for building an Application
28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    --lib                       Generate a project for creating a static library
29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    --dll                       Generate a project for creating a dll
30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    --static-crt                Use the static C runtime (/MT)
312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian    --enable-werror             Treat warnings as errors (/WX)
32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    --target=isa-os-cc          Target specifier (required)
33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    --out=filename              Write output to a file [stdout]
34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    --name=project_name         Name of the project (required)
35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    --proj-guid=GUID            GUID to use for the project
36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    --module-def=filename       File containing export definitions (for DLLs)
378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern    --ver=version               Version (10,11,12,14,15) of visual studio to generate for
38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    --src-path-bare=dir         Path to root of source tree
39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    -Ipath/to/include           Additional include directories
40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    -DFLAG[=value]              Preprocessor macros to define
41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    -Lpath/to/lib               Additional library search paths
42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    -llibname                   Library to link against
43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangEOF
44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    exit 1
45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtag_content() {
48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    local tag=$1
49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    local content=$2
50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    shift
51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    shift
52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if [ $# -ne 0 ]; then
53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        echo "${indent}<${tag}"
54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        indent_push
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        tag_attributes "$@"
56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        echo "${indent}>${content}</${tag}>"
57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        indent_pop
58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    else
59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        echo "${indent}<${tag}>${content}</${tag}>"
60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fi
61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuanggenerate_filter() {
64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    local name=$1
65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    local pats=$2
66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    local file_list_sz
67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    local i
68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    local f
69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    local saveIFS="$IFS"
70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    local pack
71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    echo "generating filter '$name' from ${#file_list[@]} files" >&2
72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    IFS=*
73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    file_list_sz=${#file_list[@]}
75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for i in ${!file_list[@]}; do
76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        f=${file_list[i]}
77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        for pat in ${pats//;/$IFS}; do
78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            if [ "${f##*.}" == "$pat" ]; then
79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                unset file_list[i]
80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
81ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                objf=$(echo ${f%.*}.obj \
82ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                       | sed -e "s,$src_path_bare,," \
83ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                             -e 's/^[\./]\+//g' -e 's,[:/ ],_,g')
84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
857bc9febe8749e98a3812a0dc4380ceae75c29450Johann                if ([ "$pat" == "asm" ] || [ "$pat" == "s" ] || [ "$pat" == "S" ]) && $asm_use_custom_step; then
862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    # Avoid object file name collisions, i.e. vpx_config.c and
872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    # vpx_config.asm produce the same object file without
882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    # this additional suffix.
892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    objf=${objf%.obj}_asm.obj
90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    open_tag CustomBuild \
91ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                        Include="$f"
92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    for plat in "${platforms[@]}"; do
93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        for cfg in Debug Release; do
94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                            tag_content Message "Assembling %(Filename)%(Extension)" \
95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                Condition="'\$(Configuration)|\$(Platform)'=='$cfg|$plat'"
96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                            tag_content Command "$(eval echo \$asm_${cfg}_cmdline) -o \$(IntDir)$objf" \
97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                Condition="'\$(Configuration)|\$(Platform)'=='$cfg|$plat'"
98ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                            tag_content Outputs "\$(IntDir)$objf" \
99ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                                Condition="'\$(Configuration)|\$(Platform)'=='$cfg|$plat'"
100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        done
101ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    done
102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    close_tag CustomBuild
1034fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang                elif [ "$pat" == "c" ] || \
1044fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang                     [ "$pat" == "cc" ] || [ "$pat" == "cpp" ]; then
105ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    open_tag ClCompile \
106ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                        Include="$f"
107ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    # Separate file names with Condition?
108ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    tag_content ObjectFileName "\$(IntDir)$objf"
1092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    # Check for AVX and turn it on to avoid warnings.
1102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    if [[ $f =~ avx.?\.c$ ]]; then
1112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                        tag_content AdditionalOptions "/arch:AVX"
1122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    fi
113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    close_tag ClCompile
114ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                elif [ "$pat" == "h" ] ; then
115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    tag ClInclude \
116ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                        Include="$f"
117ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                elif [ "$pat" == "vcxproj" ] ; then
118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    open_tag ProjectReference \
119ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                        Include="$f"
120ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    depguid=`grep ProjectGuid "$f" | sed 's,.*<.*>\(.*\)</.*>.*,\1,'`
121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    tag_content Project "$depguid"
122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    tag_content ReferenceOutputAssembly false
123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    close_tag ProjectReference
124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                else
125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    tag None \
126ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                        Include="$f"
127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                fi
128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                break
130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            fi
131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        done
132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    done
133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    IFS="$saveIFS"
135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
137ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang# Process command line
138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangunset target
139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangfor opt in "$@"; do
140ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    optval="${opt#*=}"
141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    case "$opt" in
142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        --help|-h) show_help
143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
144ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        --target=*) target="${optval}"
145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        --out=*) outfile="$optval"
147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        --name=*) name="${optval}"
149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        --proj-guid=*) guid="${optval}"
151ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        --module-def=*) module_def="${optval}"
153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        --exe) proj_kind="exe"
155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        --dll) proj_kind="dll"
157ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
158ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        --lib) proj_kind="lib"
159ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
160ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian        --src-path-bare=*)
161ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            src_path_bare=$(fix_path "$optval")
162ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            src_path_bare=${src_path_bare%/}
163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
164ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        --static-crt) use_static_runtime=true
165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
1662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian        --enable-werror) werror=true
1672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian        ;;
168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        --ver=*)
169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            vs_ver="$optval"
170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            case "$optval" in
1718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                10|11|12|14|15)
172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                ;;
173ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                *) die Unrecognized Visual Studio Version in $opt
174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                ;;
175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            esac
176ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -I*)
178ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            opt=${opt##-I}
179ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            opt=$(fix_path "$opt")
180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            opt="${opt%/}"
181ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            incs="${incs}${incs:+;}&quot;${opt}&quot;"
182ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            yasmincs="${yasmincs} -I&quot;${opt}&quot;"
183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -D*) defines="${defines}${defines:+;}${opt##-D}"
185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -L*) # fudge . to $(OutDir)
187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            if [ "${opt##-L}" == "." ]; then
188ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                libdirs="${libdirs}${libdirs:+;}&quot;\$(OutDir)&quot;"
189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            else
190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                 # Also try directories for this platform/configuration
191ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 opt=${opt##-L}
192ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 opt=$(fix_path "$opt")
193ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 libdirs="${libdirs}${libdirs:+;}&quot;${opt}&quot;"
194ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 libdirs="${libdirs}${libdirs:+;}&quot;${opt}/\$(PlatformName)/\$(Configuration)&quot;"
195ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                 libdirs="${libdirs}${libdirs:+;}&quot;${opt}/\$(PlatformName)&quot;"
196ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            fi
197ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -l*) libs="${libs}${libs:+ }${opt##-l}.lib"
199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        -*) die_unknown $opt
201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        *)
203ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            # The paths in file_list are fixed outside of the loop.
204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            file_list[${#file_list[@]}]="$opt"
205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            case "$opt" in
2067bc9febe8749e98a3812a0dc4380ceae75c29450Johann                 *.asm|*.[Ss]) uses_asm=true
207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                 ;;
208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            esac
209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ;;
210ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    esac
211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangdone
212ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
213ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian# Make one call to fix_path for file_list to improve performance.
21468e1c830ade592be74773e249bf94e2bbfb50de7Johannfix_file_list file_list
215ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangoutfile=${outfile:-/dev/stdout}
217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangguid=${guid:-`generate_uuid`}
218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangasm_use_custom_step=false
219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuanguses_asm=${uses_asm:-false}
220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangcase "${vs_ver:-11}" in
2218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern    10|11|12|14|15)
222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang       asm_use_custom_step=$uses_asm
223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ;;
224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangesac
225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang[ -n "$name" ] || die "Project name (--name) must be specified!"
227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang[ -n "$target" ] || die "Target (--target) must be specified!"
228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangif ${use_static_runtime:-false}; then
230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    release_runtime=MultiThreaded
231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    debug_runtime=MultiThreadedDebug
232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    lib_sfx=mt
233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangelse
234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    release_runtime=MultiThreadedDLL
235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    debug_runtime=MultiThreadedDebugDLL
236ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    lib_sfx=md
237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangfi
238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang# Calculate debug lib names: If a lib ends in ${lib_sfx}.lib, then rename
240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang# it to ${lib_sfx}d.lib. This precludes linking to release libs from a
241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang# debug exe, so this may need to be refactored later.
242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangfor lib in ${libs}; do
243ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if [ "$lib" != "${lib%${lib_sfx}.lib}" ]; then
244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        lib=${lib%.lib}d.lib
245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    fi
246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    debug_libs="${debug_libs}${debug_libs:+ }${lib}"
247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangdone
248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangdebug_libs=${debug_libs// /;}
249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuanglibs=${libs// /;}
250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
251ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang# List of all platforms supported for this target
253ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangcase "$target" in
254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    x86_64*)
255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        platforms[0]="x64"
2567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        asm_Debug_cmdline="yasm -Xvc -g cv8 -f win64 ${yasmincs} &quot;%(FullPath)&quot;"
2577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        asm_Release_cmdline="yasm -Xvc -f win64 ${yasmincs} &quot;%(FullPath)&quot;"
258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ;;
259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    x86*)
260ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        platforms[0]="Win32"
2617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        asm_Debug_cmdline="yasm -Xvc -g cv8 -f win32 ${yasmincs} &quot;%(FullPath)&quot;"
2627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        asm_Release_cmdline="yasm -Xvc -f win32 ${yasmincs} &quot;%(FullPath)&quot;"
263ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ;;
264ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    arm*)
2657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        platforms[0]="ARM"
2667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        asm_Debug_cmdline="armasm -nologo -oldit &quot;%(FullPath)&quot;"
2677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        asm_Release_cmdline="armasm -nologo -oldit &quot;%(FullPath)&quot;"
268ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ;;
269ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    *) die "Unsupported target $target!"
270ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    ;;
271ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangesac
272ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
273ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuanggenerate_vcxproj() {
274ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
275ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    open_tag Project \
276ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        DefaultTargets="Build" \
277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        ToolsVersion="4.0" \
278ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        xmlns="http://schemas.microsoft.com/developer/msbuild/2003" \
279ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
280ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    open_tag ItemGroup \
281ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        Label="ProjectConfigurations"
282ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for plat in "${platforms[@]}"; do
283ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        for config in Debug Release; do
284ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            open_tag ProjectConfiguration \
285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                Include="$config|$plat"
286ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            tag_content Configuration $config
287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            tag_content Platform $plat
288ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            close_tag ProjectConfiguration
289ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        done
290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    done
291ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    close_tag ItemGroup
292ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
293ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    open_tag PropertyGroup \
294ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        Label="Globals"
295ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        tag_content ProjectGuid "{${guid}}"
296ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        tag_content RootNamespace ${name}
297ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        tag_content Keyword ManagedCProj
298ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian        if [ $vs_ver -ge 12 ] && [ "${platforms[0]}" = "ARM" ]; then
299ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            tag_content AppContainerApplication true
300ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            # The application type can be one of "Windows Store",
301ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            # "Windows Phone" or "Windows Phone Silverlight". The
302ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            # actual value doesn't matter from the libvpx point of view,
303ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            # since a static library built for one works on the others.
304ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            # The PlatformToolset field needs to be set in sync with this;
305ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            # for Windows Store and Windows Phone Silverlight it should be
306ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            # v120 while it should be v120_wp81 if the type is Windows Phone.
307ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            tag_content ApplicationType "Windows Store"
308ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            tag_content ApplicationTypeRevision 8.1
309ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian        fi
310ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    close_tag PropertyGroup
311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
312ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    tag Import \
313ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        Project="\$(VCTargetsPath)\\Microsoft.Cpp.Default.props"
314ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
315ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for plat in "${platforms[@]}"; do
316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        for config in Release Debug; do
317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            open_tag PropertyGroup \
318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                Condition="'\$(Configuration)|\$(Platform)'=='$config|$plat'" \
319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                Label="Configuration"
320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            if [ "$proj_kind" = "exe" ]; then
321ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                tag_content ConfigurationType Application
322ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            elif [ "$proj_kind" = "dll" ]; then
323ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                tag_content ConfigurationType DynamicLibrary
324ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            else
325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                tag_content ConfigurationType StaticLibrary
326ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            fi
327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            if [ "$vs_ver" = "11" ]; then
328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                if [ "$plat" = "ARM" ]; then
329ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    # Setting the wp80 toolchain automatically sets the
330ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    # WINAPI_FAMILY define, which is required for building
331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    # code for arm with the windows headers. Alternatively,
332ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    # one could add AppContainerApplication=true in the Globals
333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    # section and add PrecompiledHeader=NotUsing and
334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    # CompileAsWinRT=false in ClCompile and SubSystem=Console
335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    # in Link.
336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    tag_content PlatformToolset v110_wp80
337ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                else
338ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    tag_content PlatformToolset v110
339ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                fi
340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            fi
3412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian            if [ "$vs_ver" = "12" ]; then
342ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                # Setting a PlatformToolset indicating windows phone isn't
343ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                # enough to build code for arm with MSVC 2013, one strictly
344ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                # has to enable AppContainerApplication as well.
345ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                tag_content PlatformToolset v120
3462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian            fi
3477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian            if [ "$vs_ver" = "14" ]; then
3487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                tag_content PlatformToolset v140
3497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian            fi
3508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern            if [ "$vs_ver" = "15" ]; then
3518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                tag_content PlatformToolset v141
3528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern            fi
353ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            tag_content CharacterSet Unicode
354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            if [ "$config" = "Release" ]; then
355ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                tag_content WholeProgramOptimization true
356ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            fi
357ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            close_tag PropertyGroup
358ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        done
359ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    done
360ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
361ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    tag Import \
362ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        Project="\$(VCTargetsPath)\\Microsoft.Cpp.props"
363ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
364ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    open_tag ImportGroup \
365ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        Label="PropertySheets"
366ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        tag Import \
367ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            Project="\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props" \
368ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            Condition="exists('\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props')" \
369ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            Label="LocalAppDataPlatform"
370ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    close_tag ImportGroup
371ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
372ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    tag PropertyGroup \
373ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        Label="UserMacros"
374ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
375ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for plat in "${platforms[@]}"; do
376ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'`
377ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        for config in Debug Release; do
378ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            open_tag PropertyGroup \
379ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                Condition="'\$(Configuration)|\$(Platform)'=='$config|$plat'"
380ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            tag_content OutDir "\$(SolutionDir)$plat_no_ws\\\$(Configuration)\\"
381ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            tag_content IntDir "$plat_no_ws\\\$(Configuration)\\${name}\\"
3822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian            if [ "$proj_kind" == "lib" ]; then
3832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian              if [ "$config" == "Debug" ]; then
3842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                config_suffix=d
3852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian              else
3862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                config_suffix=""
3872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian              fi
3882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian              tag_content TargetName "${name}${lib_sfx}${config_suffix}"
3892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian            fi
390ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            close_tag PropertyGroup
391ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        done
392ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    done
393ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
394ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for plat in "${platforms[@]}"; do
395ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        for config in Debug Release; do
396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            open_tag ItemDefinitionGroup \
397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                Condition="'\$(Configuration)|\$(Platform)'=='$config|$plat'"
3982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian            if [ "$name" == "vpx" ]; then
3992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                hostplat=$plat
4002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                if [ "$hostplat" == "ARM" ]; then
4012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                    hostplat=Win32
4022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                fi
403ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            fi
404ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            open_tag ClCompile
405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            if [ "$config" = "Debug" ]; then
406ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                opt=Disabled
407ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                runtime=$debug_runtime
408ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                curlibs=$debug_libs
4097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                debug=_DEBUG
410ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            else
411ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                opt=MaxSpeed
412ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                runtime=$release_runtime
413ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                curlibs=$libs
414ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                tag_content FavorSizeOrSpeed Speed
415ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                debug=NDEBUG
416ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            fi
4177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian            extradefines=";$defines"
418ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            tag_content Optimization $opt
419ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            tag_content AdditionalIncludeDirectories "$incs;%(AdditionalIncludeDirectories)"
420ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            tag_content PreprocessorDefinitions "WIN32;$debug;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE$extradefines;%(PreprocessorDefinitions)"
421ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            tag_content RuntimeLibrary $runtime
422ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            tag_content WarningLevel Level3
4232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian            if ${werror:-false}; then
4242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                tag_content TreatWarningAsError true
4252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian            fi
426ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            if [ $vs_ver -ge 11 ]; then
427ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                # We need to override the defaults for these settings
428ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                # if AppContainerApplication is set.
429ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                tag_content CompileAsWinRT false
430ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                tag_content PrecompiledHeader NotUsing
431ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                tag_content SDLCheck false
432ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian            fi
433ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            close_tag ClCompile
434ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            case "$proj_kind" in
435ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            exe)
436ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                open_tag Link
437ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                tag_content GenerateDebugInformation true
438ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                # Console is the default normally, but if
439ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                # AppContainerApplication is set, we need to override it.
440ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                tag_content SubSystem Console
441ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                close_tag Link
442ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                ;;
443ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            dll)
444ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                open_tag Link
445ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                tag_content GenerateDebugInformation true
446ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                tag_content ModuleDefinitionFile $module_def
447ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                close_tag Link
448ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                ;;
449ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            lib)
450ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                ;;
451ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            esac
452ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            close_tag ItemDefinitionGroup
453ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        done
454ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
455ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    done
456ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
457ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    open_tag ItemGroup
4587bc9febe8749e98a3812a0dc4380ceae75c29450Johann    generate_filter "Source Files"   "c;cc;cpp;def;odl;idl;hpj;bat;asm;asmx;s;S"
459ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    close_tag ItemGroup
460ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    open_tag ItemGroup
461ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    generate_filter "Header Files"   "h;hm;inl;inc;xsd"
462ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    close_tag ItemGroup
463ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    open_tag ItemGroup
464ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    generate_filter "Build Files"    "mk"
465ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    close_tag ItemGroup
466ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    open_tag ItemGroup
467ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    generate_filter "References"     "vcxproj"
468ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    close_tag ItemGroup
469ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
470ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    tag Import \
471ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        Project="\$(VCTargetsPath)\\Microsoft.Cpp.targets"
472ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
473ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    open_tag ImportGroup \
474ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        Label="ExtensionTargets"
475ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    close_tag ImportGroup
476ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
477ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    close_tag Project
478ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
479ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    # This must be done from within the {} subshell
480ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    echo "Ignored files list (${#file_list[@]} items) is:" >&2
481ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for f in "${file_list[@]}"; do
482ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        echo "    $f" >&2
483ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    done
484ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
485ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
486ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang# This regexp doesn't catch most of the strings in the vcxproj format,
487ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang# since they're like <tag>path</tag> instead of <tag attr="path" />
488ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang# as previously. It still seems to work ok despite this.
489ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuanggenerate_vcxproj |
490ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    sed  -e '/"/s;\([^ "]\)/;\1\\;g' |
491ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    sed  -e '/xmlns/s;\\;/;g' > ${outfile}
492ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
493ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangexit
494