summaryrefslogtreecommitdiff
path: root/db-4.8.30/dist/win_projects/genproject.template
diff options
context:
space:
mode:
Diffstat (limited to 'db-4.8.30/dist/win_projects/genproject.template')
-rw-r--r--db-4.8.30/dist/win_projects/genproject.template420
1 files changed, 420 insertions, 0 deletions
diff --git a/db-4.8.30/dist/win_projects/genproject.template b/db-4.8.30/dist/win_projects/genproject.template
new file mode 100644
index 0000000..9f2546c
--- /dev/null
+++ b/db-4.8.30/dist/win_projects/genproject.template
@@ -0,0 +1,420 @@
+(:
+* IMPORTANT: this file is shared (identical) between the BDB XML and XQilla
+* projects. It should not be changed independently or in any way that makes
+* it project-dependent.
+*
+* @PROJECT_NAME@ - name of the Visual Studio project
+* @PROJECT_INPUT@ - input XML document that drives the script.
+* TBD:
+* 1. Could drive the remaining variables, including Visual Studio
+* variables, off of the xml file and provide the XML input
+* file as an external variable to the query. E.g. some projects
+* may want to parameterize the optimization and warnings levels
+* 2. Generate AdditionalIncludeDirectories based on the <depends> elements for
+* projects rather than just including "all"
+:)
+declare variable $projectList := "@PROJECT_INPUT@";
+declare variable $vsversion := "@VISUAL_STUDIO_VERSION@";
+declare variable $sourcePath := doc($projectList)/projects/variable[@name="sourcePath"];
+declare variable $outputBase := doc($projectList)/projects/variable[@name="outputBase.@VISUAL_STUDIO_VERSION@"];
+
+(: Visual Studio Variables --relatively static :)
+declare variable $debugOptLevel := "0"; (: VS -- no optimization :)
+declare variable $releaseOptLevel := "2"; (: VS -- level 2 opt :)
+declare variable $warnLevel := "3"; (: VS warning level :)
+declare variable $appType := "1"; (: VS type 1 is a program :)
+declare variable $dllType := "2"; (: VS type 2 is a DLL :)
+declare variable $staticType := "4"; (: VS type 4 is a static lib :)
+declare variable $debugInfo := "3"; (: VS debug information format :)
+declare variable $libExtension := ".lib";
+
+(: formatting :)
+declare function local:indent($n)
+{
+ concat("&#xa;",string-join(for $i in (1 to $n) return " ", ""))
+};
+
+(: is it a DLL, Application, or static library? :)
+declare function local:configurationType($projectType)
+{
+ if ($projectType eq "dll") then $dllType
+ else if ($projectType eq "static_lib") then $staticType
+ else $appType
+};
+
+(: "normalize" Windows file paths :)
+declare function local:windowsPath($path) as xs:string
+{
+ translate($path,"/","\\")
+};
+
+(: debug vs release :)
+declare function local:isDebug($config) as xs:boolean
+{
+ contains($config,"Debug")
+};
+
+declare function local:isRelease($config) as xs:boolean
+{
+ contains($config,"Release")
+};
+
+(: machine-target-dependent link options :)
+declare function local:addLinkOptions($project, $platform, $config)
+{
+ let $machine := if (contains($platform,"Win32")) then "/machine:x86"
+ else concat("/machine:",$platform)
+ let $opt := string-join(($machine,$project/options/link[contains(@config,$config)])," ")
+ return if (not($opt eq "")) then attribute{"AdditionalOptions"}{$opt}
+ else ()
+};
+
+declare function local:addDebugInformation($config)
+{
+ attribute{"DebugInformationFormat"}{$debugInfo},
+ if (local:isDebug($config)) then attribute{"BasicRuntimeChecks"}{"3"} else ()
+};
+
+declare function local:generateCompilerPreprocessorDefs($project, $config)
+{
+ let $generic := doc($projectList)/projects/preprocessor[@config="all" or contains($config,@config)]
+ let $proj := $project/preprocessor[@config="all" or contains(@config,$config)]
+ let $type := doc($projectList)/projects/preprocessor[@config=$project/type]
+
+ return string-join(($generic,$proj,$type),";")
+};
+
+(:
+declare function local:generateResourcePreprocessorDefs($config)
+{
+ let $dbg := if (local:isDebug($config)) then "_DEBUG" else "NDEBUG"
+ return concat($dbg,";_CRT_SECURE_NO_DEPRECATE=1")
+};
+:)
+
+(: Optimization level :)
+declare function local:optLevel($config)
+{
+ if (local:isDebug($config)) then $debugOptLevel
+ else $releaseOptLevel
+};
+
+(: MDd is 3, MD is 2, MTd is 1, MT is 0 :)
+declare function local:runtimeLibrary($config,$static as xs:boolean)
+{
+ if (local:isDebug($config)) then
+ if ($static) then "1" else"3"
+ else
+ if ($static) then "0" else"2"
+};
+
+declare function local:getLibName($name, $config)
+{
+ doc($projectList)/projects/library[@name=$name]/libname[@config=$config]
+};
+
+declare function local:makeStaticOutputFile($project, $config)
+{
+ attribute{"OutputFile"}
+ {concat("$(OutDir)/", local:getLibName($project/@name, $config),".lib")
+ }
+};
+
+declare function local:makeImportLibrary($project, $config)
+{
+ if ($project/type eq "dll") then
+ attribute{"ImportLibrary"}{concat("$(OutDir)/", local:getLibName($project/@name, $config),".lib")}
+ else ()
+};
+
+declare function local:makeModuleDefinition($project, $config)
+{
+ if (not(empty($project/moddef))) then
+ attribute{"ModuleDefinitionFile"}{local:windowsPath(concat($sourcePath,$project/moddef/@file))}
+ else ()
+};
+
+declare function local:makeOutputPDBFile($project, $config)
+{
+ attribute{"ProgramDatabaseFile"}
+ {
+ if ($project/type eq "dll") then
+ concat("$(OutDir)/", local:getLibName($project/@name, $config),".pdb")
+ else
+ concat("$(OutDir)/",if (not(empty($project/@output))) then $project/@output else $project/@name,".pdb")
+ }
+};
+
+declare function local:makeOutputFile($project, $config)
+{
+ attribute{"OutputFile"}
+ {
+ if ($project/type eq "dll") then
+ concat("$(OutDir)/", local:getLibName($project/@name, $config), ".dll")
+ else
+ concat("$(OutDir)/",if (not(empty($project/@output))) then $project/@output else $project/@name,".exe")
+ }
+};
+
+declare function local:makeOutputObjectFile($project, $config)
+{
+ attribute{"ObjectFile"}
+ {
+ concat("$(OutDir)/",if (not(empty($project/@output))) then $project/@output else $project/@name,"/")
+ }
+};
+
+(: The simple thing is to add all libraries for all projects :)
+declare function local:addLibraryDependencies($project,$config)
+{
+ attribute{"AdditionalDependencies"}{string-join(for $dep in $project/depends
+ return concat(local:getLibName($dep, $config),".lib")," ")}
+};
+
+declare function local:makeLibraryDirectory($lib,$platform,$config)
+{
+ for $dir in $lib/platform[contains(@name,$platform)]/config[$config=./@type]/libdir
+ return
+ if (not(empty($lib/libbase[@vsver=$vsversion]))) then
+ concat($lib/libbase[@vsver=$vsversion],"/", $dir)
+ else $dir
+};
+
+(: The simple thing is to add all libraries for all projects :)
+declare function local:addLibraryDirectories($project,$platform,$config)
+{
+ attribute{"AdditionalLibraryDirectories"}{string-join(for $dep in $project/depends
+ return local:makeLibraryDirectory(doc($projectList)/projects/library[@name=$dep],$platform,$config),";")}
+};
+
+(: The simple thing is to add all libraries for all projects :)
+declare function local:addIncludeDirectories($project,$config)
+{
+ let $incref := for $inc in $project/include[@type="ref"] return doc($projectList)/projects/include[@name=$inc]
+ let $increl := $project/include[@type="rel"]
+ return
+ attribute{"AdditionalIncludeDirectories"}{string-join(($incref,$increl),",")}
+};
+
+(: look for project-specific tool, then a type-specific event :)
+declare function local:generatePostBuildEvent($project, $config)
+{
+local:indent(6),<Tool>
+ {attribute{"Name"}{"VCPostBuildEventTool"}}
+ {if (not(empty($project/event[@name="postbuild"]))) then
+ (attribute{"CommandLine"}{$project/event[@name="postbuild"]/command[@config=$config]},
+ attribute{"Description"}{$project/event[@name="postbuild"]/description})
+ else let $ev := doc($projectList)/projects/event[@name="postbuild" and @type=$project/type]
+ return if (not(empty($ev))) then
+ (attribute{"CommandLine"}{replace($ev/command[@config=$config],"@pname@",if (not(empty($project/@output))) then $project/@output else $project/@name)},
+ attribute{"Description"}{$ev/description})
+ else ()
+ }
+</Tool>
+};
+
+declare function local:generateCustomBuildTool($project, $config)
+{
+local:indent(6),<Tool>
+ {attribute{"Name"}{"VCCustomBuildTool"}}
+ {if (not(empty($project/event[@name="custom"]))) then
+ (attribute{"CommandLine"}{$project/event[@name="custom"]/command[contains(@config,$config)]},
+ attribute{"Outputs"}{$project/event[@name="custom"]/output})
+ else ()}
+</Tool>
+};
+
+(:
+ static build of libraries; at this time it does *not* add additional
+ dependent libraries. This means that applications need to include them
+ for the time being.
+:)
+declare function local:generateConfigLibrarian($project, $config)
+{
+local:indent(6),<Tool>
+ {attribute{"Name"}{"VCLibrarianTool"}}
+ {local:makeStaticOutputFile($project,$config)}
+</Tool>
+};
+
+declare function local:generateConfigLinkerAndMidl($project, $platform, $config)
+{
+local:indent(6),<Tool>
+ {attribute{"Name"}{"VCLinkerTool"}}
+ {local:addLinkOptions($project, $platform, $config)}
+ {local:addLibraryDependencies($project,$config)}
+ {local:addLibraryDirectories($project,$platform,$config)}
+ {local:makeOutputFile($project, $config)}
+ {local:makeOutputPDBFile($project, $config)}
+ {attribute{"LinkIncremental"}{"1"}}
+ {attribute{"GenerateDebugInformation"}{"TRUE"}}
+ {attribute{"SuppressStartupBanner"}{"TRUE"}}
+ {attribute{"OptimizeReferences"}{"2"}}
+ {local:makeImportLibrary($project,$config)}
+ {local:makeModuleDefinition($project,$config)}
+ {attribute{"TargetMachine"}{"0"}}
+</Tool>
+};
+
+declare function local:generateConfigCompiler($project, $platform, $config, $static as xs:boolean)
+{
+local:indent(6),<Tool>
+ {attribute{"Name"}{"VCCLCompilerTool"}}
+ {attribute{"Optimization"}{local:optLevel($config)}}
+ {attribute{"MinimalRebuild"}{"TRUE"}}
+ {if (local:isRelease($config)) then attribute{"InlineFunctionExpansion"}{"1"} else ()}
+ {if (contains($project/options/compile/@platform, $platform)) then attribute{"AdditionalOptions"}{$project/options/compile/text()} else ()}
+ {local:addIncludeDirectories($project,$config)}
+ {attribute{"PreprocessorDefinitions"}{local:generateCompilerPreprocessorDefs($project, $config)}}
+ {attribute{"StringPooling"}{"TRUE"}}
+ {if (not(empty($project/options/rtti))) then attribute{"RuntimeTypeInfo"}{"TRUE"} else ()}
+ {attribute{"RuntimeLibrary"}{local:runtimeLibrary($config,$static)}}
+ {if (local:isRelease($config)) then attribute{"EnableFunctionLevelLinking"}{"TRUE"} else ()}
+ {attribute{"UsePrecompiledHeader"}{"0"}}
+ {if ($project/@name eq "dbxml") then attribute{"PrecompiledHeaderThrough"}{"DbXmlInternal.hpp"} else ()}
+ {attribute{"PrecompiledHeaderFile"}{concat("./$(OutDir)/",$project/@name,".pch")}}
+ {attribute{"AssemblerListingLocation"}{local:makeOutputObjectFile($project, $config)}}
+ {attribute{"ObjectFile"}{local:makeOutputObjectFile($project, $config)}}
+ {attribute{"WarningLevel"}{$warnLevel}}
+ {if (not($vsversion eq "8.00") and not($project/options/nowp64)) then attribute{"Detect64BitPortabilityProblems"}{"TRUE"} else ()}
+ {attribute{"SuppressStartupBanner"}{"TRUE"}}
+ {local:addDebugInformation($config)}
+ {attribute{"CompileAs"}{"0"}}
+</Tool>
+};
+
+declare function local:generateConfigBoilerplate($config)
+{
+local:indent(6),<Tool Name="VCPreBuildEventTool"/>,
+local:indent(6),<Tool Name="VCPreLinkEventTool"/>,
+local:indent(6),<Tool Name="VCResourceCompilerTool"/>,
+local:indent(6),<Tool Name="VCXMLDataGeneratorTool"/>,
+local:indent(6),<Tool Name="VCManagedWrapperGeneratorTool"/>,
+local:indent(6),<Tool Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+};
+
+(: use "platform/configuration" :)
+declare function local:generateOutputDirectory($platform,$config,$static)
+{
+ attribute{"OutputDirectory"}{local:windowsPath(concat($outputBase,"$(PlatformName)","/",string-join(tokenize($config," "),"_"),$static))}
+};
+
+declare function local:generateConfig($project, $platform, $config)
+{
+local:indent(4),<Configuration>
+ {attribute{"Name"}{concat($config,"|",$platform)}}
+ {local:generateOutputDirectory($platform,$config,"")}
+ {attribute{"IntermediateDirectory"}{concat("./$(OutDir)/",$project/@name)}}
+ {attribute{"ConfigurationType"}{local:configurationType($project/type)}}
+ {attribute{"UseOfMFC"}{"0"}}
+ {attribute{"ATLMinimizesCRunTimeLibraryUsage"}{"FALSE"}}
+ {attribute{"CharacterSet"}{"2"}}
+ {local:generateConfigBoilerplate($config)}
+ {local:generateConfigCompiler($project, $platform, $config,xs:boolean("false"))}
+ {local:generateConfigLinkerAndMidl($project, $platform, $config)}
+ {local:generatePostBuildEvent($project,if (local:isDebug($config)) then "Debug" else "Release")}
+ {local:generateCustomBuildTool($project,if (local:isDebug($config)) then "Debug" else "Release")}
+ </Configuration>
+};
+
+declare function local:generateStaticConfig($project, $platform, $config)
+{
+ local:indent(4),<Configuration>
+ {attribute{"Name"}{concat($config,"|",$platform)}}
+ {local:generateOutputDirectory($platform,$config,"_static")}
+ {attribute{"IntermediateDirectory"}{concat("./$(OutDir)/",$project/@name)}}
+ {attribute{"ConfigurationType"}{local:configurationType($project/type)}}
+ {attribute{"UseOfMFC"}{"0"}}
+ {attribute{"ATLMinimizesCRunTimeLibraryUsage"}{"FALSE"}}
+ {attribute{"CharacterSet"}{"2"}}
+ {local:generateConfigBoilerplate($config)}
+ {local:generateConfigCompiler($project, $platform, $config,xs:boolean("true"))}
+ {if (contains($project/type,"lib")) then
+ local:generateConfigLibrarian($project, $config)
+ else
+ local:generateConfigLinkerAndMidl($project, $platform, $config)
+ }
+ </Configuration>
+};
+
+declare function local:generateRcFile($file)
+{
+ local:indent(4),<File RelativePath="{local:windowsPath(concat($sourcePath,$file/@name))}">
+ { for $platform in local:getPlatforms($vsversion) return
+ for $config in ("Debug","Release") return
+ (local:indent(6),<FileConfiguration Name="{concat($config,"|",$platform)}">
+ <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="{concat(if ($config="Debug") then "_DEBUG" else "NDEBUG",";","$(NoInherit))")}"/>
+ {local:indent(6)}</FileConfiguration>)
+ }
+ {local:indent(4)}</File>
+};
+
+declare function local:generateFilesNoFilter($project)
+{
+ for $file in $project/files/file
+ return if (ends-with($file/@name,".rc")) then local:generateRcFile($file)
+ else (local:indent(4),<File RelativePath="{local:windowsPath(concat($sourcePath,$file/@name))}"/>)
+};
+
+declare function local:generateFilesWithFilter($project,$filter)
+{
+ for $file in $project/files/filter[@name=$filter]/file
+ return if (ends-with($file/@name,".rc")) then local:generateRcFile($file)
+ else (local:indent(6),<File RelativePath="{local:windowsPath(concat($sourcePath,$file/@name))}"/>)
+};
+
+declare function local:generateFiles($project)
+{
+ let $filters := $project/files/filter/@name
+ return if (empty($filters)) then
+ local:generateFilesNoFilter($project)
+ else
+ for $filter in $filters
+ return (local:indent(4),<Filter Name="{$filter}" Filter="">
+ {local:generateFilesWithFilter($project,$filter)}
+ {local:indent(4)}</Filter>)
+};
+
+declare function local:getGuid($project)
+{
+ concat("{",$project/@guid,"}")
+};
+
+declare function local:getPlatforms($version)
+{
+ if ($version eq "7.10") then ("Win32")
+ else ("Win32", "x64", "IA64")
+};
+
+declare function local:getProjects()
+{
+ (: doc($projectList)/projects/project :)
+ doc($projectList)/projects/project[@name="@PROJECT_NAME@"]
+};
+
+for $project in local:getProjects()
+let $static := contains($project/@name,"static")
+let $proj := if ($static) then doc($projectList)/projects/project[@name=substring-before($project/@name,"_static")] else $project
+return
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="{$vsversion}"
+ Name="{string($project/@name)}"
+ ProjectGUID="{local:getGuid($project)}">
+ {local:indent(2)}<Platforms>
+ {local:indent(4)}<Platform Name="Win32"/>
+ {local:indent(4)}<Platform Name="x64"/>
+ {local:indent(4)}<Platform Name="IA64"/>
+ {local:indent(2)}</Platforms>
+ {local:indent(2)}<Configurations>
+ {
+ for $platform in local:getPlatforms($vsversion) return
+ for $config in ("Debug","Release") return if ($static) then local:generateStaticConfig($project, $platform, $config) else local:generateConfig($project, $platform, $config)
+ }
+ {local:indent(2)}</Configurations>
+ {local:indent(2)}<References/>
+ {local:indent(2)}<Files>
+ {local:generateFiles($proj)}
+ {local:indent(2)}</Files>
+ {local:indent(2)}<Globals/>
+{"&#xa;"}</VisualStudioProject>