1#!/bin/bash 2## 3## Copyright (c) 2010 The WebM project authors. All Rights Reserved. 4## 5## Use of this source code is governed by a BSD-style license 6## that can be found in the LICENSE file in the root of the source 7## tree. An additional intellectual property rights grant can be found 8## in the file PATENTS. All contributing project authors may 9## be found in the AUTHORS file in the root of the source tree. 10## 11 12 13self=$0 14self_basename=${self##*/} 15EOL=$'\n' 16EOLDOS=$'\r' 17 18show_help() { 19 cat <<EOF 20Usage: ${self_basename} [options] file1 [file2 ...] 21 22This script generates a Visual Studio 2005 solution file from a list of project 23files. 24 25Options: 26 --help Print this message 27 --out=outfile Redirect output to a file 28 --ver=version Version (7,8,9) of visual studio to generate for 29 --target=isa-os-cc Target specifier 30EOF 31 exit 1 32} 33 34die() { 35 echo "${self_basename}: $@" >&2 36 [ -f "${outfile}" ] && rm -f ${outfile}{,.mk} 37 exit 1 38} 39 40die_unknown(){ 41 echo "Unknown option \"$1\"." >&2 42 echo "See ${self_basename} --help for available options." >&2 43 [ -f "${outfile}" ] && rm -f ${outfile}{,.mk} 44 exit 1 45} 46 47indent1=$'\t' 48indent="" 49indent_push() { 50 indent="${indent}${indent1}" 51} 52indent_pop() { 53 indent="${indent%${indent1}}" 54} 55 56parse_project() { 57 local file=$1 58 local name=`grep Name "$file" | awk 'BEGIN {FS="\""}{if (NR==1) print $2}'` 59 local guid=`grep ProjectGUID "$file" | awk 'BEGIN {FS="\""}{if (NR==1) print $2}'` 60 61 # save the project GUID to a varaible, normalizing to the basename of the 62 # vcproj file without the extension 63 local var 64 var=${file##*/} 65 var=${var%%.vcproj} 66 eval "${var}_file=\"$1\"" 67 eval "${var}_name=$name" 68 eval "${var}_guid=$guid" 69 70 # assume that all projects have the same list of possible configurations, 71 # so overwriting old config_lists is not a problem 72 config_list=`grep -A1 '<Configuration' $file | 73 grep Name | cut -d\" -f2` 74 proj_list="${proj_list} ${var}" 75} 76 77process_project() { 78 eval "local file=\${$1_file}" 79 eval "local name=\${$1_name}" 80 eval "local guid=\${$1_guid}" 81 82 # save the project GUID to a varaible, normalizing to the basename of the 83 # vcproj file without the extension 84 local var 85 var=${file##*/} 86 var=${var%%.vcproj} 87 eval "${var}_guid=$guid" 88 89 echo "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"$name\", \"$file\", \"$guid\"" 90 indent_push 91 92 eval "local deps=\"\${${var}_deps}\"" 93 if [ -n "$deps" ]; then 94 echo "${indent}ProjectSection(ProjectDependencies) = postProject" 95 indent_push 96 97 for dep in $deps; do 98 eval "local dep_guid=\${${dep}_guid}" 99 [ -z "${dep_guid}" ] && die "Unknown GUID for $dep (dependency of $var)" 100 echo "${indent}$dep_guid = $dep_guid" 101 done 102 103 indent_pop 104 echo "${indent}EndProjectSection" 105 106 fi 107 108 indent_pop 109 echo "EndProject" 110} 111 112process_global() { 113 echo "Global" 114 indent_push 115 116 # 117 # Solution Configuration Platforms 118 # 119 echo "${indent}GlobalSection(SolutionConfigurationPlatforms) = preSolution" 120 indent_push 121 IFS_bak=${IFS} 122 IFS=$'\r'$'\n' 123 for config in ${config_list}; do 124 echo "${indent}$config = $config" 125 done 126 IFS=${IFS_bak} 127 indent_pop 128 echo "${indent}EndGlobalSection" 129 130 # 131 # Project Configuration Platforms 132 # 133 echo "${indent}GlobalSection(ProjectConfigurationPlatforms) = postSolution" 134 indent_push 135 for proj in ${proj_list}; do 136 eval "local proj_guid=\${${proj}_guid}" 137 IFS=$'\r'$'\n' 138 for config in ${config_list}; do 139 echo "${indent}${proj_guid}.${config}.ActiveCfg = ${config}" 140 echo "${indent}${proj_guid}.${config}.Build.0 = ${config}" 141 142 if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then 143 echo "${indent}${proj_guid}.${config}.Deploy.0 = ${config}" 144 fi 145 done 146 IFS=${IFS_bak} 147 done 148 indent_pop 149 echo "${indent}EndGlobalSection" 150 151 # 152 # Solution Properties 153 # 154 echo "${indent}GlobalSection(SolutionProperties) = preSolution" 155 indent_push 156 echo "${indent}HideSolutionNode = FALSE" 157 indent_pop 158 echo "${indent}EndGlobalSection" 159 160 indent_pop 161 echo "EndGlobal" 162} 163 164process_makefile() { 165 IFS_bak=${IFS} 166 IFS=$'\r'$'\n' 167 local TAB=$'\t' 168 cat <<EOF 169found_devenv := \$(shell which devenv.com >/dev/null 2>&1 && echo yes) 170.nodevenv.once: 171${TAB}@echo " * devenv.com not found in path." 172${TAB}@echo " * " 173${TAB}@echo " * You will have to build all configurations manually using the" 174${TAB}@echo " * Visual Studio IDE. To allow make to build them automatically," 175${TAB}@echo " * add the Common7/IDE directory of your Visual Studio" 176${TAB}@echo " * installation to your path, eg:" 177${TAB}@echo " * C:\Program Files\Microsoft Visual Studio 8\Common7\IDE" 178${TAB}@echo " * " 179${TAB}@touch \$@ 180CLEAN-OBJS += \$(if \$(found_devenv),,.nodevenv.once) 181 182EOF 183 184 for sln_config in ${config_list}; do 185 local config=${sln_config%%|*} 186 local platform=${sln_config##*|} 187 local nows_sln_config=`echo $sln_config | sed -e 's/[^a-zA-Z0-9]/_/g'` 188 cat <<EOF 189BUILD_TARGETS += \$(if \$(NO_LAUNCH_DEVENV),,$nows_sln_config) 190clean:: 191${TAB}rm -rf "$platform"/"$config" 192.PHONY: $nows_sln_config 193ifneq (\$(found_devenv),) 194 ifeq (\$(CONFIG_VS_VERSION),7) 195$nows_sln_config: $outfile 196${TAB}devenv.com $outfile -build "$config" 197 198 else 199$nows_sln_config: $outfile 200${TAB}devenv.com $outfile -build "$sln_config" 201 202 endif 203else 204$nows_sln_config: $outfile .nodevenv.once 205${TAB}@echo " * Skipping build of $sln_config (devenv.com not in path)." 206${TAB}@echo " * " 207endif 208 209EOF 210 done 211 IFS=${IFS_bak} 212} 213 214# Process command line 215outfile=/dev/stdout 216for opt in "$@"; do 217 optval="${opt#*=}" 218 case "$opt" in 219 --help|-h) show_help 220 ;; 221 --out=*) outfile="${optval}"; mkoutfile="${optval}".mk 222 ;; 223 --dep=*) eval "${optval%%:*}_deps=\"\${${optval%%:*}_deps} ${optval##*:}\"" 224 ;; 225 --ver=*) vs_ver="$optval" 226 case $optval in 227 [789]) 228 ;; 229 *) die Unrecognized Visual Studio Version in $opt 230 ;; 231 esac 232 ;; 233 --ver=*) vs_ver="$optval" 234 case $optval in 235 7) sln_vers="8.00" 236 sln_vers_str="Visual Studio .NET 2003" 237 ;; 238 [89]) 239 ;; 240 *) die "Unrecognized Visual Studio Version '$optval' in $opt" 241 ;; 242 esac 243 ;; 244 --target=*) target="${optval}" 245 ;; 246 -*) die_unknown $opt 247 ;; 248 *) file_list[${#file_list[@]}]="$opt" 249 esac 250done 251outfile=${outfile:-/dev/stdout} 252mkoutfile=${mkoutfile:-/dev/stdout} 253case "${vs_ver:-8}" in 254 7) sln_vers="8.00" 255 sln_vers_str="Visual Studio .NET 2003" 256 ;; 257 8) sln_vers="9.00" 258 sln_vers_str="Visual Studio 2005" 259 ;; 260 9) sln_vers="10.00" 261 sln_vers_str="Visual Studio 2008" 262 ;; 263esac 264 265for f in "${file_list[@]}"; do 266 parse_project $f 267done 268cat >${outfile} <<EOF 269Microsoft Visual Studio Solution File, Format Version $sln_vers${EOLDOS} 270# $sln_vers_str${EOLDOS} 271EOF 272for proj in ${proj_list}; do 273 process_project $proj >>${outfile} 274done 275process_global >>${outfile} 276process_makefile >${mkoutfile} 277