diff --git a/.gitignore b/.gitignore index 45dc8290cc..33a37a15fc 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ PublishProfiles/ *.vspx /.symbols nuget.exe +build/ \ No newline at end of file diff --git a/build.cmd b/build.cmd index cc2ac30683..c38178cce8 100644 --- a/build.cmd +++ b/build.cmd @@ -1,11 +1,16 @@ @echo off cd %~dp0 -IF EXIST .nuget\NuGet.exe goto part2 +IF EXIST .nuget\NuGet.exe goto restore echo Downloading latest version of NuGet.exe... md .nuget @powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://www.nuget.org/nuget.exe' -OutFile '.nuget\NuGet.exe'" -:part2 +:restore +IF EXIST build goto run +.nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages +xcopy packages\KoreBuild\build build\ /Y .nuget\NuGet.exe install Sake -version 0.2 -o packages + +:run packages\Sake.0.2\tools\Sake.exe -I build -f makefile.shade %* diff --git a/build/_git-clone.shade b/build/_git-clone.shade deleted file mode 100644 index 32355ab5a3..0000000000 --- a/build/_git-clone.shade +++ /dev/null @@ -1,9 +0,0 @@ - - - -default gitBranch='' - -var gitCommand='clone ${gitUri}' -set gitCommand='${gitCommand} --branch ${gitBranch}' if='!string.IsNullOrEmpty(gitBranch)' - -git diff --git a/build/_git-pull.shade b/build/_git-pull.shade deleted file mode 100644 index 1e7971020f..0000000000 --- a/build/_git-pull.shade +++ /dev/null @@ -1,8 +0,0 @@ - - -default gitBranch='' - -var gitCommand='pull ${gitUri}' -set gitCommand='${gitCommand} ${gitBranch}' if='!string.IsNullOrEmpty(gitBranch)' - -git diff --git a/build/_git.shade b/build/_git.shade deleted file mode 100644 index 7495a598bb..0000000000 --- a/build/_git.shade +++ /dev/null @@ -1,5 +0,0 @@ - -default gitFolder='' - -exec program='git' commandline='${gitCommand}' workingdir='${gitFolder}' - diff --git a/build/_k-build.shade b/build/_k-build.shade deleted file mode 100644 index 435bdca74a..0000000000 --- a/build/_k-build.shade +++ /dev/null @@ -1,17 +0,0 @@ -@{/* - -k-build - Builds project. Downloads and executes k sdk tools. - -projectFile='' - Required. Path to the project.json to build. - -*/} - -var projectFolder='${Path.GetDirectoryName(projectFile)}' -var projectName='${Path.GetFileName(projectFolder)}' -var projectBin='${Path.Combine(projectFolder, "bin")}' - -directory delete="${projectBin}" -k command='build ${projectFolder}' -copy sourceDir='${projectBin}' outputDir='${Path.Combine(BUILD_DIR, projectName)}' diff --git a/build/_k-clean.shade b/build/_k-clean.shade deleted file mode 100644 index 7f8b643682..0000000000 --- a/build/_k-clean.shade +++ /dev/null @@ -1,13 +0,0 @@ -@{/* - -k-clean - Cleans project. Downloads and executes k sdk tools. - -projectFile='' - Required. Path to the project.json to build. - -*/} - -var projectFolder='${Path.GetDirectoryName(projectFile)}' - -k command='clean ${projectFolder}' diff --git a/build/_k-generate-projects.shade b/build/_k-generate-projects.shade deleted file mode 100644 index 01af0cd018..0000000000 --- a/build/_k-generate-projects.shade +++ /dev/null @@ -1,330 +0,0 @@ -use namespace="System" -use namespace="System.Collections.Generic" -use namespace="System.IO" -use namespace="System.Linq" -use namespace="System.Reflection" -use namespace="System.Text" -use namespace="System.Web.Script.Serialization" -use namespace="System.Xml.Linq" - -use assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" - -@{/* - -k-generate-projects - Generate csproj files from project.json - -solutionPath='' - Required. Path to the solution directory - -*/} - -content var='net45' include href='net45.txt' -content var='k10' include href='k10.txt' - -@{ - ProjectGenerator.Logger = Log; - - var templates = new Dictionary { - { "net45", net45 }, - { "k10", k10 } - }; - - ProjectGenerator.MakeProjects(solutionPath, templates); -} - -functions - @{ - class ProjectGenerator - { - public static Sake.Engine.Logging.ILog Logger { get; set; } - - static void Log(string message, params object[] args) - { - Logger.Info(String.Format(message, args)); - } - - static void Warn(string message, params object[] args) - { - Logger.Warn(String.Format(message, args)); - } - - public static void MakeProjects(string solutionPath, IDictionary templates) - { - var jsonFiles = GetJsonFiles(solutionPath); - var projectMapping = GetProjectMapping(solutionPath, jsonFiles); - - Log("Found {0} projects", jsonFiles.Length); - - foreach (var p in jsonFiles) - { - Log(p); - } - - foreach (var path in jsonFiles) - { - ProduceProjectFilesForProject(path, projectMapping, templates); - } - } - - private static string[] GetJsonFiles(string solutionPath) - { - Func getFiles = dir => - { - string path = Path.Combine(solutionPath, dir); - - if (!Directory.Exists(path)) - { - return new string[0]; - } - - return Directory.GetFiles(path, "project.json", SearchOption.AllDirectories); - }; - - return getFiles("src").Concat(getFiles("samples")) - .Concat(getFiles("test")) - .ToArray(); - } - - private static IDictionary GetProjectMapping(string solutionPath, string[] jsonFiles) - { - var dict = new Dictionary(); - - foreach (var path in jsonFiles) - { - string projectDir = Path.GetDirectoryName(path); - string projectName = projectDir.Substring(Path.GetDirectoryName(projectDir).Length).Trim(Path.DirectorySeparatorChar); - - // { - // "p1" : { "net45" : "id", "k10" : "pid1", path: "src\p1" }, - // "p2" : { "net45" : "id", "k10" : "pid2", path: "src\p2" } - // } - // - - string net45Project = Path.Combine(projectDir, GetProjectFileName(projectName, "net45")); - string k10Project = Path.Combine(projectDir, GetProjectFileName(projectName, "k10")); - - var configs = new Dictionary(); - configs["net45"] = GetProjectGuidFromFileOrCreateNew(net45Project); - configs["k10"] = GetProjectGuidFromFileOrCreateNew(k10Project); - configs["path"] = Path.GetDirectoryName(path.Substring(solutionPath.Length).TrimStart(Path.DirectorySeparatorChar)); - - dict[projectName] = configs; - } - - return dict; - } - - private static string GetProjectGuidFromFileOrCreateNew(string projectPath) - { - if (!File.Exists(projectPath)) - { - return Guid.NewGuid().ToString().ToUpper(); - } - - var projectGuid = XDocument.Parse(File.ReadAllText(projectPath)) - .Descendants() - .FirstOrDefault(e => e.Name.LocalName.Equals("ProjectGuid")); - - if (projectGuid == null) - { - return Guid.NewGuid().ToString(); - } - - return projectGuid.Value.Trim((char)'{', (char)'}'); - } - - private static void ProduceProjectFilesForProject(string jsonPath, - IDictionary projectMapping, - IDictionary templates) - { - var serializer = new JavaScriptSerializer(); - - string projectDir = Path.GetDirectoryName(jsonPath); - string projectName = projectDir.Substring(Path.GetDirectoryName(projectDir).Length).Trim(Path.DirectorySeparatorChar); - - Log("Generated projects for {0}", projectName); - - var jsonText = File.ReadAllText(jsonPath); - - var d = serializer.DeserializeObject(jsonText) as IDictionary; - var configs = GetObject(d, "configurations"); - var references = GetObject(d, "dependencies") ?? new Dictionary(); - - // Get the list of files - var filesString = String.Join(Environment.NewLine, - Directory.GetFiles(projectDir, "*.cs", SearchOption.AllDirectories) - .Select(p => p.Substring(projectDir.Length).Trim(Path.DirectorySeparatorChar)) - .Where(p => !p.StartsWith("obj")) - .Select(p => String.Format( - @"", p))); - - // Add the config file if it's there - if (File.Exists(Path.Combine(projectDir, "packages.config"))) - { - filesString += ""; - } - - var packageReferences = references.Where(r => !String.IsNullOrEmpty((string)r.Value)) - .ToDictionary(k => k.Key, k => (string)k.Value); - - var projectReferences = references.Where(r => String.IsNullOrEmpty((string)r.Value)) - .Select(r => r.Key) - .ToArray(); - - - // HACK: Assume the packages folder is 2 up from the projectDir - string packagesDir = Path.GetFullPath(Path.Combine(projectDir, "..", "..", "packages")); - - foreach (var targetFramework in configs.Keys) - { - string id = (string)GetObject(projectMapping, projectName)[targetFramework]; - - var template = templates[targetFramework] - .Replace("{ProjectGuid}", id) - .Replace("{Name}", projectName) - .Replace("{Files}", filesString) - .Replace("{ProjectReferences}", BuildProjectReferences(projectReferences, targetFramework, projectMapping)) - .Replace("{References}", BuildReferences(packageReferences, packagesDir, targetFramework, GetCandidates(targetFramework))); - - if (targetFramework.StartsWith("k")) - { - template = template.Replace("{CSharpTargetsPath}", GetProjectKTargets(packagesDir)); - } - - string output = Path.Combine(projectDir, GetProjectFileName(projectName, targetFramework)); - - Log("Generated {0}", output); - - File.WriteAllText(output, template); - } - } - - private static string GetProjectKTargets(string packagesDir) - { - var projectK = Directory.GetDirectories(packagesDir, "ProjectK*") - .Select(p => new { Path = p, Build = Int32.Parse(p.Substring(p.LastIndexOf('-') + 1)) }) - .OrderByDescending(p => p.Build) - .FirstOrDefault(); - - if (projectK == null) - { - Warn("Project K targets aren't installed"); - return ""; - } - - return Path.Combine("..", "..", projectK.Path.Substring(projectK.Path.IndexOf("packages")), "Framework\\K\\v1.0\\ProjectK.CSharp.targets"); - } - - private static string GetProjectFileName(string projectName, string config) - { - return projectName + "." + config + ".csproj"; - } - - private static string BuildProjectReferences(string[] projectReferences, string config, IDictionary projectMapping) - { - if (projectReferences.Length == 0) - { - return ""; - } - - var sb = new StringBuilder(); - - foreach (var reference in projectReferences) - { - var info = GetObject(projectMapping, reference); - - if (info == null) - { - Warn("No project reference found for {0}", reference); - continue; - } - - string projectFileName = GetProjectFileName(reference, config); - string path = Path.Combine((string)info["path"], projectFileName); - - sb.AppendFormat(@" - {{{1}}} - {2} - ", path, info[config], reference); - } - - return sb.ToString(); - } - - private static string[] GetCandidates(string config) - { - if (config == "net45") - { - return new[] { "net45", "net40", "net35", "net20" }; - } - - return new[] { config }; - } - - private static string BuildReferences(IDictionary references, string packagesDir, string configName, string[] candidates) - { - if (references.Count == 0) - { - return ""; - } - - Log("Building package references for {0}", configName); - - var sb = new StringBuilder(); - - foreach (var reference in references) - { - var version = (string)reference.Value; - - string pattern = version.IndexOf("*") != -1 ? reference.Key + "*" : reference.Key + "." + reference.Value; - - var packageDir = Directory.GetDirectories(packagesDir, pattern).FirstOrDefault(); - - if (packageDir == null) - { - Warn(reference.Key + " = " + version + " ==> UNRESOLVED"); - continue; - } - - Log(reference.Key + " = " + version + " ==> " + packageDir); - - var candidate = candidates.Select(c => Path.Combine(packageDir, "lib", c)) - .FirstOrDefault(Directory.Exists); - - if (candidate == null) - { - Warn("Unable to find package reference for {0}, target framework = {1}", reference.Key, configName); - continue; - } - - var dlls = Directory.EnumerateFiles(candidate, "*.dll") - .Distinct() - .Where(File.Exists) - .ToList(); - - foreach (var dllPath in dlls) - { - sb.AppendFormat(@" - - False - ..\..\{1} - ", AssemblyName.GetAssemblyName(dllPath).FullName, dllPath.Substring(dllPath.IndexOf("packages"))); - } - } - - return sb.ToString(); - } - - private static IDictionary GetObject(IDictionary obj, string key) - { - object value; - if (obj.TryGetValue(key, out value)) - { - return value as IDictionary; - } - - return null; - } - } - } diff --git a/build/_k-restore.shade b/build/_k-restore.shade deleted file mode 100644 index 0f20db0fc0..0000000000 --- a/build/_k-restore.shade +++ /dev/null @@ -1,7 +0,0 @@ -@{/* - -k-restore - Restores nuget packages required for k projects. Downloads and executes k sdk tools. -*/} - -k command='restore' diff --git a/build/_k-standard-goals.shade b/build/_k-standard-goals.shade deleted file mode 100644 index b6a38ff7dd..0000000000 --- a/build/_k-standard-goals.shade +++ /dev/null @@ -1,47 +0,0 @@ -use namespace="System" -use namespace="System.IO" -use import="Files" - -default BASE_DIR='${Directory.GetCurrentDirectory()}' -default TARGET_DIR='${Path.Combine(BASE_DIR, "artifacts")}' -default BUILD_DIR='${Path.Combine(TARGET_DIR, "build")}' -default TEST_DIR='${Path.Combine(TARGET_DIR, "test")}' - -@{ - E("K_BUILD_VERSION", "t" + DateTime.UtcNow.ToString("yyMMddHHmmss")); -} - -#target-default target='default' - k-restore - k-generate-projects solutionPath='${BASE_DIR}' - -#target-dir-clean target='clean' - directory delete="${TARGET_DIR}" - -#build-clean target='clean' - k-clean each='var projectFile in Files.Include("src/**/project.json")' - -#build-compile target='compile' - k-build each='var projectFile in Files.Include("src/**/project.json")' - @{ - foreach (var nupkg in Files.Include(Path.Combine(BUILD_DIR, "*/*.nupkg"))) - { - File.Copy(nupkg, Path.Combine(BUILD_DIR, Path.GetFileName(nupkg)), true); - } - } - -#nuget-install target='install' description='Copy NuGet packages to local repo' - @{ - var HOME_DIR = E("HOME"); - if (string.IsNullOrEmpty(HOME_DIR)) - { - HOME_DIR = E("HOMEDRIVE") + E("HOMEPATH"); - } - } - copy sourceDir='${BUILD_DIR}' include='*.nupkg' outputDir='${Path.Combine(HOME_DIR, ".nuget")}' overwrite='${true}' - - -functions @{ - string E(string key) { return Environment.GetEnvironmentVariable(key); } - void E(string key, string value) { Environment.SetEnvironmentVariable(key, value); } -} diff --git a/build/_k.shade b/build/_k.shade deleted file mode 100644 index c0e216dcae..0000000000 --- a/build/_k.shade +++ /dev/null @@ -1,31 +0,0 @@ -@{/* - -k - Run klr commands in your project. Downloads and executes k sdk. - -kVersion='0.0.1-pre-30109-087' - May be passed to override the nuget package version holding xunit console runner. - -kProgram='...' - May be passed to override the path to the xunit program that will be executed - -command='' - -*/} - -default kLatestSuccessful='\\wsr-teamcity\Drops\ProjectK.Main\latest-successful\sdk' -default kVersion='' - -test if='string.IsNullOrEmpty(kVersion)' - for each='var file in System.IO.Directory.EnumerateFiles(kLatestSuccessful).Select(System.IO.Path.GetFileName)' - test if='file.StartsWith("ProjectK.") && file.EndsWith(".nupkg")' - - kVersion = file.Substring("ProjectK.".Length, file.Length - "ProjectK.".Length - ".nupkg".Length); - -default kProgram='packages/ProjectK.${kVersion}/tools/k.cmd' - --// Download xunit from nuget sources if not already present -test if='!File.Exists(kProgram)' - log info='Installing ProjectK ${kVersion} from ${kLatestSuccessful}' - nuget-install package='ProjectK' packageVersion='${kVersion}' outputDir='packages' extra='-Source ${kLatestSuccessful}' - -exec program='${Path.GetFullPath(kProgram)}' commandline='${command}' diff --git a/build/k10.txt b/build/k10.txt deleted file mode 100644 index 98924c1a4a..0000000000 --- a/build/k10.txt +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Debug - AnyCPU - {{ProjectGuid}} - Library - Properties - {Name} - {Name} - v4.5 - 512 - obj/K - - - AnyCPU - true - full - false - bin\Debug\K - DEBUG;TRACE;K10 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\K - TRACE;K10 - prompt - 4 - - - {Files} - - - - {References} - - - {ProjectReferences} - - - - \ No newline at end of file diff --git a/build/net45.txt b/build/net45.txt deleted file mode 100644 index 8d2e271f7b..0000000000 --- a/build/net45.txt +++ /dev/null @@ -1,57 +0,0 @@ - - - - - Debug - AnyCPU - {{ProjectGuid}} - Library - Properties - {Name} - {Name} - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - {References} - - - {Files} - - - - {ProjectReferences} - - - - \ No newline at end of file