1*fb1b10abSAndroid Build Coastguard Worker#!/bin/bash 2*fb1b10abSAndroid Build Coastguard Worker## 3*fb1b10abSAndroid Build Coastguard Worker## Copyright (c) 2010 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 Worker 13*fb1b10abSAndroid Build Coastguard Workerself=$0 14*fb1b10abSAndroid Build Coastguard Workerself_basename=${self##*/} 15*fb1b10abSAndroid Build Coastguard WorkerEOL=$'\n' 16*fb1b10abSAndroid Build Coastguard WorkerEOLDOS=$'\r' 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} [options] file1 [file2 ...] 21*fb1b10abSAndroid Build Coastguard Worker 22*fb1b10abSAndroid Build Coastguard WorkerThis script generates a Visual Studio solution file from a list of project 23*fb1b10abSAndroid Build Coastguard Workerfiles. 24*fb1b10abSAndroid Build Coastguard Worker 25*fb1b10abSAndroid Build Coastguard WorkerOptions: 26*fb1b10abSAndroid Build Coastguard Worker --help Print this message 27*fb1b10abSAndroid Build Coastguard Worker --out=outfile Redirect output to a file 28*fb1b10abSAndroid Build Coastguard Worker --ver=version Version (14-17) of visual studio to generate for 29*fb1b10abSAndroid Build Coastguard Worker --target=isa-os-cc Target specifier 30*fb1b10abSAndroid Build Coastguard WorkerEOF 31*fb1b10abSAndroid Build Coastguard Worker exit 1 32*fb1b10abSAndroid Build Coastguard Worker} 33*fb1b10abSAndroid Build Coastguard Worker 34*fb1b10abSAndroid Build Coastguard Workerdie() { 35*fb1b10abSAndroid Build Coastguard Worker echo "${self_basename}: $@" >&2 36*fb1b10abSAndroid Build Coastguard Worker [ -f "${outfile}" ] && rm -f ${outfile}{,.mk} 37*fb1b10abSAndroid Build Coastguard Worker exit 1 38*fb1b10abSAndroid Build Coastguard Worker} 39*fb1b10abSAndroid Build Coastguard Worker 40*fb1b10abSAndroid Build Coastguard Workerdie_unknown(){ 41*fb1b10abSAndroid Build Coastguard Worker echo "Unknown option \"$1\"." >&2 42*fb1b10abSAndroid Build Coastguard Worker echo "See ${self_basename} --help for available options." >&2 43*fb1b10abSAndroid Build Coastguard Worker [ -f "${outfile}" ] && rm -f ${outfile}{,.mk} 44*fb1b10abSAndroid Build Coastguard Worker exit 1 45*fb1b10abSAndroid Build Coastguard Worker} 46*fb1b10abSAndroid Build Coastguard Worker 47*fb1b10abSAndroid Build Coastguard Workerindent1=$'\t' 48*fb1b10abSAndroid Build Coastguard Workerindent="" 49*fb1b10abSAndroid Build Coastguard Workerindent_push() { 50*fb1b10abSAndroid Build Coastguard Worker indent="${indent}${indent1}" 51*fb1b10abSAndroid Build Coastguard Worker} 52*fb1b10abSAndroid Build Coastguard Workerindent_pop() { 53*fb1b10abSAndroid Build Coastguard Worker indent="${indent%${indent1}}" 54*fb1b10abSAndroid Build Coastguard Worker} 55*fb1b10abSAndroid Build Coastguard Worker 56*fb1b10abSAndroid Build Coastguard Workerparse_project() { 57*fb1b10abSAndroid Build Coastguard Worker local file=$1 58*fb1b10abSAndroid Build Coastguard Worker local name=`grep RootNamespace "$file" | sed 's,.*<.*>\(.*\)</.*>.*,\1,'` 59*fb1b10abSAndroid Build Coastguard Worker local guid=`grep ProjectGuid "$file" | sed 's,.*<.*>\(.*\)</.*>.*,\1,'` 60*fb1b10abSAndroid Build Coastguard Worker 61*fb1b10abSAndroid Build Coastguard Worker # save the project GUID to a varaible, normalizing to the basename of the 62*fb1b10abSAndroid Build Coastguard Worker # vcxproj file without the extension 63*fb1b10abSAndroid Build Coastguard Worker local var 64*fb1b10abSAndroid Build Coastguard Worker var=${file##*/} 65*fb1b10abSAndroid Build Coastguard Worker var=${var%%.${sfx}} 66*fb1b10abSAndroid Build Coastguard Worker eval "${var}_file=\"$1\"" 67*fb1b10abSAndroid Build Coastguard Worker eval "${var}_name=$name" 68*fb1b10abSAndroid Build Coastguard Worker eval "${var}_guid=$guid" 69*fb1b10abSAndroid Build Coastguard Worker 70*fb1b10abSAndroid Build Coastguard Worker cur_config_list=`grep -B1 'Label="Configuration"' $file | 71*fb1b10abSAndroid Build Coastguard Worker grep Condition | cut -d\' -f4` 72*fb1b10abSAndroid Build Coastguard Worker new_config_list=$(for i in $config_list $cur_config_list; do 73*fb1b10abSAndroid Build Coastguard Worker echo $i 74*fb1b10abSAndroid Build Coastguard Worker done | sort | uniq) 75*fb1b10abSAndroid Build Coastguard Worker if [ "$config_list" != "" ] && [ "$config_list" != "$new_config_list" ]; then 76*fb1b10abSAndroid Build Coastguard Worker mixed_platforms=1 77*fb1b10abSAndroid Build Coastguard Worker fi 78*fb1b10abSAndroid Build Coastguard Worker config_list="$new_config_list" 79*fb1b10abSAndroid Build Coastguard Worker eval "${var}_config_list=\"$cur_config_list\"" 80*fb1b10abSAndroid Build Coastguard Worker proj_list="${proj_list} ${var}" 81*fb1b10abSAndroid Build Coastguard Worker} 82*fb1b10abSAndroid Build Coastguard Worker 83*fb1b10abSAndroid Build Coastguard Workerprocess_project() { 84*fb1b10abSAndroid Build Coastguard Worker eval "local file=\${$1_file}" 85*fb1b10abSAndroid Build Coastguard Worker eval "local name=\${$1_name}" 86*fb1b10abSAndroid Build Coastguard Worker eval "local guid=\${$1_guid}" 87*fb1b10abSAndroid Build Coastguard Worker 88*fb1b10abSAndroid Build Coastguard Worker # save the project GUID to a varaible, normalizing to the basename of the 89*fb1b10abSAndroid Build Coastguard Worker # vcproj file without the extension 90*fb1b10abSAndroid Build Coastguard Worker local var 91*fb1b10abSAndroid Build Coastguard Worker var=${file##*/} 92*fb1b10abSAndroid Build Coastguard Worker var=${var%%.${sfx}} 93*fb1b10abSAndroid Build Coastguard Worker eval "${var}_guid=$guid" 94*fb1b10abSAndroid Build Coastguard Worker 95*fb1b10abSAndroid Build Coastguard Worker echo "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"$name\", \"$file\", \"$guid\"" 96*fb1b10abSAndroid Build Coastguard Worker echo "EndProject" 97*fb1b10abSAndroid Build Coastguard Worker} 98*fb1b10abSAndroid Build Coastguard Worker 99*fb1b10abSAndroid Build Coastguard Workerprocess_global() { 100*fb1b10abSAndroid Build Coastguard Worker echo "Global" 101*fb1b10abSAndroid Build Coastguard Worker indent_push 102*fb1b10abSAndroid Build Coastguard Worker 103*fb1b10abSAndroid Build Coastguard Worker # 104*fb1b10abSAndroid Build Coastguard Worker # Solution Configuration Platforms 105*fb1b10abSAndroid Build Coastguard Worker # 106*fb1b10abSAndroid Build Coastguard Worker echo "${indent}GlobalSection(SolutionConfigurationPlatforms) = preSolution" 107*fb1b10abSAndroid Build Coastguard Worker indent_push 108*fb1b10abSAndroid Build Coastguard Worker IFS_bak=${IFS} 109*fb1b10abSAndroid Build Coastguard Worker IFS=$'\r'$'\n' 110*fb1b10abSAndroid Build Coastguard Worker if [ "$mixed_platforms" != "" ]; then 111*fb1b10abSAndroid Build Coastguard Worker config_list=" 112*fb1b10abSAndroid Build Coastguard WorkerRelease|Mixed Platforms 113*fb1b10abSAndroid Build Coastguard WorkerDebug|Mixed Platforms" 114*fb1b10abSAndroid Build Coastguard Worker fi 115*fb1b10abSAndroid Build Coastguard Worker for config in ${config_list}; do 116*fb1b10abSAndroid Build Coastguard Worker echo "${indent}$config = $config" 117*fb1b10abSAndroid Build Coastguard Worker done 118*fb1b10abSAndroid Build Coastguard Worker IFS=${IFS_bak} 119*fb1b10abSAndroid Build Coastguard Worker indent_pop 120*fb1b10abSAndroid Build Coastguard Worker echo "${indent}EndGlobalSection" 121*fb1b10abSAndroid Build Coastguard Worker 122*fb1b10abSAndroid Build Coastguard Worker # 123*fb1b10abSAndroid Build Coastguard Worker # Project Configuration Platforms 124*fb1b10abSAndroid Build Coastguard Worker # 125*fb1b10abSAndroid Build Coastguard Worker echo "${indent}GlobalSection(ProjectConfigurationPlatforms) = postSolution" 126*fb1b10abSAndroid Build Coastguard Worker indent_push 127*fb1b10abSAndroid Build Coastguard Worker for proj in ${proj_list}; do 128*fb1b10abSAndroid Build Coastguard Worker eval "local proj_guid=\${${proj}_guid}" 129*fb1b10abSAndroid Build Coastguard Worker eval "local proj_config_list=\${${proj}_config_list}" 130*fb1b10abSAndroid Build Coastguard Worker IFS=$'\r'$'\n' 131*fb1b10abSAndroid Build Coastguard Worker for config in ${proj_config_list}; do 132*fb1b10abSAndroid Build Coastguard Worker if [ "$mixed_platforms" != "" ]; then 133*fb1b10abSAndroid Build Coastguard Worker local c=${config%%|*} 134*fb1b10abSAndroid Build Coastguard Worker echo "${indent}${proj_guid}.${c}|Mixed Platforms.ActiveCfg = ${config}" 135*fb1b10abSAndroid Build Coastguard Worker echo "${indent}${proj_guid}.${c}|Mixed Platforms.Build.0 = ${config}" 136*fb1b10abSAndroid Build Coastguard Worker else 137*fb1b10abSAndroid Build Coastguard Worker echo "${indent}${proj_guid}.${config}.ActiveCfg = ${config}" 138*fb1b10abSAndroid Build Coastguard Worker echo "${indent}${proj_guid}.${config}.Build.0 = ${config}" 139*fb1b10abSAndroid Build Coastguard Worker fi 140*fb1b10abSAndroid Build Coastguard Worker 141*fb1b10abSAndroid Build Coastguard Worker done 142*fb1b10abSAndroid Build Coastguard Worker IFS=${IFS_bak} 143*fb1b10abSAndroid Build Coastguard Worker done 144*fb1b10abSAndroid Build Coastguard Worker indent_pop 145*fb1b10abSAndroid Build Coastguard Worker echo "${indent}EndGlobalSection" 146*fb1b10abSAndroid Build Coastguard Worker 147*fb1b10abSAndroid Build Coastguard Worker # 148*fb1b10abSAndroid Build Coastguard Worker # Solution Properties 149*fb1b10abSAndroid Build Coastguard Worker # 150*fb1b10abSAndroid Build Coastguard Worker echo "${indent}GlobalSection(SolutionProperties) = preSolution" 151*fb1b10abSAndroid Build Coastguard Worker indent_push 152*fb1b10abSAndroid Build Coastguard Worker echo "${indent}HideSolutionNode = FALSE" 153*fb1b10abSAndroid Build Coastguard Worker indent_pop 154*fb1b10abSAndroid Build Coastguard Worker echo "${indent}EndGlobalSection" 155*fb1b10abSAndroid Build Coastguard Worker 156*fb1b10abSAndroid Build Coastguard Worker indent_pop 157*fb1b10abSAndroid Build Coastguard Worker echo "EndGlobal" 158*fb1b10abSAndroid Build Coastguard Worker} 159*fb1b10abSAndroid Build Coastguard Worker 160*fb1b10abSAndroid Build Coastguard Workerprocess_makefile() { 161*fb1b10abSAndroid Build Coastguard Worker IFS_bak=${IFS} 162*fb1b10abSAndroid Build Coastguard Worker IFS=$'\r'$'\n' 163*fb1b10abSAndroid Build Coastguard Worker local TAB=$'\t' 164*fb1b10abSAndroid Build Coastguard Worker cat <<EOF 165*fb1b10abSAndroid Build Coastguard WorkerMSBUILD_TOOL := msbuild.exe 166*fb1b10abSAndroid Build Coastguard Workerfound_devenv := \$(shell which \$(MSBUILD_TOOL) >/dev/null 2>&1 && echo yes) 167*fb1b10abSAndroid Build Coastguard Worker.nodevenv.once: 168*fb1b10abSAndroid Build Coastguard Worker${TAB}@echo " * \$(MSBUILD_TOOL) not found in path." 169*fb1b10abSAndroid Build Coastguard Worker${TAB}@echo " * " 170*fb1b10abSAndroid Build Coastguard Worker${TAB}@echo " * You will have to build all configurations manually using the" 171*fb1b10abSAndroid Build Coastguard Worker${TAB}@echo " * Visual Studio IDE. To allow make to build them automatically," 172*fb1b10abSAndroid Build Coastguard Worker${TAB}@echo " * add the Common7/IDE directory of your Visual Studio" 173*fb1b10abSAndroid Build Coastguard Worker${TAB}@echo " * installation to your path, eg:" 174*fb1b10abSAndroid Build Coastguard Worker${TAB}@echo " * C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE" 175*fb1b10abSAndroid Build Coastguard Worker${TAB}@echo " * " 176*fb1b10abSAndroid Build Coastguard Worker${TAB}@touch \$@ 177*fb1b10abSAndroid Build Coastguard WorkerCLEAN-OBJS += \$(if \$(found_devenv),,.nodevenv.once) 178*fb1b10abSAndroid Build Coastguard Worker 179*fb1b10abSAndroid Build Coastguard WorkerEOF 180*fb1b10abSAndroid Build Coastguard Worker 181*fb1b10abSAndroid Build Coastguard Worker for sln_config in ${config_list}; do 182*fb1b10abSAndroid Build Coastguard Worker local config=${sln_config%%|*} 183*fb1b10abSAndroid Build Coastguard Worker local platform=${sln_config##*|} 184*fb1b10abSAndroid Build Coastguard Worker local nows_sln_config=`echo $sln_config | sed -e 's/[^a-zA-Z0-9]/_/g'` 185*fb1b10abSAndroid Build Coastguard Worker cat <<EOF 186*fb1b10abSAndroid Build Coastguard WorkerBUILD_TARGETS += \$(if \$(NO_LAUNCH_DEVENV),,$nows_sln_config) 187*fb1b10abSAndroid Build Coastguard Workerclean:: 188*fb1b10abSAndroid Build Coastguard Worker${TAB}rm -rf "$platform"/"$config" 189*fb1b10abSAndroid Build Coastguard Worker.PHONY: $nows_sln_config 190*fb1b10abSAndroid Build Coastguard Workerifneq (\$(found_devenv),) 191*fb1b10abSAndroid Build Coastguard Worker$nows_sln_config: $outfile 192*fb1b10abSAndroid Build Coastguard Worker${TAB}\$(MSBUILD_TOOL) $outfile -m -t:Build \\ 193*fb1b10abSAndroid Build Coastguard Worker${TAB}${TAB}-p:Configuration="$config" -p:Platform="$platform" 194*fb1b10abSAndroid Build Coastguard Workerelse 195*fb1b10abSAndroid Build Coastguard Worker$nows_sln_config: $outfile .nodevenv.once 196*fb1b10abSAndroid Build Coastguard Worker${TAB}@echo " * Skipping build of $sln_config (\$(MSBUILD_TOOL) not in path)." 197*fb1b10abSAndroid Build Coastguard Worker${TAB}@echo " * " 198*fb1b10abSAndroid Build Coastguard Workerendif 199*fb1b10abSAndroid Build Coastguard Worker 200*fb1b10abSAndroid Build Coastguard WorkerEOF 201*fb1b10abSAndroid Build Coastguard Worker done 202*fb1b10abSAndroid Build Coastguard Worker IFS=${IFS_bak} 203*fb1b10abSAndroid Build Coastguard Worker} 204*fb1b10abSAndroid Build Coastguard Worker 205*fb1b10abSAndroid Build Coastguard Worker# Process command line 206*fb1b10abSAndroid Build Coastguard Workeroutfile=/dev/stdout 207*fb1b10abSAndroid Build Coastguard Workerfor opt in "$@"; do 208*fb1b10abSAndroid Build Coastguard Worker optval="${opt#*=}" 209*fb1b10abSAndroid Build Coastguard Worker case "$opt" in 210*fb1b10abSAndroid Build Coastguard Worker --help|-h) show_help 211*fb1b10abSAndroid Build Coastguard Worker ;; 212*fb1b10abSAndroid Build Coastguard Worker --out=*) outfile="${optval}"; mkoutfile="${optval}".mk 213*fb1b10abSAndroid Build Coastguard Worker ;; 214*fb1b10abSAndroid Build Coastguard Worker --dep=*) eval "${optval%%:*}_deps=\"\${${optval%%:*}_deps} ${optval##*:}\"" 215*fb1b10abSAndroid Build Coastguard Worker ;; 216*fb1b10abSAndroid Build Coastguard Worker --ver=*) 217*fb1b10abSAndroid Build Coastguard Worker vs_ver="$optval" 218*fb1b10abSAndroid Build Coastguard Worker case $optval in 219*fb1b10abSAndroid Build Coastguard Worker 14) vs_year=2015 ;; 220*fb1b10abSAndroid Build Coastguard Worker 15) vs_year=2017 ;; 221*fb1b10abSAndroid Build Coastguard Worker 16) vs_year=2019 ;; 222*fb1b10abSAndroid Build Coastguard Worker 17) vs_year=2022 ;; 223*fb1b10abSAndroid Build Coastguard Worker *) die Unrecognized Visual Studio Version in $opt ;; 224*fb1b10abSAndroid Build Coastguard Worker esac 225*fb1b10abSAndroid Build Coastguard Worker ;; 226*fb1b10abSAndroid Build Coastguard Worker --target=*) target="${optval}" 227*fb1b10abSAndroid Build Coastguard Worker ;; 228*fb1b10abSAndroid Build Coastguard Worker -*) die_unknown $opt 229*fb1b10abSAndroid Build Coastguard Worker ;; 230*fb1b10abSAndroid Build Coastguard Worker *) file_list[${#file_list[@]}]="$opt" 231*fb1b10abSAndroid Build Coastguard Worker esac 232*fb1b10abSAndroid Build Coastguard Workerdone 233*fb1b10abSAndroid Build Coastguard Workeroutfile=${outfile:-/dev/stdout} 234*fb1b10abSAndroid Build Coastguard Workermkoutfile=${mkoutfile:-/dev/stdout} 235*fb1b10abSAndroid Build Coastguard Workercase "${vs_ver}" in 236*fb1b10abSAndroid Build Coastguard Worker 1[4-7]) 237*fb1b10abSAndroid Build Coastguard Worker # VS has used Format Version 12.00 continuously since vs11. 238*fb1b10abSAndroid Build Coastguard Worker sln_vers="12.00" 239*fb1b10abSAndroid Build Coastguard Worker sln_vers_str="Visual Studio ${vs_year}" 240*fb1b10abSAndroid Build Coastguard Worker ;; 241*fb1b10abSAndroid Build Coastguard Workeresac 242*fb1b10abSAndroid Build Coastguard Workersfx=vcxproj 243*fb1b10abSAndroid Build Coastguard Worker 244*fb1b10abSAndroid Build Coastguard Workerfor f in "${file_list[@]}"; do 245*fb1b10abSAndroid Build Coastguard Worker parse_project $f 246*fb1b10abSAndroid Build Coastguard Workerdone 247*fb1b10abSAndroid Build Coastguard Workercat >${outfile} <<EOF 248*fb1b10abSAndroid Build Coastguard WorkerMicrosoft Visual Studio Solution File, Format Version $sln_vers${EOLDOS} 249*fb1b10abSAndroid Build Coastguard Worker# $sln_vers_str${EOLDOS} 250*fb1b10abSAndroid Build Coastguard WorkerEOF 251*fb1b10abSAndroid Build Coastguard Workerfor proj in ${proj_list}; do 252*fb1b10abSAndroid Build Coastguard Worker process_project $proj >>${outfile} 253*fb1b10abSAndroid Build Coastguard Workerdone 254*fb1b10abSAndroid Build Coastguard Workerprocess_global >>${outfile} 255*fb1b10abSAndroid Build Coastguard Workerprocess_makefile >${mkoutfile} 256