From 11b907ebf45f5a0707c2748b8f7413b2910976a8 Mon Sep 17 00:00:00 2001 From: Littleboy Date: Sun, 24 Apr 2011 12:34:57 -0400 Subject: CREATE_PROJECT: Update revision number support (fixes bug #3280881) Replace existing environment variable based revision number support by a file-based method - Generate a special header file in the build output folder with the current revision number - Include the new header file from internal_version.h when a specific define is set - Update create_project to define SCUMMVM_INTERNAL_REVISION as needed and add the build output folder to the include path - Remove support for git-svn clones in the revision script (not useful anymore after the switch to git) --- devtools/create_project/msbuild.cpp | 11 +++-- devtools/create_project/msbuild.h | 2 +- devtools/create_project/msvc.cpp | 6 +-- devtools/create_project/msvc.h | 3 +- devtools/create_project/scripts/postbuild.cmd | 4 +- devtools/create_project/scripts/prebuild.cmd | 16 +++++-- devtools/create_project/scripts/revision.vbs | 69 ++++++++++++++------------- devtools/create_project/visualstudio.cpp | 8 +++- devtools/create_project/visualstudio.h | 2 +- 9 files changed, 68 insertions(+), 53 deletions(-) (limited to 'devtools') diff --git a/devtools/create_project/msbuild.cpp b/devtools/create_project/msbuild.cpp index 070d7fea60..1198ff9a09 100644 --- a/devtools/create_project/msbuild.cpp +++ b/devtools/create_project/msbuild.cpp @@ -283,7 +283,7 @@ void MSBuildProvider::outputProjectSettings(std::ofstream &project, const std::s project << "\t\n"; } -void MSBuildProvider::outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix) { +void MSBuildProvider::outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents) { std::string warnings; for (StringList::const_iterator i = _globalWarnings.begin(); i != _globalWarnings.end(); ++i) @@ -293,6 +293,10 @@ void MSBuildProvider::outputGlobalPropFile(std::ofstream &properties, int bits, for (StringList::const_iterator i = defines.begin(); i != defines.end(); ++i) definesList += *i + ';'; + // Add define to include revision header + if (runBuildEvents) + definesList += "SCUMMVM_INTERNAL_REVISION;"; + properties << "\n" "\n" "\t\n" @@ -308,7 +312,7 @@ void MSBuildProvider::outputGlobalPropFile(std::ofstream &properties, int bits, "\t\t\n" "\t\t\ttrue\n" "\t\t\t" << warnings << ";%(DisableSpecificWarnings)\n" - "\t\t\t$(SCUMMVM_LIBS)\\include;" << prefix << ";" << prefix << "\\engines;%(AdditionalIncludeDirectories)\n" + "\t\t\t$(SCUMMVM_LIBS)\\include;" << prefix << ";" << prefix << "\\engines;$(TargetDir);%(AdditionalIncludeDirectories)\n" "\t\t\t" << definesList << "%(PreprocessorDefinitions)\n" "\t\t\t\n" "\t\t\tfalse\n" @@ -436,9 +440,6 @@ void MSBuildProvider::writeFileListToProject(const FileNode &dir, std::ofstream projectFile << "\t\t\n" "\t\t\t$(IntDir)" << (*entry).prefix << "%(Filename).obj\n"; - if (hasEnding((*entry).path, "base\\version.cpp")) - projectFile << "\t\t\tSCUMMVM_REVISION#" $(SCUMMVM_REVISION_STRING)";%(PreprocessorDefinitions)\n"; - projectFile << "\t\t\n"; } else { projectFile << "\t\t\n"; diff --git a/devtools/create_project/msbuild.h b/devtools/create_project/msbuild.h index fa5311734b..cc545e4755 100644 --- a/devtools/create_project/msbuild.h +++ b/devtools/create_project/msbuild.h @@ -45,7 +45,7 @@ protected: void writeReferences(std::ofstream &output); - void outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix); + void outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents); void createBuildProp(const BuildSetup &setup, bool isRelease, bool isWin32, bool enableAnalysis); diff --git a/devtools/create_project/msvc.cpp b/devtools/create_project/msvc.cpp index e2fff59c46..ccdf4ac82b 100644 --- a/devtools/create_project/msvc.cpp +++ b/devtools/create_project/msvc.cpp @@ -124,7 +124,7 @@ void MSVCProvider::createGlobalProp(const BuildSetup &setup) { if (!properties) error("Could not open \"" + setup.outputDir + '/' + "ScummVM_Global" + getPropertiesExtension() + "\" for writing"); - outputGlobalPropFile(properties, 32, setup.defines, convertPathToWin(setup.filePrefix)); + outputGlobalPropFile(properties, 32, setup.defines, convertPathToWin(setup.filePrefix), setup.runBuildEvents); properties.close(); properties.open((setup.outputDir + '/' + "ScummVM_Global64" + getPropertiesExtension()).c_str()); @@ -143,7 +143,7 @@ void MSVCProvider::createGlobalProp(const BuildSetup &setup) { x64Defines.push_back("WIN32"); x64Defines.push_back("SDL_BACKEND"); - outputGlobalPropFile(properties, 64, x64Defines, convertPathToWin(setup.filePrefix)); + outputGlobalPropFile(properties, 64, x64Defines, convertPathToWin(setup.filePrefix), setup.runBuildEvents); } std::string MSVCProvider::getPreBuildEvent() const { @@ -152,7 +152,7 @@ std::string MSVCProvider::getPreBuildEvent() const { cmdLine = "@echo off\n" "echo Executing Pre-Build script...\n" "echo.\n" - "@call "$(SolutionDir)../../devtools/create_project/scripts/prebuild.cmd" "$(SolutionDir)/../.."\n" + "@call "$(SolutionDir)../../devtools/create_project/scripts/prebuild.cmd" "$(SolutionDir)/../.." "$(TargetDir)"\n" "EXIT /B0"; return cmdLine; diff --git a/devtools/create_project/msvc.h b/devtools/create_project/msvc.h index f41ecc3aba..b2f2a5d33f 100644 --- a/devtools/create_project/msvc.h +++ b/devtools/create_project/msvc.h @@ -59,8 +59,9 @@ protected: * @param bits Number of bits the platform supports. * @param defines Defines the platform needs to have set. * @param prefix File prefix, used to add additional include paths. + * @param runBuildEvents true if generating a revision number, false otherwise */ - virtual void outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix) = 0; + virtual void outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents) = 0; /** * Generates the project properties for debug and release settings. diff --git a/devtools/create_project/scripts/postbuild.cmd b/devtools/create_project/scripts/postbuild.cmd index 5c2bd8a1ad..f548b81442 100644 --- a/devtools/create_project/scripts/postbuild.cmd +++ b/devtools/create_project/scripts/postbuild.cmd @@ -12,7 +12,7 @@ REM Root folder REM Output folder REM Architecture -if "%~1"=="" goto error_input +if "%~1"=="" goto error_root if "%~2"=="" goto error_output if "%~3"=="" goto error_arch @@ -29,7 +29,7 @@ xcopy /F /Y "%~1/gui/themes/translations.dat" %~2 > NUL 2>&1 xcopy /F /Y "%SCUMMVM_LIBS%/lib/%~3/SDL.dll" %~2 > NUL 2>&1 goto done -:error_output +:error_root echo Invalid root folder (%~1)! goto done diff --git a/devtools/create_project/scripts/prebuild.cmd b/devtools/create_project/scripts/prebuild.cmd index b824f0d5a0..dd4d12a851 100644 --- a/devtools/create_project/scripts/prebuild.cmd +++ b/devtools/create_project/scripts/prebuild.cmd @@ -4,22 +4,28 @@ REM --------------------------------------------------------------- REM -- Pre-Build Script REM --------------------------------------------------------------- REM -REM Generate file with proper revision number +REM Generate file with revision number REM REM Expected parameters -REM Root folder +REM Root folder (the source root folder) +REM Target folder (the build output folder, will be used to copy internal_revision.h) -if "%~1"=="" goto error_input +if "%~1"=="" goto error_root +if "%~2"=="" goto error_target REM Run the revision script -@call cscript "%~1/devtools/create_project/scripts/revision.vbs" %~1 1>NUL +@call cscript "%~1/devtools/create_project/scripts/revision.vbs" %~1 %~2 1>NUL if not %errorlevel% == 0 goto error_script goto done -:error_output +:error_root echo Invalid root folder (%~1)! goto done +:error_target +echo Invalid target folder (%~2)! +goto done + :error_script: echo An error occured while running the revision script! diff --git a/devtools/create_project/scripts/revision.vbs b/devtools/create_project/scripts/revision.vbs index 851185371b..9c29a88f2d 100644 --- a/devtools/create_project/scripts/revision.vbs +++ b/devtools/create_project/scripts/revision.vbs @@ -35,6 +35,7 @@ Dim WshShell : Set WshShell = CreateObject("WScript.Shell") ' Folders Dim rootFolder : rootFolder = "" +Dim targetFolder : targetFolder = "" ' Info variables Dim tool : tool = "" @@ -85,23 +86,25 @@ Sub DetermineRevision() Wscript.StdErr.WriteLine "Found revision " & revision & " on branch " & branch & vbCrLf ' Setup our revision string - Dim revisionString : revisionString = "r" & revision + Dim revisionString : revisionString = revision If (modified) Then - revisionString = revisionString & " M" + revisionString = revisionString & "-dirty" End If ' If we are not on trunk, add the branch name to the revision string - If (branch <> "trunk" And branch <> "") Then - revisionString = revisionString & " (" & branch & ")" + If (branch <> "trunk" And branch <> "master" And branch <> "") Then + revisionString = revisionString & "(" & branch & ")" End If - ' Add the DVCS name at the end - revisionString = revisionString & " - " & tool + ' Add the DVCS name at the end (when not git) + If (tool <> "git") Then + revisionString = revisionString & "-" & tool + End If - ' Setup an environment variable with the revision string - Dim Env: Set Env = WshShell.Environment("User") - Env.item("SCUMMVM_REVISION_STRING") = revisionString + ' Output revision header file + FSO.CopyFile rootFolder & "\\base\\internal_revision.h.in", targetFolder & "\\internal_revision.h" + FindReplaceInFile targetFolder & "\\internal_revision.h", "@REVISION@", revisionString End Sub Function DetermineTortoiseSVNVersion() @@ -283,29 +286,9 @@ Function DetermineGitVersion() End If End If - ' Check for svn clones - Set oExec = WshShell.Exec(gitPath & "log --pretty=format:%s --grep=" & Chr(34) & "^(svn r[0-9]*)" & Chr(34) & " -1 " & rootFolder) - if Err.Number = 0 Then - revision = Mid(oExec.StdOut.ReadLine(), 7) - revision = Mid(revision, 1, InStr(revision, ")") - 1) - tool = "svn-git" - End If - - ' No revision? Maybe it is a custom git-svn clone - If revision = "" Then - Err.Clear - Set oExec = WshShell.Exec(gitPath & "log --pretty=format:%b --grep=" & Chr(34) & "git-svn-id:.*@[0-9]*" & Chr(34) & " -1 " & rootFolder) - If Err.Number = 0 Then - revision = oExec.StdOut.ReadLine() - revision = Mid(revision, InStr(revision, "@") + 1) - revision = Mid(revision, 1, InStr(revision, " ") - 1) - tool = "svn-git" - End If - End If - ' Fallback to abbreviated revision number If revision = "" Then - revision = Mid(hash, 1, 8) + revision = Mid(hash, 1, 7) End If DetermineGitVersion = True @@ -385,8 +368,8 @@ End Function Function ParseCommandLine() ParseCommandLine = True - If Wscript.Arguments.Count <> 1 Then - Wscript.StdErr.WriteLine "[Error] Invalid number of arguments (was: " & Wscript.Arguments.Count & ", expected: 1)" + If Wscript.Arguments.Count <> 2 Then + Wscript.StdErr.WriteLine "[Error] Invalid number of arguments (was: " & Wscript.Arguments.Count & ", expected: 2)" ParseCommandLine = False Exit Function @@ -394,6 +377,7 @@ Function ParseCommandLine() ' Get our arguments rootFolder = Wscript.Arguments.Item(0) + targetFolder = Wscript.Arguments.Item(1) ' Check that the folders are valid If Not FSO.FolderExists(rootFolder) Then @@ -403,8 +387,16 @@ Function ParseCommandLine() Exit Function End If - ' Set absolute path + If Not FSO.FolderExists(targetFolder) Then + Wscript.StdErr.WriteLine "[Error] Invalid target folder (" & targetFolder & ")" + + ParseCommandLine = False + Exit Function + End If + + ' Set absolute paths rootFolder = FSO.GetAbsolutePathName(rootFolder) + targetFolder = FSO.GetAbsolutePathName(targetFolder) End Function Function ReadRegistryKey(shive, subkey, valuename, architecture) @@ -443,3 +435,14 @@ Function ReadRegistryKey(shive, subkey, valuename, architecture) ReadRegistryKey = Outparams.SValue End Function + +Sub FindReplaceInFile(filename, to_find, replacement) + Dim file, data + Set file = FSO.OpenTextFile(filename, 1, 0, 0) + data = file.ReadAll + file.Close + data = Replace(data, to_find, replacement) + Set file = FSO.CreateTextFile(filename, -1, 0) + file.Write data + file.Close +End Sub diff --git a/devtools/create_project/visualstudio.cpp b/devtools/create_project/visualstudio.cpp index 390d0fba1f..41693dcc3a 100644 --- a/devtools/create_project/visualstudio.cpp +++ b/devtools/create_project/visualstudio.cpp @@ -193,7 +193,7 @@ void VisualStudioProvider::writeReferences(std::ofstream &output) { output << "\tEndProjectSection\n"; } -void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix) { +void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int bits, const StringList &defines, const std::string &prefix, bool runBuildEvents) { std::string warnings; for (StringList::const_iterator i = _globalWarnings.begin(); i != _globalWarnings.end(); ++i) warnings += *i + ';'; @@ -205,6 +205,10 @@ void VisualStudioProvider::outputGlobalPropFile(std::ofstream &properties, int b definesList += *i; } + // Add define to include revision header + if (runBuildEvents) + definesList += "SCUMMVM_INTERNAL_REVISION;"; + properties << "\n" "