• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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