feefd81bd7
Prior to 73c4e284
, the generated .sln files didn't contain any
information about the different configurations when using .vcxproj
project files. The MSVS IDE was able to fill this in just fine when
loaded though.
When building for ARM, the obj_int_extract project still is built
for x86, in order for the build process to be able to use
obj_int_extract.exe.
Now that configuration info is generated, it breaks current ARM
setups, since the configurations generated by gen_msvs_sln.sh only
included configurations from the last parsed project file (as
mentioned in the comment).
In these setups, the MSVS IDE generated a third meta-platform, called
"Mixed Platforms". This meta-platform points to either ARM or
Win32 as platform in each of the individual projects.
When the MSVS IDE generated this automatically, it also included
the original ARM and Win32 platforms as separate choices, but these
can be omitted since they don't make sense.
Change-Id: Ie25226496f91af4bb1ad8eb9ae9ca5bfed0433d7
322 lines
8.5 KiB
Bash
Executable File
322 lines
8.5 KiB
Bash
Executable File
#!/bin/bash
|
|
##
|
|
## Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
##
|
|
## Use of this source code is governed by a BSD-style license
|
|
## that can be found in the LICENSE file in the root of the source
|
|
## tree. An additional intellectual property rights grant can be found
|
|
## in the file PATENTS. All contributing project authors may
|
|
## be found in the AUTHORS file in the root of the source tree.
|
|
##
|
|
|
|
|
|
self=$0
|
|
self_basename=${self##*/}
|
|
EOL=$'\n'
|
|
EOLDOS=$'\r'
|
|
|
|
show_help() {
|
|
cat <<EOF
|
|
Usage: ${self_basename} [options] file1 [file2 ...]
|
|
|
|
This script generates a Visual Studio 2005 solution file from a list of project
|
|
files.
|
|
|
|
Options:
|
|
--help Print this message
|
|
--out=outfile Redirect output to a file
|
|
--ver=version Version (7,8,9,10,11) of visual studio to generate for
|
|
--target=isa-os-cc Target specifier
|
|
EOF
|
|
exit 1
|
|
}
|
|
|
|
die() {
|
|
echo "${self_basename}: $@" >&2
|
|
[ -f "${outfile}" ] && rm -f ${outfile}{,.mk}
|
|
exit 1
|
|
}
|
|
|
|
die_unknown(){
|
|
echo "Unknown option \"$1\"." >&2
|
|
echo "See ${self_basename} --help for available options." >&2
|
|
[ -f "${outfile}" ] && rm -f ${outfile}{,.mk}
|
|
exit 1
|
|
}
|
|
|
|
indent1=$'\t'
|
|
indent=""
|
|
indent_push() {
|
|
indent="${indent}${indent1}"
|
|
}
|
|
indent_pop() {
|
|
indent="${indent%${indent1}}"
|
|
}
|
|
|
|
parse_project() {
|
|
local file=$1
|
|
if [ "$sfx" = "vcproj" ]; then
|
|
local name=`grep Name "$file" | awk 'BEGIN {FS="\""}{if (NR==1) print $2}'`
|
|
local guid=`grep ProjectGUID "$file" | awk 'BEGIN {FS="\""}{if (NR==1) print $2}'`
|
|
else
|
|
local name=`grep RootNamespace "$file" | sed 's,.*<.*>\(.*\)</.*>.*,\1,'`
|
|
local guid=`grep ProjectGuid "$file" | sed 's,.*<.*>\(.*\)</.*>.*,\1,'`
|
|
fi
|
|
|
|
# save the project GUID to a varaible, normalizing to the basename of the
|
|
# vcproj file without the extension
|
|
local var
|
|
var=${file##*/}
|
|
var=${var%%.${sfx}}
|
|
eval "${var}_file=\"$1\""
|
|
eval "${var}_name=$name"
|
|
eval "${var}_guid=$guid"
|
|
|
|
if [ "$sfx" = "vcproj" ]; then
|
|
cur_config_list=`grep -A1 '<Configuration' $file |
|
|
grep Name | cut -d\" -f2`
|
|
else
|
|
cur_config_list=`grep -B1 'Label="Configuration"' $file |
|
|
grep Condition | cut -d\' -f4`
|
|
fi
|
|
new_config_list=$(for i in $config_list $cur_config_list; do
|
|
echo $i
|
|
done | sort | uniq)
|
|
if [ "$config_list" != "" ] && [ "$config_list" != "$new_config_list" ]; then
|
|
mixed_platforms=1
|
|
fi
|
|
config_list="$new_config_list"
|
|
eval "${var}_config_list=\"$cur_config_list\""
|
|
proj_list="${proj_list} ${var}"
|
|
}
|
|
|
|
process_project() {
|
|
eval "local file=\${$1_file}"
|
|
eval "local name=\${$1_name}"
|
|
eval "local guid=\${$1_guid}"
|
|
|
|
# save the project GUID to a varaible, normalizing to the basename of the
|
|
# vcproj file without the extension
|
|
local var
|
|
var=${file##*/}
|
|
var=${var%%.${sfx}}
|
|
eval "${var}_guid=$guid"
|
|
|
|
echo "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"$name\", \"$file\", \"$guid\""
|
|
indent_push
|
|
|
|
eval "local deps=\"\${${var}_deps}\""
|
|
if [ -n "$deps" ] && [ "$sfx" = "vcproj" ]; then
|
|
echo "${indent}ProjectSection(ProjectDependencies) = postProject"
|
|
indent_push
|
|
|
|
for dep in $deps; do
|
|
eval "local dep_guid=\${${dep}_guid}"
|
|
[ -z "${dep_guid}" ] && die "Unknown GUID for $dep (dependency of $var)"
|
|
echo "${indent}$dep_guid = $dep_guid"
|
|
done
|
|
|
|
indent_pop
|
|
echo "${indent}EndProjectSection"
|
|
|
|
fi
|
|
|
|
indent_pop
|
|
echo "EndProject"
|
|
}
|
|
|
|
process_global() {
|
|
echo "Global"
|
|
indent_push
|
|
|
|
#
|
|
# Solution Configuration Platforms
|
|
#
|
|
echo "${indent}GlobalSection(SolutionConfigurationPlatforms) = preSolution"
|
|
indent_push
|
|
IFS_bak=${IFS}
|
|
IFS=$'\r'$'\n'
|
|
if [ "$mixed_platforms" != "" ]; then
|
|
config_list="
|
|
Release|Mixed Platforms
|
|
Debug|Mixed Platforms"
|
|
fi
|
|
for config in ${config_list}; do
|
|
echo "${indent}$config = $config"
|
|
done
|
|
IFS=${IFS_bak}
|
|
indent_pop
|
|
echo "${indent}EndGlobalSection"
|
|
|
|
#
|
|
# Project Configuration Platforms
|
|
#
|
|
echo "${indent}GlobalSection(ProjectConfigurationPlatforms) = postSolution"
|
|
indent_push
|
|
for proj in ${proj_list}; do
|
|
eval "local proj_guid=\${${proj}_guid}"
|
|
eval "local proj_config_list=\${${proj}_config_list}"
|
|
IFS=$'\r'$'\n'
|
|
for config in ${proj_config_list}; do
|
|
if [ "$mixed_platforms" != "" ]; then
|
|
local c=${config%%|*}
|
|
echo "${indent}${proj_guid}.${c}|Mixed Platforms.ActiveCfg = ${config}"
|
|
echo "${indent}${proj_guid}.${c}|Mixed Platforms.Build.0 = ${config}"
|
|
else
|
|
echo "${indent}${proj_guid}.${config}.ActiveCfg = ${config}"
|
|
echo "${indent}${proj_guid}.${config}.Build.0 = ${config}"
|
|
fi
|
|
|
|
done
|
|
IFS=${IFS_bak}
|
|
done
|
|
indent_pop
|
|
echo "${indent}EndGlobalSection"
|
|
|
|
#
|
|
# Solution Properties
|
|
#
|
|
echo "${indent}GlobalSection(SolutionProperties) = preSolution"
|
|
indent_push
|
|
echo "${indent}HideSolutionNode = FALSE"
|
|
indent_pop
|
|
echo "${indent}EndGlobalSection"
|
|
|
|
indent_pop
|
|
echo "EndGlobal"
|
|
}
|
|
|
|
process_makefile() {
|
|
IFS_bak=${IFS}
|
|
IFS=$'\r'$'\n'
|
|
local TAB=$'\t'
|
|
cat <<EOF
|
|
ifeq (\$(CONFIG_VS_VERSION),7)
|
|
MSBUILD_TOOL := devenv.com
|
|
else
|
|
MSBUILD_TOOL := msbuild.exe
|
|
endif
|
|
found_devenv := \$(shell which \$(MSBUILD_TOOL) >/dev/null 2>&1 && echo yes)
|
|
.nodevenv.once:
|
|
${TAB}@echo " * \$(MSBUILD_TOOL) not found in path."
|
|
${TAB}@echo " * "
|
|
${TAB}@echo " * You will have to build all configurations manually using the"
|
|
${TAB}@echo " * Visual Studio IDE. To allow make to build them automatically,"
|
|
${TAB}@echo " * add the Common7/IDE directory of your Visual Studio"
|
|
${TAB}@echo " * installation to your path, eg:"
|
|
${TAB}@echo " * C:\Program Files\Microsoft Visual Studio 8\Common7\IDE"
|
|
${TAB}@echo " * "
|
|
${TAB}@touch \$@
|
|
CLEAN-OBJS += \$(if \$(found_devenv),,.nodevenv.once)
|
|
|
|
EOF
|
|
|
|
for sln_config in ${config_list}; do
|
|
local config=${sln_config%%|*}
|
|
local platform=${sln_config##*|}
|
|
local nows_sln_config=`echo $sln_config | sed -e 's/[^a-zA-Z0-9]/_/g'`
|
|
cat <<EOF
|
|
BUILD_TARGETS += \$(if \$(NO_LAUNCH_DEVENV),,$nows_sln_config)
|
|
clean::
|
|
${TAB}rm -rf "$platform"/"$config"
|
|
.PHONY: $nows_sln_config
|
|
ifneq (\$(found_devenv),)
|
|
ifeq (\$(CONFIG_VS_VERSION),7)
|
|
$nows_sln_config: $outfile
|
|
${TAB}\$(MSBUILD_TOOL) $outfile -build "$config"
|
|
|
|
else
|
|
$nows_sln_config: $outfile
|
|
${TAB}\$(MSBUILD_TOOL) $outfile -m -t:Build \\
|
|
${TAB}${TAB}-p:Configuration="$config" -p:Platform="$platform"
|
|
|
|
endif
|
|
else
|
|
$nows_sln_config: $outfile .nodevenv.once
|
|
${TAB}@echo " * Skipping build of $sln_config (\$(MSBUILD_TOOL) not in path)."
|
|
${TAB}@echo " * "
|
|
endif
|
|
|
|
EOF
|
|
done
|
|
IFS=${IFS_bak}
|
|
}
|
|
|
|
# Process command line
|
|
outfile=/dev/stdout
|
|
for opt in "$@"; do
|
|
optval="${opt#*=}"
|
|
case "$opt" in
|
|
--help|-h) show_help
|
|
;;
|
|
--out=*) outfile="${optval}"; mkoutfile="${optval}".mk
|
|
;;
|
|
--dep=*) eval "${optval%%:*}_deps=\"\${${optval%%:*}_deps} ${optval##*:}\""
|
|
;;
|
|
--ver=*) vs_ver="$optval"
|
|
case $optval in
|
|
[789]|10|11)
|
|
;;
|
|
*) die Unrecognized Visual Studio Version in $opt
|
|
;;
|
|
esac
|
|
;;
|
|
--ver=*) vs_ver="$optval"
|
|
case $optval in
|
|
7) sln_vers="8.00"
|
|
sln_vers_str="Visual Studio .NET 2003"
|
|
;;
|
|
[89])
|
|
;;
|
|
*) die "Unrecognized Visual Studio Version '$optval' in $opt"
|
|
;;
|
|
esac
|
|
;;
|
|
--target=*) target="${optval}"
|
|
;;
|
|
-*) die_unknown $opt
|
|
;;
|
|
*) file_list[${#file_list[@]}]="$opt"
|
|
esac
|
|
done
|
|
outfile=${outfile:-/dev/stdout}
|
|
mkoutfile=${mkoutfile:-/dev/stdout}
|
|
case "${vs_ver:-8}" in
|
|
7) sln_vers="8.00"
|
|
sln_vers_str="Visual Studio .NET 2003"
|
|
;;
|
|
8) sln_vers="9.00"
|
|
sln_vers_str="Visual Studio 2005"
|
|
;;
|
|
9) sln_vers="10.00"
|
|
sln_vers_str="Visual Studio 2008"
|
|
;;
|
|
10) sln_vers="11.00"
|
|
sln_vers_str="Visual Studio 2010"
|
|
;;
|
|
11) sln_vers="12.00"
|
|
sln_vers_str="Visual Studio 2012"
|
|
;;
|
|
esac
|
|
case "${vs_ver:-8}" in
|
|
[789])
|
|
sfx=vcproj
|
|
;;
|
|
10|11)
|
|
sfx=vcxproj
|
|
;;
|
|
esac
|
|
|
|
for f in "${file_list[@]}"; do
|
|
parse_project $f
|
|
done
|
|
cat >${outfile} <<EOF
|
|
Microsoft Visual Studio Solution File, Format Version $sln_vers${EOLDOS}
|
|
# $sln_vers_str${EOLDOS}
|
|
EOF
|
|
for proj in ${proj_list}; do
|
|
process_project $proj >>${outfile}
|
|
done
|
|
process_global >>${outfile}
|
|
process_makefile >${mkoutfile}
|