mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Add tool capable of downloading a TclKit (and its associated SDK) on Windows.
FossilOrigin-Name: 50673ddaf813335777673fa8585997a7551e5323
This commit is contained in:
14
manifest
14
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Convert\sthe\stool/tostr.awk\sscript\sinto\stool/tostr.tcl.\s\sRemove\stwo\sobsolete\nMakefiles.\s\sPurge\sNAWK\sfrom\sthe\sconfigure\sscript\sand\sfrom\sunix\smakefiles.\nThere\sare\sstill\stwo\suses\sof\sNAWK\sin\sMakefile.msc.
|
C Add\stool\scapable\sof\sdownloading\sa\sTclKit\s(and\sits\sassociated\sSDK)\son\sWindows.
|
||||||
D 2015-10-07T12:36:42.935
|
D 2015-10-09T17:36:06.162
|
||||||
F Makefile.in 2a247c733c2dd6fab703df04dd009b26413956f5
|
F Makefile.in 2a247c733c2dd6fab703df04dd009b26413956f5
|
||||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||||
F Makefile.msc 17ce18bb7e9ca2ad3abed9b0a1fcbef3fbe8f307
|
F Makefile.msc 17ce18bb7e9ca2ad3abed9b0a1fcbef3fbe8f307
|
||||||
@@ -1331,6 +1331,8 @@ F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e
|
|||||||
F test/wordcount.c 9915e06cb33d8ca8109b8700791afe80d305afda
|
F test/wordcount.c 9915e06cb33d8ca8109b8700791afe80d305afda
|
||||||
F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa
|
F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa
|
||||||
F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac
|
F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac
|
||||||
|
F tool/GetFile.cs 963f7064b0b221b08feadb28894c3537916261ac
|
||||||
|
F tool/GetTclKit.bat 46092b151f7bb4f2a2735dfa1ada09736a4b35a4
|
||||||
F tool/addopcodes.tcl 7cc82ecca456a6b3148abf492b0419b83140881a
|
F tool/addopcodes.tcl 7cc82ecca456a6b3148abf492b0419b83140881a
|
||||||
F tool/build-all-msvc.bat 761d8c82a1a529261291812732a853a1b4256d85 x
|
F tool/build-all-msvc.bat 761d8c82a1a529261291812732a853a1b4256d85 x
|
||||||
F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367
|
F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367
|
||||||
@@ -1387,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
|||||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||||
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
|
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
|
||||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||||
P 8bbf37142ef2759274668f6da114b5c8072e42db
|
P 5b6775215327a89232f5059653747a18e83b8b4b
|
||||||
R 07b752064456f02ed0865632d443e697
|
R 785a6cb71a38ff7702fb9be84ec0066b
|
||||||
U drh
|
U mistachkin
|
||||||
Z 7087d810f3111cb2f52748462bb8f6e3
|
Z 9f18b94f6375bd392631336361a9d038
|
||||||
|
@@ -1 +1 @@
|
|||||||
5b6775215327a89232f5059653747a18e83b8b4b
|
50673ddaf813335777673fa8585997a7551e5323
|
450
tool/GetFile.cs
Normal file
450
tool/GetFile.cs
Normal file
@@ -0,0 +1,450 @@
|
|||||||
|
/*
|
||||||
|
** 2015 October 7
|
||||||
|
**
|
||||||
|
** The author disclaims copyright to this source code. In place of
|
||||||
|
** a legal notice, here is a blessing:
|
||||||
|
**
|
||||||
|
** May you do good and not evil.
|
||||||
|
** May you find forgiveness for yourself and forgive others.
|
||||||
|
** May you share freely, never taking more than you give.
|
||||||
|
**
|
||||||
|
*************************************************************************
|
||||||
|
** This file contains C# code to download a single file based on a URI.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#region Assembly Metadata
|
||||||
|
[assembly: AssemblyTitle("GetFile Tool")]
|
||||||
|
[assembly: AssemblyDescription("Download a single file based on a URI.")]
|
||||||
|
[assembly: AssemblyCompany("SQLite Development Team")]
|
||||||
|
[assembly: AssemblyProduct("SQLite")]
|
||||||
|
[assembly: AssemblyCopyright("Public Domain")]
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
[assembly: Guid("5c4b3728-1693-4a33-a218-8e6973ca15a6")]
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
[assembly: AssemblyConfiguration("Debug")]
|
||||||
|
#else
|
||||||
|
[assembly: AssemblyConfiguration("Release")]
|
||||||
|
#endif
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
namespace GetFile
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This enumeration is used to represent all the possible exit codes from
|
||||||
|
/// this tool.
|
||||||
|
/// </summary>
|
||||||
|
internal enum ExitCode
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The file download was a success.
|
||||||
|
/// </summary>
|
||||||
|
Success = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The command line arguments are missing (i.e. null). Generally,
|
||||||
|
/// this should not happen.
|
||||||
|
/// </summary>
|
||||||
|
MissingArgs = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The wrong number of command line arguments was supplied.
|
||||||
|
/// </summary>
|
||||||
|
WrongNumArgs = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The URI specified on the command line could not be parsed as a
|
||||||
|
/// supported absolute URI.
|
||||||
|
/// </summary>
|
||||||
|
BadUri = 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The file name portion of the URI specified on the command line
|
||||||
|
/// could not be extracted from it.
|
||||||
|
/// </summary>
|
||||||
|
BadFileName = 4,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The temporary directory is either invalid (i.e. null) or does not
|
||||||
|
/// represent an available directory.
|
||||||
|
/// </summary>
|
||||||
|
BadTempPath = 5,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// An exception was caught in <see cref="Main" />. Generally, this
|
||||||
|
/// should not happen.
|
||||||
|
/// </summary>
|
||||||
|
Exception = 6,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The file download was canceled. This tool does not make use of
|
||||||
|
/// the <see cref="WebClient.CancelAsync" /> method; therefore, this
|
||||||
|
/// should not happen.
|
||||||
|
/// </summary>
|
||||||
|
DownloadCanceled = 7,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The file download encountered an error. Further information about
|
||||||
|
/// this error should be displayed on the console.
|
||||||
|
/// </summary>
|
||||||
|
DownloadError = 8
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
internal static class Program
|
||||||
|
{
|
||||||
|
#region Private Data
|
||||||
|
/// <summary>
|
||||||
|
/// This is used to synchronize multithreaded access to the
|
||||||
|
/// <see cref="previousPercent" /> and <see cref="exitCode"/>
|
||||||
|
/// fields.
|
||||||
|
/// </summary>
|
||||||
|
private static readonly object syncRoot = new object();
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This event will be signed when the file download has completed,
|
||||||
|
/// even if the file download itself was canceled or unsuccessful.
|
||||||
|
/// </summary>
|
||||||
|
private static EventWaitHandle doneEvent;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The previous file download completion percentage seen by the
|
||||||
|
/// <see cref="DownloadProgressChanged" /> event handler. This value
|
||||||
|
/// is never decreased, nor is it ever reset to zero.
|
||||||
|
/// </summary>
|
||||||
|
private static int previousPercent = 0;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This will be the exit code returned by this tool after the file
|
||||||
|
/// download completes, successfully or otherwise. This value is only
|
||||||
|
/// changed by the <see cref="DownloadFileCompleted" /> event handler.
|
||||||
|
/// </summary>
|
||||||
|
private static ExitCode exitCode = ExitCode.Success;
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#region Private Support Methods
|
||||||
|
/// <summary>
|
||||||
|
/// This method displays an error message to the console and/or
|
||||||
|
/// displays the command line usage information for this tool.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">
|
||||||
|
/// The error message to display, if any.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="usage">
|
||||||
|
/// Non-zero to display the command line usage information.
|
||||||
|
/// </param>
|
||||||
|
private static void Error(
|
||||||
|
string message,
|
||||||
|
bool usage
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (message != null)
|
||||||
|
Console.WriteLine(message);
|
||||||
|
|
||||||
|
string fileName = Path.GetFileName(
|
||||||
|
Process.GetCurrentProcess().MainModule.FileName);
|
||||||
|
|
||||||
|
Console.WriteLine(String.Format("usage: {0} <uri>", fileName));
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This method attempts to determine the file name portion of the
|
||||||
|
/// specified URI.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uri">
|
||||||
|
/// The URI to process.
|
||||||
|
/// </param>
|
||||||
|
/// <returns>
|
||||||
|
/// The file name portion of the specified URI -OR- null if it cannot
|
||||||
|
/// be determined.
|
||||||
|
/// </returns>
|
||||||
|
private static string GetFileName(
|
||||||
|
Uri uri
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (uri == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
string pathAndQuery = uri.PathAndQuery;
|
||||||
|
|
||||||
|
if (String.IsNullOrEmpty(pathAndQuery))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
int index = pathAndQuery.LastIndexOf('/');
|
||||||
|
|
||||||
|
if ((index < 0) || (index == pathAndQuery.Length))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return pathAndQuery.Substring(index + 1);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#region Private Event Handlers
|
||||||
|
/// <summary>
|
||||||
|
/// This method is an event handler that is called when the file
|
||||||
|
/// download completion percentage changes. It will display progress
|
||||||
|
/// on the console. Special care is taken to make sure that progress
|
||||||
|
/// events are not displayed out-of-order, even if duplicate and/or
|
||||||
|
/// out-of-order events are received.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">
|
||||||
|
/// The source of the event.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="e">
|
||||||
|
/// Information for the event being processed.
|
||||||
|
/// </param>
|
||||||
|
private static void DownloadProgressChanged(
|
||||||
|
object sender,
|
||||||
|
DownloadProgressChangedEventArgs e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (e != null)
|
||||||
|
{
|
||||||
|
int percent = e.ProgressPercentage;
|
||||||
|
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
if (percent > previousPercent)
|
||||||
|
{
|
||||||
|
Console.Write('.');
|
||||||
|
|
||||||
|
if ((percent % 10) == 0)
|
||||||
|
Console.Write(" {0}% ", percent);
|
||||||
|
|
||||||
|
previousPercent = percent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This method is an event handler that is called when the file
|
||||||
|
/// download has completed, successfully or otherwise. It will
|
||||||
|
/// display the overall result of the file download on the console,
|
||||||
|
/// including any <see cref="Exception" /> information, if applicable.
|
||||||
|
/// The <see cref="exitCode" /> field is changed by this method to
|
||||||
|
/// indicate the overall result of the file download and the event
|
||||||
|
/// within the <see cref="doneEvent" /> field will be signaled.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">
|
||||||
|
/// The source of the event.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="e">
|
||||||
|
/// Information for the event being processed.
|
||||||
|
/// </param>
|
||||||
|
private static void DownloadFileCompleted(
|
||||||
|
object sender,
|
||||||
|
AsyncCompletedEventArgs e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (e != null)
|
||||||
|
{
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
if (previousPercent < 100)
|
||||||
|
Console.Write(' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.Cancelled)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Canceled");
|
||||||
|
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
exitCode = ExitCode.DownloadCanceled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Exception error = e.Error;
|
||||||
|
|
||||||
|
if (error != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error: {0}", error);
|
||||||
|
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
exitCode = ExitCode.DownloadError;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Done");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doneEvent != null)
|
||||||
|
doneEvent.Set();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#region Program Entry Point
|
||||||
|
/// <summary>
|
||||||
|
/// This is the entry-point for this tool. It handles processing the
|
||||||
|
/// command line arguments, setting up the web client, downloading the
|
||||||
|
/// file, and saving it to the file system.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="args">
|
||||||
|
/// The command line arguments.
|
||||||
|
/// </param>
|
||||||
|
/// <returns>
|
||||||
|
/// Zero upon success; non-zero on failure. This will be one of the
|
||||||
|
/// values from the <see cref="ExitCode" /> enumeration.
|
||||||
|
/// </returns>
|
||||||
|
private static int Main(
|
||||||
|
string[] args
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// NOTE: Sanity check the command line arguments.
|
||||||
|
//
|
||||||
|
if (args == null)
|
||||||
|
{
|
||||||
|
Error(null, true);
|
||||||
|
return (int)ExitCode.MissingArgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.Length != 1)
|
||||||
|
{
|
||||||
|
Error(null, true);
|
||||||
|
return (int)ExitCode.WrongNumArgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// NOTE: Attempt to convert the first (and only) command line
|
||||||
|
// argument to an absolute URI.
|
||||||
|
//
|
||||||
|
Uri uri;
|
||||||
|
|
||||||
|
if (!Uri.TryCreate(args[0], UriKind.Absolute, out uri))
|
||||||
|
{
|
||||||
|
Error("First argument is not an absolute URI.", false);
|
||||||
|
return (int)ExitCode.BadUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// NOTE: Attempt to extract the file name portion of the URI we
|
||||||
|
// just created.
|
||||||
|
//
|
||||||
|
string fileName = GetFileName(uri);
|
||||||
|
|
||||||
|
if (fileName == null)
|
||||||
|
{
|
||||||
|
Error("Could not extract the file name from the URI.", false);
|
||||||
|
return (int)ExitCode.BadFileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// NOTE: Grab the temporary path setup for this process. If it is
|
||||||
|
// unavailable, we will not continue.
|
||||||
|
//
|
||||||
|
string directory = Path.GetTempPath();
|
||||||
|
|
||||||
|
if (String.IsNullOrEmpty(directory) ||
|
||||||
|
!Directory.Exists(directory))
|
||||||
|
{
|
||||||
|
Error("Temporary directory is invalid or unavailable.", false);
|
||||||
|
return (int)ExitCode.BadTempPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (WebClient webClient = new WebClient())
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// NOTE: Create the event used to signal completion of the
|
||||||
|
// file download.
|
||||||
|
//
|
||||||
|
doneEvent = new ManualResetEvent(false);
|
||||||
|
|
||||||
|
//
|
||||||
|
// NOTE: Hookup the event handlers we care about on the web
|
||||||
|
// client. These are necessary because the file is
|
||||||
|
// downloaded asynchronously.
|
||||||
|
//
|
||||||
|
webClient.DownloadProgressChanged +=
|
||||||
|
new DownloadProgressChangedEventHandler(
|
||||||
|
DownloadProgressChanged);
|
||||||
|
|
||||||
|
webClient.DownloadFileCompleted +=
|
||||||
|
new AsyncCompletedEventHandler(
|
||||||
|
DownloadFileCompleted);
|
||||||
|
|
||||||
|
//
|
||||||
|
// NOTE: Build the fully qualified path and file name,
|
||||||
|
// within the temporary directory, where the file to
|
||||||
|
// be downloaded will be saved.
|
||||||
|
//
|
||||||
|
fileName = Path.Combine(directory, fileName);
|
||||||
|
|
||||||
|
//
|
||||||
|
// NOTE: If the file name already exists (in the temporary)
|
||||||
|
// directory, delete it.
|
||||||
|
//
|
||||||
|
// TODO: Perhaps an error should be raised here instead?
|
||||||
|
//
|
||||||
|
if (File.Exists(fileName))
|
||||||
|
File.Delete(fileName);
|
||||||
|
|
||||||
|
//
|
||||||
|
// NOTE: After kicking off the asynchronous file download
|
||||||
|
// process, wait [forever] until the "done" event is
|
||||||
|
// signaled.
|
||||||
|
//
|
||||||
|
Console.WriteLine(
|
||||||
|
"Downloading \"{0}\" to \"{1}\"...", uri, fileName);
|
||||||
|
|
||||||
|
webClient.DownloadFileAsync(uri, fileName);
|
||||||
|
doneEvent.WaitOne();
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
return (int)exitCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// NOTE: An exception was caught. Report it via the console
|
||||||
|
// and return failure.
|
||||||
|
//
|
||||||
|
Error(e.ToString(), false);
|
||||||
|
return (int)ExitCode.Exception;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
248
tool/GetTclKit.bat
Normal file
248
tool/GetTclKit.bat
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
@ECHO OFF
|
||||||
|
|
||||||
|
::
|
||||||
|
:: GetTclKit.bat --
|
||||||
|
::
|
||||||
|
:: TclKit Download Tool
|
||||||
|
::
|
||||||
|
|
||||||
|
SETLOCAL
|
||||||
|
|
||||||
|
REM SET __ECHO=ECHO
|
||||||
|
REM SET __ECHO2=ECHO
|
||||||
|
REM SET __ECHO3=ECHO
|
||||||
|
IF NOT DEFINED _AECHO (SET _AECHO=REM)
|
||||||
|
IF NOT DEFINED _CECHO (SET _CECHO=REM)
|
||||||
|
IF NOT DEFINED _VECHO (SET _VECHO=REM)
|
||||||
|
|
||||||
|
SET OVERWRITE=^>
|
||||||
|
IF DEFINED __ECHO SET OVERWRITE=^^^>
|
||||||
|
|
||||||
|
SET APPEND=^>^>
|
||||||
|
IF DEFINED __ECHO SET APPEND=^^^>^^^>
|
||||||
|
|
||||||
|
SET PROCESSOR=%1
|
||||||
|
|
||||||
|
IF DEFINED PROCESSOR (
|
||||||
|
CALL :fn_UnquoteVariable PROCESSOR
|
||||||
|
) ELSE (
|
||||||
|
GOTO usage
|
||||||
|
)
|
||||||
|
|
||||||
|
%_VECHO% Processor = '%PROCESSOR%'
|
||||||
|
|
||||||
|
SET DUMMY2=%2
|
||||||
|
|
||||||
|
IF DEFINED DUMMY2 (
|
||||||
|
GOTO usage
|
||||||
|
)
|
||||||
|
|
||||||
|
SET ROOT=%~dp0\..
|
||||||
|
SET ROOT=%ROOT:\\=\%
|
||||||
|
|
||||||
|
%_VECHO% Root = '%ROOT%'
|
||||||
|
|
||||||
|
SET TOOLS=%~dp0
|
||||||
|
SET TOOLS=%TOOLS:~0,-1%
|
||||||
|
|
||||||
|
%_VECHO% Tools = '%TOOLS%'
|
||||||
|
|
||||||
|
IF NOT DEFINED windir (
|
||||||
|
ECHO The windir environment variable must be set first.
|
||||||
|
GOTO errors
|
||||||
|
)
|
||||||
|
|
||||||
|
%_VECHO% WinDir = '%windir%'
|
||||||
|
|
||||||
|
IF NOT DEFINED TEMP (
|
||||||
|
ECHO The TEMP environment variable must be set first.
|
||||||
|
GOTO errors
|
||||||
|
)
|
||||||
|
|
||||||
|
%_VECHO% Temp = '%TEMP%'
|
||||||
|
|
||||||
|
SET TCLKIT_URI=http://tclsh.com/
|
||||||
|
|
||||||
|
%_VECHO% TclKitUri = '%TCLKIT_URI%'
|
||||||
|
|
||||||
|
IF /I "%PROCESSOR%" == "x86" (
|
||||||
|
CALL :fn_TclKitX86Variables
|
||||||
|
) ELSE IF /I "%PROCESSOR%" == "x64" (
|
||||||
|
CALL :fn_TclKitX64Variables
|
||||||
|
) ELSE (
|
||||||
|
GOTO usage
|
||||||
|
)
|
||||||
|
|
||||||
|
%_VECHO% TclKitPatchLevel = '%TCLKIT_PATCHLEVEL%'
|
||||||
|
%_VECHO% TclKitNoSdk = '%TCLKIT_NOSDK%'
|
||||||
|
%_VECHO% TclKitExe = '%TCLKIT_EXE%'
|
||||||
|
%_VECHO% TclKitLib = '%TCLKIT_LIB%'
|
||||||
|
%_VECHO% TclKitSdk = '%TCLKIT_SDK%'
|
||||||
|
%_VECHO% TclKitSdkZip = '%TCLKIT_SDK_ZIP%'
|
||||||
|
%_VECHO% TclKitFiles = '%TCLKIT_FILES%'
|
||||||
|
|
||||||
|
CALL :fn_ResetErrorLevel
|
||||||
|
|
||||||
|
FOR %%T IN (csc.exe) DO (
|
||||||
|
SET %%T_PATH=%%~dp$PATH:T
|
||||||
|
)
|
||||||
|
|
||||||
|
%_VECHO% Csc.exe_PATH = '%csc.exe_PATH%'
|
||||||
|
|
||||||
|
IF DEFINED csc.exe_PATH (
|
||||||
|
GOTO skip_addToPath
|
||||||
|
)
|
||||||
|
|
||||||
|
IF DEFINED FRAMEWORKDIR (
|
||||||
|
REM Use the existing .NET Framework directory...
|
||||||
|
) ELSE IF EXIST "%windir%\Microsoft.NET\Framework64\v2.0.50727" (
|
||||||
|
SET FRAMEWORKDIR=%windir%\Microsoft.NET\Framework64\v2.0.50727
|
||||||
|
) ELSE IF EXIST "%windir%\Microsoft.NET\Framework64\v3.5" (
|
||||||
|
SET FRAMEWORKDIR=%windir%\Microsoft.NET\Framework64\v3.5
|
||||||
|
) ELSE IF EXIST "%windir%\Microsoft.NET\Framework64\v4.0.30319" (
|
||||||
|
SET FRAMEWORKDIR=%windir%\Microsoft.NET\Framework64\v4.0.30319
|
||||||
|
) ELSE IF EXIST "%windir%\Microsoft.NET\Framework\v2.0.50727" (
|
||||||
|
SET FRAMEWORKDIR=%windir%\Microsoft.NET\Framework\v2.0.50727
|
||||||
|
) ELSE IF EXIST "%windir%\Microsoft.NET\Framework\v3.5" (
|
||||||
|
SET FRAMEWORKDIR=%windir%\Microsoft.NET\Framework\v3.5
|
||||||
|
) ELSE IF EXIST "%windir%\Microsoft.NET\Framework\v4.0.30319" (
|
||||||
|
SET FRAMEWORKDIR=%windir%\Microsoft.NET\Framework\v4.0.30319
|
||||||
|
) ELSE (
|
||||||
|
ECHO No suitable version of the .NET Framework appears to be installed.
|
||||||
|
GOTO errors
|
||||||
|
)
|
||||||
|
|
||||||
|
%_VECHO% FrameworkDir = '%FRAMEWORKDIR%'
|
||||||
|
|
||||||
|
IF NOT EXIST "%FRAMEWORKDIR%\csc.exe" (
|
||||||
|
ECHO The file "%FRAMEWORKDIR%\csc.exe" is missing.
|
||||||
|
GOTO errors
|
||||||
|
)
|
||||||
|
|
||||||
|
SET PATH=%FRAMEWORKDIR%;%PATH%
|
||||||
|
|
||||||
|
:skip_addToPath
|
||||||
|
|
||||||
|
%__ECHO% csc.exe "/out:%TEMP%\GetFile.exe" /target:exe "%TOOLS%\GetFile.cs"
|
||||||
|
|
||||||
|
IF ERRORLEVEL 1 (
|
||||||
|
ECHO Compilation of "%TOOLS%\GetFile.cs" failed.
|
||||||
|
GOTO errors
|
||||||
|
)
|
||||||
|
|
||||||
|
FOR %%F IN (%TCLKIT_FILES%) DO (
|
||||||
|
IF NOT EXIST "%%F" (
|
||||||
|
%__ECHO% "%TEMP%\GetFile.exe" "%TCLKIT_URI%%%F"
|
||||||
|
|
||||||
|
IF ERRORLEVEL 1 (
|
||||||
|
ECHO Download of "%%F" from "%TCLKIT_URI%" failed.
|
||||||
|
GOTO errors
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
IF DEFINED TCLKIT_NOSDK GOTO skip_sdkUnZip
|
||||||
|
|
||||||
|
IF NOT EXIST "%TEMP%\%TCLKIT_SDK%" (
|
||||||
|
%__ECHO% MKDIR "%TEMP%\%TCLKIT_SDK%"
|
||||||
|
|
||||||
|
IF ERRORLEVEL 1 (
|
||||||
|
ECHO Could not create directory "%TEMP%\%TCLKIT_SDK%".
|
||||||
|
GOTO errors
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
%__ECHO% "%TEMP%\unzip.exe" -o "%TEMP%\%TCLKIT_SDK_ZIP%" -d "%TEMP%\%TCLKIT_SDK%"
|
||||||
|
|
||||||
|
IF ERRORLEVEL 1 (
|
||||||
|
ECHO Could not unzip "%TEMP%\%TCLKIT_SDK_ZIP%" to "%TEMP%\%TCLKIT_SDK%".
|
||||||
|
GOTO errors
|
||||||
|
)
|
||||||
|
|
||||||
|
:skip_sdkUnZip
|
||||||
|
|
||||||
|
%__ECHO% ECHO SET TCLSH_CMD=%TEMP%\%TCLKIT_EXE%%OVERWRITE%"%ROOT%\SetTclKitEnv.bat"
|
||||||
|
|
||||||
|
IF DEFINED TCLKIT_NOSDK GOTO skip_sdkVariables
|
||||||
|
|
||||||
|
%__ECHO% ECHO SET TCLINCDIR=%TEMP%\%TCLKIT_SDK%\include%APPEND%"%ROOT%\SetTclKitEnv.bat"
|
||||||
|
%__ECHO% ECHO SET TCLLIBDIR=%TEMP%\%TCLKIT_SDK%\lib%APPEND%"%ROOT%\SetTclKitEnv.bat"
|
||||||
|
%__ECHO% ECHO SET LIBTCL=%TCLKIT_LIB%%APPEND%"%ROOT%\SetTclKitEnv.bat"
|
||||||
|
|
||||||
|
:skip_sdkVariables
|
||||||
|
|
||||||
|
GOTO no_errors
|
||||||
|
|
||||||
|
:fn_TclKitX86Variables
|
||||||
|
IF NOT DEFINED TCLKIT_PATCHLEVEL (
|
||||||
|
SET TCLKIT_PATCHLEVEL=8.6.4
|
||||||
|
)
|
||||||
|
SET TCLKIT_EXE=tclkit-%TCLKIT_PATCHLEVEL%.exe
|
||||||
|
SET TCLKIT_LIB=libtclkit%TCLKIT_PATCHLEVEL:.=%.lib
|
||||||
|
SET TCLKIT_SDK=libtclkit-sdk-x86-%TCLKIT_PATCHLEVEL%
|
||||||
|
SET TCLKIT_SDK_ZIP=%TCLKIT_SDK%.zip
|
||||||
|
SET TCLKIT_FILES=%TCLKIT_EXE% unzip.exe %TCLKIT_SDK_ZIP%
|
||||||
|
GOTO :EOF
|
||||||
|
|
||||||
|
:fn_TclKitX64Variables
|
||||||
|
IF NOT DEFINED TCLKIT_PATCHLEVEL (
|
||||||
|
REM
|
||||||
|
REM NOTE: By default, use latest available version of the TclKit SDK
|
||||||
|
REM for x64. However, the "default" TclKit executable for x86
|
||||||
|
REM is still used here because it is the only one "well-known"
|
||||||
|
REM to be available for download.
|
||||||
|
REM
|
||||||
|
SET TCLKIT_PATCHLEVEL=8.6.3
|
||||||
|
SET TCLKIT_EXE=tclkit-8.6.4.exe
|
||||||
|
) ELSE (
|
||||||
|
SET TCLKIT_EXE=tclkit-%TCLKIT_PATCHLEVEL%.exe
|
||||||
|
)
|
||||||
|
SET TCLKIT_LIB=libtclkit%TCLKIT_PATCHLEVEL:.=%.lib
|
||||||
|
SET TCLKIT_SDK=libtclkit-sdk-x64-%TCLKIT_PATCHLEVEL%
|
||||||
|
SET TCLKIT_SDK_ZIP=%TCLKIT_SDK%.zip
|
||||||
|
SET TCLKIT_FILES=%TCLKIT_EXE% unzip.exe %TCLKIT_SDK_ZIP%
|
||||||
|
GOTO :EOF
|
||||||
|
|
||||||
|
:fn_UnquoteVariable
|
||||||
|
IF NOT DEFINED %1 GOTO :EOF
|
||||||
|
SETLOCAL
|
||||||
|
SET __ECHO_CMD=ECHO %%%1%%
|
||||||
|
FOR /F "delims=" %%V IN ('%__ECHO_CMD%') DO (
|
||||||
|
SET VALUE=%%V
|
||||||
|
)
|
||||||
|
SET VALUE=%VALUE:"=%
|
||||||
|
REM "
|
||||||
|
ENDLOCAL && SET %1=%VALUE%
|
||||||
|
GOTO :EOF
|
||||||
|
|
||||||
|
:fn_ResetErrorLevel
|
||||||
|
VERIFY > NUL
|
||||||
|
GOTO :EOF
|
||||||
|
|
||||||
|
:fn_SetErrorLevel
|
||||||
|
VERIFY MAYBE 2> NUL
|
||||||
|
GOTO :EOF
|
||||||
|
|
||||||
|
:usage
|
||||||
|
ECHO.
|
||||||
|
ECHO Usage: %~nx0 ^<processor^>
|
||||||
|
ECHO.
|
||||||
|
ECHO The only supported values for processor are "x86" and "x64".
|
||||||
|
GOTO errors
|
||||||
|
|
||||||
|
:errors
|
||||||
|
CALL :fn_SetErrorLevel
|
||||||
|
ENDLOCAL
|
||||||
|
ECHO.
|
||||||
|
ECHO Failure, errors were encountered.
|
||||||
|
GOTO end_of_file
|
||||||
|
|
||||||
|
:no_errors
|
||||||
|
CALL :fn_ResetErrorLevel
|
||||||
|
ENDLOCAL
|
||||||
|
ECHO.
|
||||||
|
ECHO Success, no errors were encountered.
|
||||||
|
GOTO end_of_file
|
||||||
|
|
||||||
|
:end_of_file
|
||||||
|
%__ECHO% EXIT /B %ERRORLEVEL%
|
Reference in New Issue
Block a user