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:+;}"${opt}"" 194*fb1b10abSAndroid Build Coastguard Worker yasmincs="${yasmincs} -I"${opt}"" 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:+;}"\$(OutDir)"" 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:+;}"${opt}"" 206*fb1b10abSAndroid Build Coastguard Worker libdirs="${libdirs}${libdirs:+;}"${opt}/\$(PlatformName)/\$(Configuration)"" 207*fb1b10abSAndroid Build Coastguard Worker libdirs="${libdirs}${libdirs:+;}"${opt}/\$(PlatformName)"" 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} "%(FullPath)"" 263*fb1b10abSAndroid Build Coastguard Worker asm_Release_cmdline="${as} -Xvc -f win64 ${yasmincs} "%(FullPath)"" 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} "%(FullPath)"" 268*fb1b10abSAndroid Build Coastguard Worker asm_Release_cmdline="${as} -Xvc -f win32 ${yasmincs} "%(FullPath)"" 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 "%(FullPath)"" 277*fb1b10abSAndroid Build Coastguard Worker asm_Release_cmdline="armasm64 -nologo -oldit "%(FullPath)"" 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 "%(FullPath)"" 282*fb1b10abSAndroid Build Coastguard Worker asm_Release_cmdline="armasm -nologo -oldit "%(FullPath)"" 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