| #!/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##*/} |
| self_dirname=$(dirname "$0") |
| |
| . "$self_dirname/msvs_common.sh"|| exit 127 |
| |
| show_help() { |
| cat <<EOF |
| Usage: ${self_basename} --name=projname [options] file1 [file2 ...] |
| |
| This script generates a Visual Studio project file from a list of source |
| code files. |
| |
| Options: |
| --help Print this message |
| --exe Generate a project for building an Application |
| --lib Generate a project for creating a static library |
| --dll Generate a project for creating a dll |
| --static-crt Use the static C runtime (/MT) |
| --target=isa-os-cc Target specifier (required) |
| --out=filename Write output to a file [stdout] |
| --name=project_name Name of the project (required) |
| --proj-guid=GUID GUID to use for the project |
| --module-def=filename File containing export definitions (for DLLs) |
| --ver=version Version (7,8,9) of visual studio to generate for |
| --src-path-bare=dir Path to root of source tree |
| -Ipath/to/include Additional include directories |
| -DFLAG[=value] Preprocessor macros to define |
| -Lpath/to/lib Additional library search paths |
| -llibname Library to link against |
| EOF |
| exit 1 |
| } |
| |
| generate_filter() { |
| local var=$1 |
| local name=$2 |
| local pats=$3 |
| local file_list_sz |
| local i |
| local f |
| local saveIFS="$IFS" |
| local pack |
| echo "generating filter '$name' from ${#file_list[@]} files" >&2 |
| IFS=* |
| |
| open_tag Filter \ |
| Name=$name \ |
| Filter=$pats \ |
| UniqueIdentifier=`generate_uuid` \ |
| |
| file_list_sz=${#file_list[@]} |
| for i in ${!file_list[@]}; do |
| f=${file_list[i]} |
| for pat in ${pats//;/$IFS}; do |
| if [ "${f##*.}" == "$pat" ]; then |
| unset file_list[i] |
| |
| objf=$(echo ${f%.*}.obj \ |
| | sed -e "s,$src_path_bare,," \ |
| -e 's/^[\./]\+//g' -e 's,[:/ ],_,g') |
| open_tag File RelativePath="$f" |
| |
| if [ "$pat" == "asm" ] && $asm_use_custom_step; then |
| # Avoid object file name collisions, i.e. vpx_config.c and |
| # vpx_config.asm produce the same object file without |
| # this additional suffix. |
| objf=${objf%.obj}_asm.obj |
| for plat in "${platforms[@]}"; do |
| for cfg in Debug Release; do |
| open_tag FileConfiguration \ |
| Name="${cfg}|${plat}" \ |
| |
| tag Tool \ |
| Name="VCCustomBuildTool" \ |
| Description="Assembling \$(InputFileName)" \ |
| CommandLine="$(eval echo \$asm_${cfg}_cmdline) -o \$(IntDir)\\$objf" \ |
| Outputs="\$(IntDir)\\$objf" \ |
| |
| close_tag FileConfiguration |
| done |
| done |
| fi |
| if [ "$pat" == "c" ] || \ |
| [ "$pat" == "cc" ] || [ "$pat" == "cpp" ]; then |
| for plat in "${platforms[@]}"; do |
| for cfg in Debug Release; do |
| open_tag FileConfiguration \ |
| Name="${cfg}|${plat}" \ |
| |
| tag Tool \ |
| Name="VCCLCompilerTool" \ |
| ObjectFile="\$(IntDir)\\$objf" \ |
| |
| close_tag FileConfiguration |
| done |
| done |
| fi |
| close_tag File |
| |
| break |
| fi |
| done |
| done |
| |
| close_tag Filter |
| IFS="$saveIFS" |
| } |
| |
| # Process command line |
| unset target |
| for opt in "$@"; do |
| optval="${opt#*=}" |
| case "$opt" in |
| --help|-h) show_help |
| ;; |
| --target=*) target="${optval}" |
| ;; |
| --out=*) outfile="$optval" |
| ;; |
| --name=*) name="${optval}" |
| ;; |
| --proj-guid=*) guid="${optval}" |
| ;; |
| --module-def=*) link_opts="${link_opts} ModuleDefinitionFile=${optval}" |
| ;; |
| --exe) proj_kind="exe" |
| ;; |
| --dll) proj_kind="dll" |
| ;; |
| --lib) proj_kind="lib" |
| ;; |
| --src-path-bare=*) |
| src_path_bare=$(fix_path "$optval") |
| src_path_bare=${src_path_bare%/} |
| ;; |
| --static-crt) use_static_runtime=true |
| ;; |
| --ver=*) |
| vs_ver="$optval" |
| case "$optval" in |
| [789]) |
| ;; |
| *) die Unrecognized Visual Studio Version in $opt |
| ;; |
| esac |
| ;; |
| -I*) |
| opt=${opt##-I} |
| opt=$(fix_path "$opt") |
| opt="${opt%/}" |
| incs="${incs}${incs:+;}"${opt}"" |
| yasmincs="${yasmincs} -I"${opt}"" |
| ;; |
| -D*) defines="${defines}${defines:+;}${opt##-D}" |
| ;; |
| -L*) # fudge . to $(OutDir) |
| if [ "${opt##-L}" == "." ]; then |
| libdirs="${libdirs}${libdirs:+;}"\$(OutDir)"" |
| else |
| # Also try directories for this platform/configuration |
| opt=${opt##-L} |
| opt=$(fix_path "$opt") |
| libdirs="${libdirs}${libdirs:+;}"${opt}"" |
| libdirs="${libdirs}${libdirs:+;}"${opt}/\$(PlatformName)/\$(ConfigurationName)"" |
| libdirs="${libdirs}${libdirs:+;}"${opt}/\$(PlatformName)"" |
| fi |
| ;; |
| -l*) libs="${libs}${libs:+ }${opt##-l}.lib" |
| ;; |
| -*) die_unknown $opt |
| ;; |
| *) |
| # The paths in file_list are fixed outside of the loop. |
| file_list[${#file_list[@]}]="$opt" |
| case "$opt" in |
| *.asm) uses_asm=true |
| ;; |
| esac |
| ;; |
| esac |
| done |
| |
| # Make one call to fix_path for file_list to improve performance. |
| fix_file_list file_list |
| |
| outfile=${outfile:-/dev/stdout} |
| guid=${guid:-`generate_uuid`} |
| asm_use_custom_step=false |
| uses_asm=${uses_asm:-false} |
| case "${vs_ver:-8}" in |
| 7) vs_ver_id="7.10" |
| asm_use_custom_step=$uses_asm |
| warn_64bit='Detect64BitPortabilityProblems=true' |
| ;; |
| 8) vs_ver_id="8.00" |
| asm_use_custom_step=$uses_asm |
| warn_64bit='Detect64BitPortabilityProblems=true' |
| ;; |
| 9) vs_ver_id="9.00" |
| asm_use_custom_step=$uses_asm |
| warn_64bit='Detect64BitPortabilityProblems=false' |
| ;; |
| esac |
| |
| [ -n "$name" ] || die "Project name (--name) must be specified!" |
| [ -n "$target" ] || die "Target (--target) must be specified!" |
| |
| if ${use_static_runtime:-false}; then |
| release_runtime=0 |
| debug_runtime=1 |
| lib_sfx=mt |
| else |
| release_runtime=2 |
| debug_runtime=3 |
| lib_sfx=md |
| fi |
| |
| # Calculate debug lib names: If a lib ends in ${lib_sfx}.lib, then rename |
| # it to ${lib_sfx}d.lib. This precludes linking to release libs from a |
| # debug exe, so this may need to be refactored later. |
| for lib in ${libs}; do |
| if [ "$lib" != "${lib%${lib_sfx}.lib}" ]; then |
| lib=${lib%.lib}d.lib |
| fi |
| debug_libs="${debug_libs}${debug_libs:+ }${lib}" |
| done |
| |
| |
| # List Keyword for this target |
| case "$target" in |
| x86*) keyword="ManagedCProj" |
| ;; |
| *) die "Unsupported target $target!" |
| esac |
| |
| # List of all platforms supported for this target |
| case "$target" in |
| x86_64*) |
| platforms[0]="x64" |
| asm_Debug_cmdline="yasm -Xvc -g cv8 -f win64 ${yasmincs} "\$(InputPath)"" |
| asm_Release_cmdline="yasm -Xvc -f win64 ${yasmincs} "\$(InputPath)"" |
| ;; |
| x86*) |
| platforms[0]="Win32" |
| asm_Debug_cmdline="yasm -Xvc -g cv8 -f win32 ${yasmincs} "\$(InputPath)"" |
| asm_Release_cmdline="yasm -Xvc -f win32 ${yasmincs} "\$(InputPath)"" |
| ;; |
| *) die "Unsupported target $target!" |
| ;; |
| esac |
| |
| generate_vcproj() { |
| case "$proj_kind" in |
| exe) vs_ConfigurationType=1 |
| ;; |
| dll) vs_ConfigurationType=2 |
| ;; |
| *) vs_ConfigurationType=4 |
| ;; |
| esac |
| |
| echo "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>" |
| open_tag VisualStudioProject \ |
| ProjectType="Visual C++" \ |
| Version="${vs_ver_id}" \ |
| Name="${name}" \ |
| ProjectGUID="{${guid}}" \ |
| RootNamespace="${name}" \ |
| Keyword="${keyword}" \ |
| |
| open_tag Platforms |
| for plat in "${platforms[@]}"; do |
| tag Platform Name="$plat" |
| done |
| close_tag Platforms |
| |
| open_tag Configurations |
| for plat in "${platforms[@]}"; do |
| plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'` |
| open_tag Configuration \ |
| Name="Debug|$plat" \ |
| OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \ |
| IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \ |
| ConfigurationType="$vs_ConfigurationType" \ |
| CharacterSet="1" \ |
| |
| case "$target" in |
| x86*) |
| case "$name" in |
| vpx) |
| tag Tool \ |
| Name="VCCLCompilerTool" \ |
| Optimization="0" \ |
| AdditionalIncludeDirectories="$incs" \ |
| PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \ |
| RuntimeLibrary="$debug_runtime" \ |
| UsePrecompiledHeader="0" \ |
| WarningLevel="3" \ |
| DebugInformationFormat="2" \ |
| $warn_64bit \ |
| |
| $uses_asm && tag Tool Name="YASM" IncludePaths="$incs" Debug="true" |
| ;; |
| *) |
| tag Tool \ |
| Name="VCCLCompilerTool" \ |
| Optimization="0" \ |
| AdditionalIncludeDirectories="$incs" \ |
| PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \ |
| RuntimeLibrary="$debug_runtime" \ |
| UsePrecompiledHeader="0" \ |
| WarningLevel="3" \ |
| DebugInformationFormat="2" \ |
| $warn_64bit \ |
| |
| $uses_asm && tag Tool Name="YASM" IncludePaths="$incs" Debug="true" |
| ;; |
| esac |
| ;; |
| esac |
| |
| case "$proj_kind" in |
| exe) |
| case "$target" in |
| x86*) |
| case "$name" in |
| *) |
| tag Tool \ |
| Name="VCLinkerTool" \ |
| AdditionalDependencies="$debug_libs \$(NoInherit)" \ |
| AdditionalLibraryDirectories="$libdirs" \ |
| GenerateDebugInformation="true" \ |
| ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \ |
| ;; |
| esac |
| ;; |
| esac |
| ;; |
| lib) |
| case "$target" in |
| x86*) |
| tag Tool \ |
| Name="VCLibrarianTool" \ |
| OutputFile="\$(OutDir)/${name}${lib_sfx}d.lib" \ |
| |
| ;; |
| esac |
| ;; |
| dll) |
| tag Tool \ |
| Name="VCLinkerTool" \ |
| AdditionalDependencies="\$(NoInherit)" \ |
| LinkIncremental="2" \ |
| GenerateDebugInformation="true" \ |
| AssemblyDebug="1" \ |
| TargetMachine="1" \ |
| $link_opts \ |
| |
| ;; |
| esac |
| |
| close_tag Configuration |
| |
| open_tag Configuration \ |
| Name="Release|$plat" \ |
| OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \ |
| IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \ |
| ConfigurationType="$vs_ConfigurationType" \ |
| CharacterSet="1" \ |
| WholeProgramOptimization="0" \ |
| |
| case "$target" in |
| x86*) |
| case "$name" in |
| vpx) |
| tag Tool \ |
| Name="VCCLCompilerTool" \ |
| Optimization="2" \ |
| FavorSizeorSpeed="1" \ |
| AdditionalIncludeDirectories="$incs" \ |
| PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \ |
| RuntimeLibrary="$release_runtime" \ |
| UsePrecompiledHeader="0" \ |
| WarningLevel="3" \ |
| DebugInformationFormat="0" \ |
| $warn_64bit \ |
| |
| $uses_asm && tag Tool Name="YASM" IncludePaths="$incs" |
| ;; |
| *) |
| tag Tool \ |
| Name="VCCLCompilerTool" \ |
| AdditionalIncludeDirectories="$incs" \ |
| Optimization="2" \ |
| FavorSizeorSpeed="1" \ |
| PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \ |
| RuntimeLibrary="$release_runtime" \ |
| UsePrecompiledHeader="0" \ |
| WarningLevel="3" \ |
| DebugInformationFormat="0" \ |
| $warn_64bit \ |
| |
| $uses_asm && tag Tool Name="YASM" IncludePaths="$incs" |
| ;; |
| esac |
| ;; |
| esac |
| |
| case "$proj_kind" in |
| exe) |
| case "$target" in |
| x86*) |
| case "$name" in |
| *) |
| tag Tool \ |
| Name="VCLinkerTool" \ |
| AdditionalDependencies="$libs \$(NoInherit)" \ |
| AdditionalLibraryDirectories="$libdirs" \ |
| |
| ;; |
| esac |
| ;; |
| esac |
| ;; |
| lib) |
| case "$target" in |
| x86*) |
| tag Tool \ |
| Name="VCLibrarianTool" \ |
| OutputFile="\$(OutDir)/${name}${lib_sfx}.lib" \ |
| |
| ;; |
| esac |
| ;; |
| dll) # note differences to debug version: LinkIncremental, AssemblyDebug |
| tag Tool \ |
| Name="VCLinkerTool" \ |
| AdditionalDependencies="\$(NoInherit)" \ |
| LinkIncremental="1" \ |
| GenerateDebugInformation="true" \ |
| TargetMachine="1" \ |
| $link_opts \ |
| |
| ;; |
| esac |
| |
| close_tag Configuration |
| done |
| close_tag Configurations |
| |
| open_tag Files |
| generate_filter srcs "Source Files" "c;cc;cpp;def;odl;idl;hpj;bat;asm;asmx" |
| generate_filter hdrs "Header Files" "h;hm;inl;inc;xsd" |
| generate_filter resrcs "Resource Files" "rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" |
| generate_filter resrcs "Build Files" "mk" |
| close_tag Files |
| |
| tag Globals |
| close_tag VisualStudioProject |
| |
| # This must be done from within the {} subshell |
| echo "Ignored files list (${#file_list[@]} items) is:" >&2 |
| for f in "${file_list[@]}"; do |
| echo " $f" >&2 |
| done |
| } |
| |
| generate_vcproj | |
| sed -e '/"/s;\([^ "]\)/;\1\\;g' > ${outfile} |
| |
| exit |
| <!-- |
| TODO: Add any files not captured by filters. |
| <File |
| RelativePath=".\ReadMe.txt" |
| > |
| </File> |
| --> |