xref: /aosp_15_r20/external/libvpx/build/make/gen_msvs_vcxproj.sh (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker#!/bin/bash
2*fb1b10abSAndroid Build Coastguard Worker##
3*fb1b10abSAndroid Build Coastguard Worker##  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
4*fb1b10abSAndroid Build Coastguard Worker##
5*fb1b10abSAndroid Build Coastguard Worker##  Use of this source code is governed by a BSD-style license
6*fb1b10abSAndroid Build Coastguard Worker##  that can be found in the LICENSE file in the root of the source
7*fb1b10abSAndroid Build Coastguard Worker##  tree. An additional intellectual property rights grant can be found
8*fb1b10abSAndroid Build Coastguard Worker##  in the file PATENTS.  All contributing project authors may
9*fb1b10abSAndroid Build Coastguard Worker##  be found in the AUTHORS file in the root of the source tree.
10*fb1b10abSAndroid Build Coastguard Worker##
11*fb1b10abSAndroid Build Coastguard Worker
12*fb1b10abSAndroid Build Coastguard Workerself=$0
13*fb1b10abSAndroid Build Coastguard Workerself_basename=${self##*/}
14*fb1b10abSAndroid Build Coastguard Workerself_dirname=$(dirname "$0")
15*fb1b10abSAndroid Build Coastguard Worker
16*fb1b10abSAndroid Build Coastguard Worker. "$self_dirname/msvs_common.sh"|| exit 127
17*fb1b10abSAndroid Build Coastguard Worker
18*fb1b10abSAndroid Build Coastguard Workershow_help() {
19*fb1b10abSAndroid Build Coastguard Worker    cat <<EOF
20*fb1b10abSAndroid Build Coastguard WorkerUsage: ${self_basename} --name=projname [options] file1 [file2 ...]
21*fb1b10abSAndroid Build Coastguard Worker
22*fb1b10abSAndroid Build Coastguard WorkerThis script generates a Visual Studio project file from a list of source
23*fb1b10abSAndroid Build Coastguard Workercode files.
24*fb1b10abSAndroid Build Coastguard Worker
25*fb1b10abSAndroid Build Coastguard WorkerOptions:
26*fb1b10abSAndroid Build Coastguard Worker    --help                      Print this message
27*fb1b10abSAndroid Build Coastguard Worker    --exe                       Generate a project for building an Application
28*fb1b10abSAndroid Build Coastguard Worker    --lib                       Generate a project for creating a static library
29*fb1b10abSAndroid Build Coastguard Worker    --dll                       Generate a project for creating a dll
30*fb1b10abSAndroid Build Coastguard Worker    --static-crt                Use the static C runtime (/MT)
31*fb1b10abSAndroid Build Coastguard Worker    --enable-werror             Treat warnings as errors (/WX)
32*fb1b10abSAndroid Build Coastguard Worker    --target=isa-os-cc          Target specifier (required)
33*fb1b10abSAndroid Build Coastguard Worker    --out=filename              Write output to a file [stdout]
34*fb1b10abSAndroid Build Coastguard Worker    --name=project_name         Name of the project (required)
35*fb1b10abSAndroid Build Coastguard Worker    --proj-guid=GUID            GUID to use for the project
36*fb1b10abSAndroid Build Coastguard Worker    --module-def=filename       File containing export definitions (for DLLs)
37*fb1b10abSAndroid Build Coastguard Worker    --ver=version               Version (14-16) of visual studio to generate for
38*fb1b10abSAndroid Build Coastguard Worker    --src-path-bare=dir         Path to root of source tree
39*fb1b10abSAndroid Build Coastguard Worker    -Ipath/to/include           Additional include directories
40*fb1b10abSAndroid Build Coastguard Worker    -DFLAG[=value]              Preprocessor macros to define
41*fb1b10abSAndroid Build Coastguard Worker    -Lpath/to/lib               Additional library search paths
42*fb1b10abSAndroid Build Coastguard Worker    -llibname                   Library to link against
43*fb1b10abSAndroid Build Coastguard WorkerEOF
44*fb1b10abSAndroid Build Coastguard Worker    exit 1
45*fb1b10abSAndroid Build Coastguard Worker}
46*fb1b10abSAndroid Build Coastguard Worker
47*fb1b10abSAndroid Build Coastguard Workertag_content() {
48*fb1b10abSAndroid Build Coastguard Worker    local tag=$1
49*fb1b10abSAndroid Build Coastguard Worker    local content=$2
50*fb1b10abSAndroid Build Coastguard Worker    shift
51*fb1b10abSAndroid Build Coastguard Worker    shift
52*fb1b10abSAndroid Build Coastguard Worker    if [ $# -ne 0 ]; then
53*fb1b10abSAndroid Build Coastguard Worker        echo "${indent}<${tag}"
54*fb1b10abSAndroid Build Coastguard Worker        indent_push
55*fb1b10abSAndroid Build Coastguard Worker        tag_attributes "$@"
56*fb1b10abSAndroid Build Coastguard Worker        echo "${indent}>${content}</${tag}>"
57*fb1b10abSAndroid Build Coastguard Worker        indent_pop
58*fb1b10abSAndroid Build Coastguard Worker    else
59*fb1b10abSAndroid Build Coastguard Worker        echo "${indent}<${tag}>${content}</${tag}>"
60*fb1b10abSAndroid Build Coastguard Worker    fi
61*fb1b10abSAndroid Build Coastguard Worker}
62*fb1b10abSAndroid Build Coastguard Worker
63*fb1b10abSAndroid Build Coastguard Workergenerate_filter() {
64*fb1b10abSAndroid Build Coastguard Worker    local name=$1
65*fb1b10abSAndroid Build Coastguard Worker    local pats=$2
66*fb1b10abSAndroid Build Coastguard Worker    local file_list_sz
67*fb1b10abSAndroid Build Coastguard Worker    local i
68*fb1b10abSAndroid Build Coastguard Worker    local f
69*fb1b10abSAndroid Build Coastguard Worker    local saveIFS="$IFS"
70*fb1b10abSAndroid Build Coastguard Worker    local pack
71*fb1b10abSAndroid Build Coastguard Worker    echo "generating filter '$name' from ${#file_list[@]} files" >&2
72*fb1b10abSAndroid Build Coastguard Worker    IFS=*
73*fb1b10abSAndroid Build Coastguard Worker
74*fb1b10abSAndroid Build Coastguard Worker    file_list_sz=${#file_list[@]}
75*fb1b10abSAndroid Build Coastguard Worker    for i in ${!file_list[@]}; do
76*fb1b10abSAndroid Build Coastguard Worker        f=${file_list[i]}
77*fb1b10abSAndroid Build Coastguard Worker        for pat in ${pats//;/$IFS}; do
78*fb1b10abSAndroid Build Coastguard Worker            if [ "${f##*.}" == "$pat" ]; then
79*fb1b10abSAndroid Build Coastguard Worker                unset file_list[i]
80*fb1b10abSAndroid Build Coastguard Worker
81*fb1b10abSAndroid Build Coastguard Worker                objf=$(echo ${f%.*}.obj \
82*fb1b10abSAndroid Build Coastguard Worker                       | sed -e "s,$src_path_bare,," \
83*fb1b10abSAndroid Build Coastguard Worker                             -e 's/^[\./]\+//g' -e 's,[:/ ],_,g')
84*fb1b10abSAndroid Build Coastguard Worker
85*fb1b10abSAndroid Build Coastguard Worker                if ([ "$pat" == "asm" ] || [ "$pat" == "s" ] || [ "$pat" == "S" ]) && $uses_asm; then
86*fb1b10abSAndroid Build Coastguard Worker                    # Avoid object file name collisions, i.e. vpx_config.c and
87*fb1b10abSAndroid Build Coastguard Worker                    # vpx_config.asm produce the same object file without
88*fb1b10abSAndroid Build Coastguard Worker                    # this additional suffix.
89*fb1b10abSAndroid Build Coastguard Worker                    objf=${objf%.obj}_asm.obj
90*fb1b10abSAndroid Build Coastguard Worker                    open_tag CustomBuild \
91*fb1b10abSAndroid Build Coastguard Worker                        Include="$f"
92*fb1b10abSAndroid Build Coastguard Worker                    for plat in "${platforms[@]}"; do
93*fb1b10abSAndroid Build Coastguard Worker                        for cfg in Debug Release; do
94*fb1b10abSAndroid Build Coastguard Worker                            tag_content Message "Assembling %(Filename)%(Extension)" \
95*fb1b10abSAndroid Build Coastguard Worker                                Condition="'\$(Configuration)|\$(Platform)'=='$cfg|$plat'"
96*fb1b10abSAndroid Build Coastguard Worker                            tag_content Command "$(eval echo \$asm_${cfg}_cmdline) -o \$(IntDir)$objf" \
97*fb1b10abSAndroid Build Coastguard Worker                                Condition="'\$(Configuration)|\$(Platform)'=='$cfg|$plat'"
98*fb1b10abSAndroid Build Coastguard Worker                            tag_content Outputs "\$(IntDir)$objf" \
99*fb1b10abSAndroid Build Coastguard Worker                                Condition="'\$(Configuration)|\$(Platform)'=='$cfg|$plat'"
100*fb1b10abSAndroid Build Coastguard Worker                        done
101*fb1b10abSAndroid Build Coastguard Worker                    done
102*fb1b10abSAndroid Build Coastguard Worker                    close_tag CustomBuild
103*fb1b10abSAndroid Build Coastguard Worker                elif [ "$pat" == "c" ] || \
104*fb1b10abSAndroid Build Coastguard Worker                     [ "$pat" == "cc" ] || [ "$pat" == "cpp" ]; then
105*fb1b10abSAndroid Build Coastguard Worker                    open_tag ClCompile \
106*fb1b10abSAndroid Build Coastguard Worker                        Include="$f"
107*fb1b10abSAndroid Build Coastguard Worker                    # Separate file names with Condition?
108*fb1b10abSAndroid Build Coastguard Worker                    tag_content ObjectFileName "\$(IntDir)$objf"
109*fb1b10abSAndroid Build Coastguard Worker                    # Check for AVX and turn it on to avoid warnings.
110*fb1b10abSAndroid Build Coastguard Worker                    if [[ $f =~ avx.?\.c$ ]]; then
111*fb1b10abSAndroid Build Coastguard Worker                        tag_content AdditionalOptions "/arch:AVX"
112*fb1b10abSAndroid Build Coastguard Worker                    fi
113*fb1b10abSAndroid Build Coastguard Worker                    close_tag ClCompile
114*fb1b10abSAndroid Build Coastguard Worker                elif [ "$pat" == "h" ] ; then
115*fb1b10abSAndroid Build Coastguard Worker                    tag ClInclude \
116*fb1b10abSAndroid Build Coastguard Worker                        Include="$f"
117*fb1b10abSAndroid Build Coastguard Worker                elif [ "$pat" == "vcxproj" ] ; then
118*fb1b10abSAndroid Build Coastguard Worker                    open_tag ProjectReference \
119*fb1b10abSAndroid Build Coastguard Worker                        Include="$f"
120*fb1b10abSAndroid Build Coastguard Worker                    depguid=`grep ProjectGuid "$f" | sed 's,.*<.*>\(.*\)</.*>.*,\1,'`
121*fb1b10abSAndroid Build Coastguard Worker                    tag_content Project "$depguid"
122*fb1b10abSAndroid Build Coastguard Worker                    tag_content ReferenceOutputAssembly false
123*fb1b10abSAndroid Build Coastguard Worker                    close_tag ProjectReference
124*fb1b10abSAndroid Build Coastguard Worker                else
125*fb1b10abSAndroid Build Coastguard Worker                    tag None \
126*fb1b10abSAndroid Build Coastguard Worker                        Include="$f"
127*fb1b10abSAndroid Build Coastguard Worker                fi
128*fb1b10abSAndroid Build Coastguard Worker
129*fb1b10abSAndroid Build Coastguard Worker                break
130*fb1b10abSAndroid Build Coastguard Worker            fi
131*fb1b10abSAndroid Build Coastguard Worker        done
132*fb1b10abSAndroid Build Coastguard Worker    done
133*fb1b10abSAndroid Build Coastguard Worker
134*fb1b10abSAndroid Build Coastguard Worker    IFS="$saveIFS"
135*fb1b10abSAndroid Build Coastguard Worker}
136*fb1b10abSAndroid Build Coastguard Worker
137*fb1b10abSAndroid Build Coastguard Worker# Process command line
138*fb1b10abSAndroid Build Coastguard Workerunset target
139*fb1b10abSAndroid Build Coastguard Workerfor opt in "$@"; do
140*fb1b10abSAndroid Build Coastguard Worker    optval="${opt#*=}"
141*fb1b10abSAndroid Build Coastguard Worker    case "$opt" in
142*fb1b10abSAndroid Build Coastguard Worker        --help|-h) show_help
143*fb1b10abSAndroid Build Coastguard Worker        ;;
144*fb1b10abSAndroid Build Coastguard Worker        --target=*)
145*fb1b10abSAndroid Build Coastguard Worker            target="${optval}"
146*fb1b10abSAndroid Build Coastguard Worker            platform_toolset=$(echo ${target} | awk 'BEGIN{FS="-"}{print $4}')
147*fb1b10abSAndroid Build Coastguard Worker            case "$platform_toolset" in
148*fb1b10abSAndroid Build Coastguard Worker                clangcl) platform_toolset="ClangCl"
149*fb1b10abSAndroid Build Coastguard Worker                ;;
150*fb1b10abSAndroid Build Coastguard Worker                "")
151*fb1b10abSAndroid Build Coastguard Worker                ;;
152*fb1b10abSAndroid Build Coastguard Worker                *) die Unrecognized Visual Studio Platform Toolset in $opt
153*fb1b10abSAndroid Build Coastguard Worker                ;;
154*fb1b10abSAndroid Build Coastguard Worker            esac
155*fb1b10abSAndroid Build Coastguard Worker        ;;
156*fb1b10abSAndroid Build Coastguard Worker        --out=*) outfile="$optval"
157*fb1b10abSAndroid Build Coastguard Worker        ;;
158*fb1b10abSAndroid Build Coastguard Worker        --name=*) name="${optval}"
159*fb1b10abSAndroid Build Coastguard Worker        ;;
160*fb1b10abSAndroid Build Coastguard Worker        --proj-guid=*) guid="${optval}"
161*fb1b10abSAndroid Build Coastguard Worker        ;;
162*fb1b10abSAndroid Build Coastguard Worker        --module-def=*) module_def="${optval}"
163*fb1b10abSAndroid Build Coastguard Worker        ;;
164*fb1b10abSAndroid Build Coastguard Worker        --exe) proj_kind="exe"
165*fb1b10abSAndroid Build Coastguard Worker        ;;
166*fb1b10abSAndroid Build Coastguard Worker        --dll) proj_kind="dll"
167*fb1b10abSAndroid Build Coastguard Worker        ;;
168*fb1b10abSAndroid Build Coastguard Worker        --lib) proj_kind="lib"
169*fb1b10abSAndroid Build Coastguard Worker        ;;
170*fb1b10abSAndroid Build Coastguard Worker        --as=*) as="${optval}"
171*fb1b10abSAndroid Build Coastguard Worker        ;;
172*fb1b10abSAndroid Build Coastguard Worker        --src-path-bare=*)
173*fb1b10abSAndroid Build Coastguard Worker            src_path_bare=$(fix_path "$optval")
174*fb1b10abSAndroid Build Coastguard Worker            src_path_bare=${src_path_bare%/}
175*fb1b10abSAndroid Build Coastguard Worker        ;;
176*fb1b10abSAndroid Build Coastguard Worker        --static-crt) use_static_runtime=true
177*fb1b10abSAndroid Build Coastguard Worker        ;;
178*fb1b10abSAndroid Build Coastguard Worker        --enable-werror) werror=true
179*fb1b10abSAndroid Build Coastguard Worker        ;;
180*fb1b10abSAndroid Build Coastguard Worker        --ver=*)
181*fb1b10abSAndroid Build Coastguard Worker            vs_ver="$optval"
182*fb1b10abSAndroid Build Coastguard Worker            case "$optval" in
183*fb1b10abSAndroid Build Coastguard Worker                1[4-7])
184*fb1b10abSAndroid Build Coastguard Worker                ;;
185*fb1b10abSAndroid Build Coastguard Worker                *) die Unrecognized Visual Studio Version in $opt
186*fb1b10abSAndroid Build Coastguard Worker                ;;
187*fb1b10abSAndroid Build Coastguard Worker            esac
188*fb1b10abSAndroid Build Coastguard Worker        ;;
189*fb1b10abSAndroid Build Coastguard Worker        -I*)
190*fb1b10abSAndroid Build Coastguard Worker            opt=${opt##-I}
191*fb1b10abSAndroid Build Coastguard Worker            opt=$(fix_path "$opt")
192*fb1b10abSAndroid Build Coastguard Worker            opt="${opt%/}"
193*fb1b10abSAndroid Build Coastguard Worker            incs="${incs}${incs:+;}&quot;${opt}&quot;"
194*fb1b10abSAndroid Build Coastguard Worker            yasmincs="${yasmincs} -I&quot;${opt}&quot;"
195*fb1b10abSAndroid Build Coastguard Worker        ;;
196*fb1b10abSAndroid Build Coastguard Worker        -D*) defines="${defines}${defines:+;}${opt##-D}"
197*fb1b10abSAndroid Build Coastguard Worker        ;;
198*fb1b10abSAndroid Build Coastguard Worker        -L*) # fudge . to $(OutDir)
199*fb1b10abSAndroid Build Coastguard Worker            if [ "${opt##-L}" == "." ]; then
200*fb1b10abSAndroid Build Coastguard Worker                libdirs="${libdirs}${libdirs:+;}&quot;\$(OutDir)&quot;"
201*fb1b10abSAndroid Build Coastguard Worker            else
202*fb1b10abSAndroid Build Coastguard Worker                 # Also try directories for this platform/configuration
203*fb1b10abSAndroid Build Coastguard Worker                 opt=${opt##-L}
204*fb1b10abSAndroid Build Coastguard Worker                 opt=$(fix_path "$opt")
205*fb1b10abSAndroid Build Coastguard Worker                 libdirs="${libdirs}${libdirs:+;}&quot;${opt}&quot;"
206*fb1b10abSAndroid Build Coastguard Worker                 libdirs="${libdirs}${libdirs:+;}&quot;${opt}/\$(PlatformName)/\$(Configuration)&quot;"
207*fb1b10abSAndroid Build Coastguard Worker                 libdirs="${libdirs}${libdirs:+;}&quot;${opt}/\$(PlatformName)&quot;"
208*fb1b10abSAndroid Build Coastguard Worker            fi
209*fb1b10abSAndroid Build Coastguard Worker        ;;
210*fb1b10abSAndroid Build Coastguard Worker        -l*) libs="${libs}${libs:+ }${opt##-l}.lib"
211*fb1b10abSAndroid Build Coastguard Worker        ;;
212*fb1b10abSAndroid Build Coastguard Worker        -*) die_unknown $opt
213*fb1b10abSAndroid Build Coastguard Worker        ;;
214*fb1b10abSAndroid Build Coastguard Worker        *)
215*fb1b10abSAndroid Build Coastguard Worker            # The paths in file_list are fixed outside of the loop.
216*fb1b10abSAndroid Build Coastguard Worker            file_list[${#file_list[@]}]="$opt"
217*fb1b10abSAndroid Build Coastguard Worker            case "$opt" in
218*fb1b10abSAndroid Build Coastguard Worker                 *.asm|*.[Ss]) uses_asm=true
219*fb1b10abSAndroid Build Coastguard Worker                 ;;
220*fb1b10abSAndroid Build Coastguard Worker            esac
221*fb1b10abSAndroid Build Coastguard Worker        ;;
222*fb1b10abSAndroid Build Coastguard Worker    esac
223*fb1b10abSAndroid Build Coastguard Workerdone
224*fb1b10abSAndroid Build Coastguard Worker
225*fb1b10abSAndroid Build Coastguard Worker# Make one call to fix_path for file_list to improve performance.
226*fb1b10abSAndroid Build Coastguard Workerfix_file_list file_list
227*fb1b10abSAndroid Build Coastguard Worker
228*fb1b10abSAndroid Build Coastguard Workeroutfile=${outfile:-/dev/stdout}
229*fb1b10abSAndroid Build Coastguard Workerguid=${guid:-`generate_uuid`}
230*fb1b10abSAndroid Build Coastguard Workeruses_asm=${uses_asm:-false}
231*fb1b10abSAndroid Build Coastguard Worker
232*fb1b10abSAndroid Build Coastguard Worker[ -n "$name" ] || die "Project name (--name) must be specified!"
233*fb1b10abSAndroid Build Coastguard Worker[ -n "$target" ] || die "Target (--target) must be specified!"
234*fb1b10abSAndroid Build Coastguard Worker
235*fb1b10abSAndroid Build Coastguard Workerif ${use_static_runtime:-false}; then
236*fb1b10abSAndroid Build Coastguard Worker    release_runtime=MultiThreaded
237*fb1b10abSAndroid Build Coastguard Worker    debug_runtime=MultiThreadedDebug
238*fb1b10abSAndroid Build Coastguard Worker    lib_sfx=mt
239*fb1b10abSAndroid Build Coastguard Workerelse
240*fb1b10abSAndroid Build Coastguard Worker    release_runtime=MultiThreadedDLL
241*fb1b10abSAndroid Build Coastguard Worker    debug_runtime=MultiThreadedDebugDLL
242*fb1b10abSAndroid Build Coastguard Worker    lib_sfx=md
243*fb1b10abSAndroid Build Coastguard Workerfi
244*fb1b10abSAndroid Build Coastguard Worker
245*fb1b10abSAndroid Build Coastguard Worker# Calculate debug lib names: If a lib ends in ${lib_sfx}.lib, then rename
246*fb1b10abSAndroid Build Coastguard Worker# it to ${lib_sfx}d.lib. This precludes linking to release libs from a
247*fb1b10abSAndroid Build Coastguard Worker# debug exe, so this may need to be refactored later.
248*fb1b10abSAndroid Build Coastguard Workerfor lib in ${libs}; do
249*fb1b10abSAndroid Build Coastguard Worker    if [ "$lib" != "${lib%${lib_sfx}.lib}" ]; then
250*fb1b10abSAndroid Build Coastguard Worker        lib=${lib%.lib}d.lib
251*fb1b10abSAndroid Build Coastguard Worker    fi
252*fb1b10abSAndroid Build Coastguard Worker    debug_libs="${debug_libs}${debug_libs:+ }${lib}"
253*fb1b10abSAndroid Build Coastguard Workerdone
254*fb1b10abSAndroid Build Coastguard Workerdebug_libs=${debug_libs// /;}
255*fb1b10abSAndroid Build Coastguard Workerlibs=${libs// /;}
256*fb1b10abSAndroid Build Coastguard Worker
257*fb1b10abSAndroid Build Coastguard Worker
258*fb1b10abSAndroid Build Coastguard Worker# List of all platforms supported for this target
259*fb1b10abSAndroid Build Coastguard Workercase "$target" in
260*fb1b10abSAndroid Build Coastguard Worker    x86_64*)
261*fb1b10abSAndroid Build Coastguard Worker        platforms[0]="x64"
262*fb1b10abSAndroid Build Coastguard Worker        asm_Debug_cmdline="${as} -Xvc -gcv8 -f win64 ${yasmincs} &quot;%(FullPath)&quot;"
263*fb1b10abSAndroid Build Coastguard Worker        asm_Release_cmdline="${as} -Xvc -f win64 ${yasmincs} &quot;%(FullPath)&quot;"
264*fb1b10abSAndroid Build Coastguard Worker    ;;
265*fb1b10abSAndroid Build Coastguard Worker    x86*)
266*fb1b10abSAndroid Build Coastguard Worker        platforms[0]="Win32"
267*fb1b10abSAndroid Build Coastguard Worker        asm_Debug_cmdline="${as} -Xvc -gcv8 -f win32 ${yasmincs} &quot;%(FullPath)&quot;"
268*fb1b10abSAndroid Build Coastguard Worker        asm_Release_cmdline="${as} -Xvc -f win32 ${yasmincs} &quot;%(FullPath)&quot;"
269*fb1b10abSAndroid Build Coastguard Worker    ;;
270*fb1b10abSAndroid Build Coastguard Worker    arm64*)
271*fb1b10abSAndroid Build Coastguard Worker        platforms[0]="ARM64"
272*fb1b10abSAndroid Build Coastguard Worker        # As of Visual Studio 2022 17.5.5, clang-cl does not support ARM64EC.
273*fb1b10abSAndroid Build Coastguard Worker        if [ "$vs_ver" -ge 17 -a "$platform_toolset" != "ClangCl" ]; then
274*fb1b10abSAndroid Build Coastguard Worker            platforms[1]="ARM64EC"
275*fb1b10abSAndroid Build Coastguard Worker        fi
276*fb1b10abSAndroid Build Coastguard Worker        asm_Debug_cmdline="armasm64 -nologo -oldit &quot;%(FullPath)&quot;"
277*fb1b10abSAndroid Build Coastguard Worker        asm_Release_cmdline="armasm64 -nologo -oldit &quot;%(FullPath)&quot;"
278*fb1b10abSAndroid Build Coastguard Worker    ;;
279*fb1b10abSAndroid Build Coastguard Worker    arm*)
280*fb1b10abSAndroid Build Coastguard Worker        platforms[0]="ARM"
281*fb1b10abSAndroid Build Coastguard Worker        asm_Debug_cmdline="armasm -nologo -oldit &quot;%(FullPath)&quot;"
282*fb1b10abSAndroid Build Coastguard Worker        asm_Release_cmdline="armasm -nologo -oldit &quot;%(FullPath)&quot;"
283*fb1b10abSAndroid Build Coastguard Worker    ;;
284*fb1b10abSAndroid Build Coastguard Worker    *) die "Unsupported target $target!"
285*fb1b10abSAndroid Build Coastguard Worker    ;;
286*fb1b10abSAndroid Build Coastguard Workeresac
287*fb1b10abSAndroid Build Coastguard Worker
288*fb1b10abSAndroid Build Coastguard Workergenerate_vcxproj() {
289*fb1b10abSAndroid Build Coastguard Worker    echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
290*fb1b10abSAndroid Build Coastguard Worker    open_tag Project \
291*fb1b10abSAndroid Build Coastguard Worker        DefaultTargets="Build" \
292*fb1b10abSAndroid Build Coastguard Worker        ToolsVersion="4.0" \
293*fb1b10abSAndroid Build Coastguard Worker        xmlns="http://schemas.microsoft.com/developer/msbuild/2003" \
294*fb1b10abSAndroid Build Coastguard Worker
295*fb1b10abSAndroid Build Coastguard Worker    open_tag ItemGroup \
296*fb1b10abSAndroid Build Coastguard Worker        Label="ProjectConfigurations"
297*fb1b10abSAndroid Build Coastguard Worker    for plat in "${platforms[@]}"; do
298*fb1b10abSAndroid Build Coastguard Worker        for config in Debug Release; do
299*fb1b10abSAndroid Build Coastguard Worker            open_tag ProjectConfiguration \
300*fb1b10abSAndroid Build Coastguard Worker                Include="$config|$plat"
301*fb1b10abSAndroid Build Coastguard Worker            tag_content Configuration $config
302*fb1b10abSAndroid Build Coastguard Worker            tag_content Platform $plat
303*fb1b10abSAndroid Build Coastguard Worker            close_tag ProjectConfiguration
304*fb1b10abSAndroid Build Coastguard Worker        done
305*fb1b10abSAndroid Build Coastguard Worker    done
306*fb1b10abSAndroid Build Coastguard Worker    close_tag ItemGroup
307*fb1b10abSAndroid Build Coastguard Worker
308*fb1b10abSAndroid Build Coastguard Worker    open_tag PropertyGroup \
309*fb1b10abSAndroid Build Coastguard Worker        Label="Globals"
310*fb1b10abSAndroid Build Coastguard Worker        tag_content ProjectGuid "{${guid}}"
311*fb1b10abSAndroid Build Coastguard Worker        tag_content RootNamespace ${name}
312*fb1b10abSAndroid Build Coastguard Worker        tag_content Keyword ManagedCProj
313*fb1b10abSAndroid Build Coastguard Worker        if [ $vs_ver -ge 12 ] && [ "${platforms[0]}" = "ARM" ]; then
314*fb1b10abSAndroid Build Coastguard Worker            tag_content AppContainerApplication true
315*fb1b10abSAndroid Build Coastguard Worker            # The application type can be one of "Windows Store",
316*fb1b10abSAndroid Build Coastguard Worker            # "Windows Phone" or "Windows Phone Silverlight". The
317*fb1b10abSAndroid Build Coastguard Worker            # actual value doesn't matter from the libvpx point of view,
318*fb1b10abSAndroid Build Coastguard Worker            # since a static library built for one works on the others.
319*fb1b10abSAndroid Build Coastguard Worker            # The PlatformToolset field needs to be set in sync with this;
320*fb1b10abSAndroid Build Coastguard Worker            # for Windows Store and Windows Phone Silverlight it should be
321*fb1b10abSAndroid Build Coastguard Worker            # v120 while it should be v120_wp81 if the type is Windows Phone.
322*fb1b10abSAndroid Build Coastguard Worker            tag_content ApplicationType "Windows Store"
323*fb1b10abSAndroid Build Coastguard Worker            tag_content ApplicationTypeRevision 8.1
324*fb1b10abSAndroid Build Coastguard Worker        fi
325*fb1b10abSAndroid Build Coastguard Worker        if [ "${platforms[0]}" = "ARM64" ]; then
326*fb1b10abSAndroid Build Coastguard Worker            # Require the first Visual Studio version to have ARM64 support.
327*fb1b10abSAndroid Build Coastguard Worker            tag_content MinimumVisualStudioVersion 15.9
328*fb1b10abSAndroid Build Coastguard Worker        fi
329*fb1b10abSAndroid Build Coastguard Worker        if [ $vs_ver -eq 15 ] && [ "${platforms[0]}" = "ARM64" ]; then
330*fb1b10abSAndroid Build Coastguard Worker            # Since VS 15 does not have a 'use latest SDK version' facility,
331*fb1b10abSAndroid Build Coastguard Worker            # specifically require the contemporaneous SDK with official ARM64
332*fb1b10abSAndroid Build Coastguard Worker            # support.
333*fb1b10abSAndroid Build Coastguard Worker            tag_content WindowsTargetPlatformVersion 10.0.17763.0
334*fb1b10abSAndroid Build Coastguard Worker        fi
335*fb1b10abSAndroid Build Coastguard Worker    close_tag PropertyGroup
336*fb1b10abSAndroid Build Coastguard Worker
337*fb1b10abSAndroid Build Coastguard Worker    tag Import \
338*fb1b10abSAndroid Build Coastguard Worker        Project="\$(VCTargetsPath)\\Microsoft.Cpp.Default.props"
339*fb1b10abSAndroid Build Coastguard Worker
340*fb1b10abSAndroid Build Coastguard Worker    for plat in "${platforms[@]}"; do
341*fb1b10abSAndroid Build Coastguard Worker        for config in Release Debug; do
342*fb1b10abSAndroid Build Coastguard Worker            open_tag PropertyGroup \
343*fb1b10abSAndroid Build Coastguard Worker                Condition="'\$(Configuration)|\$(Platform)'=='$config|$plat'" \
344*fb1b10abSAndroid Build Coastguard Worker                Label="Configuration"
345*fb1b10abSAndroid Build Coastguard Worker            if [ "$proj_kind" = "exe" ]; then
346*fb1b10abSAndroid Build Coastguard Worker                tag_content ConfigurationType Application
347*fb1b10abSAndroid Build Coastguard Worker            elif [ "$proj_kind" = "dll" ]; then
348*fb1b10abSAndroid Build Coastguard Worker                tag_content ConfigurationType DynamicLibrary
349*fb1b10abSAndroid Build Coastguard Worker            else
350*fb1b10abSAndroid Build Coastguard Worker                tag_content ConfigurationType StaticLibrary
351*fb1b10abSAndroid Build Coastguard Worker            fi
352*fb1b10abSAndroid Build Coastguard Worker            if [ -n "$platform_toolset" ]; then
353*fb1b10abSAndroid Build Coastguard Worker                tag_content PlatformToolset "$platform_toolset"
354*fb1b10abSAndroid Build Coastguard Worker            else
355*fb1b10abSAndroid Build Coastguard Worker                if [ "$vs_ver" = "14" ]; then
356*fb1b10abSAndroid Build Coastguard Worker                    tag_content PlatformToolset v140
357*fb1b10abSAndroid Build Coastguard Worker                fi
358*fb1b10abSAndroid Build Coastguard Worker                if [ "$vs_ver" = "15" ]; then
359*fb1b10abSAndroid Build Coastguard Worker                    tag_content PlatformToolset v141
360*fb1b10abSAndroid Build Coastguard Worker                fi
361*fb1b10abSAndroid Build Coastguard Worker                if [ "$vs_ver" = "16" ]; then
362*fb1b10abSAndroid Build Coastguard Worker                    tag_content PlatformToolset v142
363*fb1b10abSAndroid Build Coastguard Worker                fi
364*fb1b10abSAndroid Build Coastguard Worker                if [ "$vs_ver" = "17" ]; then
365*fb1b10abSAndroid Build Coastguard Worker                    tag_content PlatformToolset v143
366*fb1b10abSAndroid Build Coastguard Worker                fi
367*fb1b10abSAndroid Build Coastguard Worker            fi
368*fb1b10abSAndroid Build Coastguard Worker            tag_content CharacterSet Unicode
369*fb1b10abSAndroid Build Coastguard Worker            if [ "$config" = "Release" ]; then
370*fb1b10abSAndroid Build Coastguard Worker                tag_content WholeProgramOptimization true
371*fb1b10abSAndroid Build Coastguard Worker            fi
372*fb1b10abSAndroid Build Coastguard Worker            close_tag PropertyGroup
373*fb1b10abSAndroid Build Coastguard Worker        done
374*fb1b10abSAndroid Build Coastguard Worker    done
375*fb1b10abSAndroid Build Coastguard Worker
376*fb1b10abSAndroid Build Coastguard Worker    tag Import \
377*fb1b10abSAndroid Build Coastguard Worker        Project="\$(VCTargetsPath)\\Microsoft.Cpp.props"
378*fb1b10abSAndroid Build Coastguard Worker
379*fb1b10abSAndroid Build Coastguard Worker    open_tag ImportGroup \
380*fb1b10abSAndroid Build Coastguard Worker        Label="PropertySheets"
381*fb1b10abSAndroid Build Coastguard Worker        tag Import \
382*fb1b10abSAndroid Build Coastguard Worker            Project="\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props" \
383*fb1b10abSAndroid Build Coastguard Worker            Condition="exists('\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props')" \
384*fb1b10abSAndroid Build Coastguard Worker            Label="LocalAppDataPlatform"
385*fb1b10abSAndroid Build Coastguard Worker    close_tag ImportGroup
386*fb1b10abSAndroid Build Coastguard Worker
387*fb1b10abSAndroid Build Coastguard Worker    tag PropertyGroup \
388*fb1b10abSAndroid Build Coastguard Worker        Label="UserMacros"
389*fb1b10abSAndroid Build Coastguard Worker
390*fb1b10abSAndroid Build Coastguard Worker    for plat in "${platforms[@]}"; do
391*fb1b10abSAndroid Build Coastguard Worker        plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'`
392*fb1b10abSAndroid Build Coastguard Worker        for config in Debug Release; do
393*fb1b10abSAndroid Build Coastguard Worker            open_tag PropertyGroup \
394*fb1b10abSAndroid Build Coastguard Worker                Condition="'\$(Configuration)|\$(Platform)'=='$config|$plat'"
395*fb1b10abSAndroid Build Coastguard Worker            tag_content OutDir "\$(SolutionDir)$plat_no_ws\\\$(Configuration)\\"
396*fb1b10abSAndroid Build Coastguard Worker            tag_content IntDir "$plat_no_ws\\\$(Configuration)\\${name}\\"
397*fb1b10abSAndroid Build Coastguard Worker            if [ "$proj_kind" == "lib" ]; then
398*fb1b10abSAndroid Build Coastguard Worker              if [ "$config" == "Debug" ]; then
399*fb1b10abSAndroid Build Coastguard Worker                config_suffix=d
400*fb1b10abSAndroid Build Coastguard Worker              else
401*fb1b10abSAndroid Build Coastguard Worker                config_suffix=""
402*fb1b10abSAndroid Build Coastguard Worker              fi
403*fb1b10abSAndroid Build Coastguard Worker              tag_content TargetName "${name}${lib_sfx}${config_suffix}"
404*fb1b10abSAndroid Build Coastguard Worker            fi
405*fb1b10abSAndroid Build Coastguard Worker            close_tag PropertyGroup
406*fb1b10abSAndroid Build Coastguard Worker        done
407*fb1b10abSAndroid Build Coastguard Worker    done
408*fb1b10abSAndroid Build Coastguard Worker
409*fb1b10abSAndroid Build Coastguard Worker    for plat in "${platforms[@]}"; do
410*fb1b10abSAndroid Build Coastguard Worker        for config in Debug Release; do
411*fb1b10abSAndroid Build Coastguard Worker            open_tag ItemDefinitionGroup \
412*fb1b10abSAndroid Build Coastguard Worker                Condition="'\$(Configuration)|\$(Platform)'=='$config|$plat'"
413*fb1b10abSAndroid Build Coastguard Worker            if [ "$name" == "vpx" ]; then
414*fb1b10abSAndroid Build Coastguard Worker                hostplat=$plat
415*fb1b10abSAndroid Build Coastguard Worker                if [ "$hostplat" == "ARM" ]; then
416*fb1b10abSAndroid Build Coastguard Worker                    hostplat=Win32
417*fb1b10abSAndroid Build Coastguard Worker                fi
418*fb1b10abSAndroid Build Coastguard Worker            fi
419*fb1b10abSAndroid Build Coastguard Worker            open_tag ClCompile
420*fb1b10abSAndroid Build Coastguard Worker            if [ "$config" = "Debug" ]; then
421*fb1b10abSAndroid Build Coastguard Worker                opt=Disabled
422*fb1b10abSAndroid Build Coastguard Worker                runtime=$debug_runtime
423*fb1b10abSAndroid Build Coastguard Worker                curlibs=$debug_libs
424*fb1b10abSAndroid Build Coastguard Worker                debug=_DEBUG
425*fb1b10abSAndroid Build Coastguard Worker            else
426*fb1b10abSAndroid Build Coastguard Worker                opt=MaxSpeed
427*fb1b10abSAndroid Build Coastguard Worker                runtime=$release_runtime
428*fb1b10abSAndroid Build Coastguard Worker                curlibs=$libs
429*fb1b10abSAndroid Build Coastguard Worker                tag_content FavorSizeOrSpeed Speed
430*fb1b10abSAndroid Build Coastguard Worker                debug=NDEBUG
431*fb1b10abSAndroid Build Coastguard Worker            fi
432*fb1b10abSAndroid Build Coastguard Worker            extradefines=";$defines"
433*fb1b10abSAndroid Build Coastguard Worker            tag_content Optimization $opt
434*fb1b10abSAndroid Build Coastguard Worker            tag_content AdditionalIncludeDirectories "$incs;%(AdditionalIncludeDirectories)"
435*fb1b10abSAndroid Build Coastguard Worker            tag_content PreprocessorDefinitions "WIN32;$debug;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE$extradefines;%(PreprocessorDefinitions)"
436*fb1b10abSAndroid Build Coastguard Worker            tag_content RuntimeLibrary $runtime
437*fb1b10abSAndroid Build Coastguard Worker            tag_content WarningLevel Level3
438*fb1b10abSAndroid Build Coastguard Worker            if ${werror:-false}; then
439*fb1b10abSAndroid Build Coastguard Worker                tag_content TreatWarningAsError true
440*fb1b10abSAndroid Build Coastguard Worker            fi
441*fb1b10abSAndroid Build Coastguard Worker            if [ $vs_ver -ge 11 ]; then
442*fb1b10abSAndroid Build Coastguard Worker                # We need to override the defaults for these settings
443*fb1b10abSAndroid Build Coastguard Worker                # if AppContainerApplication is set.
444*fb1b10abSAndroid Build Coastguard Worker                tag_content CompileAsWinRT false
445*fb1b10abSAndroid Build Coastguard Worker                tag_content PrecompiledHeader NotUsing
446*fb1b10abSAndroid Build Coastguard Worker                tag_content SDLCheck false
447*fb1b10abSAndroid Build Coastguard Worker            fi
448*fb1b10abSAndroid Build Coastguard Worker            close_tag ClCompile
449*fb1b10abSAndroid Build Coastguard Worker            case "$proj_kind" in
450*fb1b10abSAndroid Build Coastguard Worker            exe)
451*fb1b10abSAndroid Build Coastguard Worker                open_tag Link
452*fb1b10abSAndroid Build Coastguard Worker                tag_content GenerateDebugInformation true
453*fb1b10abSAndroid Build Coastguard Worker                # Console is the default normally, but if
454*fb1b10abSAndroid Build Coastguard Worker                # AppContainerApplication is set, we need to override it.
455*fb1b10abSAndroid Build Coastguard Worker                tag_content SubSystem Console
456*fb1b10abSAndroid Build Coastguard Worker                close_tag Link
457*fb1b10abSAndroid Build Coastguard Worker                ;;
458*fb1b10abSAndroid Build Coastguard Worker            dll)
459*fb1b10abSAndroid Build Coastguard Worker                open_tag Link
460*fb1b10abSAndroid Build Coastguard Worker                tag_content GenerateDebugInformation true
461*fb1b10abSAndroid Build Coastguard Worker                tag_content ModuleDefinitionFile $module_def
462*fb1b10abSAndroid Build Coastguard Worker                close_tag Link
463*fb1b10abSAndroid Build Coastguard Worker                ;;
464*fb1b10abSAndroid Build Coastguard Worker            lib)
465*fb1b10abSAndroid Build Coastguard Worker                ;;
466*fb1b10abSAndroid Build Coastguard Worker            esac
467*fb1b10abSAndroid Build Coastguard Worker            close_tag ItemDefinitionGroup
468*fb1b10abSAndroid Build Coastguard Worker        done
469*fb1b10abSAndroid Build Coastguard Worker
470*fb1b10abSAndroid Build Coastguard Worker    done
471*fb1b10abSAndroid Build Coastguard Worker
472*fb1b10abSAndroid Build Coastguard Worker    open_tag ItemGroup
473*fb1b10abSAndroid Build Coastguard Worker    generate_filter "Source Files"   "c;cc;cpp;def;odl;idl;hpj;bat;asm;asmx;s;S"
474*fb1b10abSAndroid Build Coastguard Worker    close_tag ItemGroup
475*fb1b10abSAndroid Build Coastguard Worker    open_tag ItemGroup
476*fb1b10abSAndroid Build Coastguard Worker    generate_filter "Header Files"   "h;hm;inl;inc;xsd"
477*fb1b10abSAndroid Build Coastguard Worker    close_tag ItemGroup
478*fb1b10abSAndroid Build Coastguard Worker    open_tag ItemGroup
479*fb1b10abSAndroid Build Coastguard Worker    generate_filter "Build Files"    "mk"
480*fb1b10abSAndroid Build Coastguard Worker    close_tag ItemGroup
481*fb1b10abSAndroid Build Coastguard Worker    open_tag ItemGroup
482*fb1b10abSAndroid Build Coastguard Worker    generate_filter "References"     "vcxproj"
483*fb1b10abSAndroid Build Coastguard Worker    close_tag ItemGroup
484*fb1b10abSAndroid Build Coastguard Worker
485*fb1b10abSAndroid Build Coastguard Worker    tag Import \
486*fb1b10abSAndroid Build Coastguard Worker        Project="\$(VCTargetsPath)\\Microsoft.Cpp.targets"
487*fb1b10abSAndroid Build Coastguard Worker
488*fb1b10abSAndroid Build Coastguard Worker    open_tag ImportGroup \
489*fb1b10abSAndroid Build Coastguard Worker        Label="ExtensionTargets"
490*fb1b10abSAndroid Build Coastguard Worker    close_tag ImportGroup
491*fb1b10abSAndroid Build Coastguard Worker
492*fb1b10abSAndroid Build Coastguard Worker    close_tag Project
493*fb1b10abSAndroid Build Coastguard Worker
494*fb1b10abSAndroid Build Coastguard Worker    # This must be done from within the {} subshell
495*fb1b10abSAndroid Build Coastguard Worker    echo "Ignored files list (${#file_list[@]} items) is:" >&2
496*fb1b10abSAndroid Build Coastguard Worker    for f in "${file_list[@]}"; do
497*fb1b10abSAndroid Build Coastguard Worker        echo "    $f" >&2
498*fb1b10abSAndroid Build Coastguard Worker    done
499*fb1b10abSAndroid Build Coastguard Worker}
500*fb1b10abSAndroid Build Coastguard Worker
501*fb1b10abSAndroid Build Coastguard Worker# This regexp doesn't catch most of the strings in the vcxproj format,
502*fb1b10abSAndroid Build Coastguard Worker# since they're like <tag>path</tag> instead of <tag attr="path" />
503*fb1b10abSAndroid Build Coastguard Worker# as previously. It still seems to work ok despite this.
504*fb1b10abSAndroid Build Coastguard Workergenerate_vcxproj |
505*fb1b10abSAndroid Build Coastguard Worker    sed  -e '/"/s;\([^ "]\)/;\1\\;g' |
506*fb1b10abSAndroid Build Coastguard Worker    sed  -e '/xmlns/s;\\;/;g' > ${outfile}
507*fb1b10abSAndroid Build Coastguard Worker
508*fb1b10abSAndroid Build Coastguard Workerexit
509