xref: /aosp_15_r20/external/libvpx/build/make/gen_msvs_sln.sh (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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