2019-10-02 23:42:18 +03:00
|
|
|
#addin nuget:?package=Cake.XCode&version=4.2.0
|
2019-08-23 22:03:43 +03:00
|
|
|
#addin nuget:?package=Cake.Xamarin.Build&version=4.1.1
|
|
|
|
#addin nuget:?package=Cake.FileHelpers&version=3.2.0
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
#load "poco.cake"
|
|
|
|
#load "components.cake"
|
|
|
|
#load "common.cake"
|
|
|
|
|
|
|
|
var TARGET = Argument ("t", Argument ("target", "build"));
|
2019-08-27 08:41:15 +03:00
|
|
|
var NAMES = Argument ("names", "");
|
2019-07-13 04:07:31 +03:00
|
|
|
|
2019-08-26 21:05:01 +03:00
|
|
|
var IS_LOCAL_BUILD = true;
|
|
|
|
var BACKSLASH = string.Empty;
|
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
var SOLUTION_PATH = "./Xamarin.Google.sln";
|
2019-08-03 01:08:24 +03:00
|
|
|
var EXTERNALS_PATH = new DirectoryPath ("./externals");
|
2019-07-13 04:07:31 +03:00
|
|
|
|
|
|
|
// Artifacts that need to be built from pods or be copied from pods
|
|
|
|
var ARTIFACTS_TO_BUILD = new List<Artifact> ();
|
|
|
|
|
|
|
|
var SOURCES_TARGETS = new List<string> ();
|
2019-08-06 01:23:02 +03:00
|
|
|
var SAMPLES_TARGETS = new List<string> ();
|
2019-07-13 04:07:31 +03:00
|
|
|
|
2016-04-20 21:40:45 +03:00
|
|
|
FilePath GetCakeToolPath ()
|
|
|
|
{
|
|
|
|
var possibleExe = GetFiles ("./**/tools/Cake/Cake.exe").FirstOrDefault ();
|
|
|
|
if (possibleExe != null)
|
|
|
|
return possibleExe;
|
|
|
|
|
|
|
|
var p = System.Diagnostics.Process.GetCurrentProcess ();
|
|
|
|
return new FilePath (p.Modules[0].FileName);
|
|
|
|
}
|
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
void BuildCake (string target)
|
2016-04-20 21:40:45 +03:00
|
|
|
{
|
2019-07-13 04:07:31 +03:00
|
|
|
var cakeSettings = new CakeSettings {
|
|
|
|
ToolPath = GetCakeToolPath (),
|
2019-08-27 08:41:15 +03:00
|
|
|
Arguments = new Dictionary<string, string> { { "target", target }, { "names", NAMES } },
|
2019-07-13 04:07:31 +03:00
|
|
|
Verbosity = Verbosity.Diagnostic
|
|
|
|
};
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
// Run the script from the subfolder
|
|
|
|
CakeExecuteScript ("./build.cake", cakeSettings);
|
2016-04-20 21:40:45 +03:00
|
|
|
}
|
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
// From Cake.Xamarin.Build, dumps out versions of things
|
2019-08-24 00:49:32 +03:00
|
|
|
// LogSystemInfo ();
|
|
|
|
|
2019-08-26 21:05:01 +03:00
|
|
|
Setup (context =>
|
|
|
|
{
|
|
|
|
IS_LOCAL_BUILD = string.IsNullOrWhiteSpace (EnvironmentVariable ("AGENT_ID"));
|
2019-08-26 21:09:25 +03:00
|
|
|
Information ($"Is a local build? {IS_LOCAL_BUILD}");
|
2019-10-03 23:31:41 +03:00
|
|
|
BACKSLASH = IS_LOCAL_BUILD ? @"\" : @"\";
|
2019-08-26 21:05:01 +03:00
|
|
|
});
|
2019-07-13 04:07:31 +03:00
|
|
|
|
|
|
|
Task("build")
|
|
|
|
.Does(() =>
|
2016-04-20 21:40:45 +03:00
|
|
|
{
|
2019-07-13 04:07:31 +03:00
|
|
|
BuildCake ("nuget");
|
|
|
|
BuildCake ("samples");
|
|
|
|
});
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
// Prepares the artifacts to be built.
|
|
|
|
// From CI will always build everything but, locally you can customize what
|
|
|
|
// you build, just to save some time when testing locally.
|
|
|
|
Task("prepare-artifacts")
|
|
|
|
.IsDependeeOf("externals")
|
|
|
|
.Does(() =>
|
|
|
|
{
|
|
|
|
SetArtifactsDependencies ();
|
|
|
|
SetArtifactsPodSpecs ();
|
2019-07-31 09:58:03 +03:00
|
|
|
SetArtifactsExtraPodfileLines ();
|
2019-08-06 01:23:02 +03:00
|
|
|
SetArtifactsSamples ();
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
var orderedArtifactsForBuild = new List<Artifact> ();
|
2019-08-06 07:51:50 +03:00
|
|
|
var orderedArtifactsForSamples = new List<Artifact> ();
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-08-27 08:41:15 +03:00
|
|
|
if (string.IsNullOrWhiteSpace (NAMES)) {
|
2020-02-07 01:16:48 +03:00
|
|
|
var artifacts = ARTIFACTS.Values.Where (a => !a.Ignore);
|
|
|
|
orderedArtifactsForBuild.AddRange (artifacts);
|
|
|
|
orderedArtifactsForSamples.AddRange (artifacts);
|
2016-04-20 21:40:45 +03:00
|
|
|
} else {
|
2019-08-27 08:41:15 +03:00
|
|
|
var names = NAMES.Split (',');
|
|
|
|
foreach (var name in names) {
|
|
|
|
if (!(ARTIFACTS.ContainsKey (name) && ARTIFACTS [name] is Artifact artifact))
|
|
|
|
throw new Exception($"The {name} component does not exist.");
|
2018-03-19 23:00:48 +03:00
|
|
|
|
2020-02-07 01:16:48 +03:00
|
|
|
if (artifact.Ignore)
|
|
|
|
continue;
|
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
orderedArtifactsForBuild.Add (artifact);
|
|
|
|
AddArtifactDependencies (orderedArtifactsForBuild, artifact.Dependencies);
|
2019-08-06 07:51:50 +03:00
|
|
|
orderedArtifactsForSamples.Add (artifact);
|
2018-03-19 23:00:48 +03:00
|
|
|
}
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
orderedArtifactsForBuild = orderedArtifactsForBuild.Distinct ().ToList ();
|
2019-08-06 07:51:50 +03:00
|
|
|
orderedArtifactsForSamples = orderedArtifactsForSamples.Distinct ().ToList ();
|
2016-04-20 21:40:45 +03:00
|
|
|
}
|
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
orderedArtifactsForBuild.Sort ((f, s) => s.BuildOrder.CompareTo (f.BuildOrder));
|
2019-08-06 07:51:50 +03:00
|
|
|
orderedArtifactsForSamples.Sort ((f, s) => s.BuildOrder.CompareTo (f.BuildOrder));
|
2019-07-13 04:07:31 +03:00
|
|
|
ARTIFACTS_TO_BUILD.AddRange (orderedArtifactsForBuild);
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
Information ("Build order:");
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
foreach (var artifact in ARTIFACTS_TO_BUILD) {
|
2019-08-26 21:05:01 +03:00
|
|
|
SOURCES_TARGETS.Add($@"{artifact.ComponentGroup}{BACKSLASH}{artifact.CsprojName.Replace ('.', '_')}");
|
2019-08-06 07:51:50 +03:00
|
|
|
Information (artifact.Id);
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach (var artifact in orderedArtifactsForSamples)
|
2019-08-06 01:23:02 +03:00
|
|
|
if (artifact.Samples != null)
|
|
|
|
foreach (var sample in artifact.Samples)
|
2019-08-26 21:05:01 +03:00
|
|
|
SAMPLES_TARGETS.Add($@"{artifact.ComponentGroup}{BACKSLASH}{sample.Replace ('.', '_')}");
|
2019-07-13 04:07:31 +03:00
|
|
|
});
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
Task ("externals")
|
2019-08-28 06:33:26 +03:00
|
|
|
.WithCriteria (!DirectoryExists (EXTERNALS_PATH) || !string.IsNullOrWhiteSpace (NAMES))
|
2019-07-13 04:07:31 +03:00
|
|
|
.Does (() =>
|
2016-04-20 21:40:45 +03:00
|
|
|
{
|
2019-08-03 01:08:24 +03:00
|
|
|
EnsureDirectoryExists (EXTERNALS_PATH);
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
Information ("////////////////////////////////////////");
|
|
|
|
Information ("// Pods Repo Update Started //");
|
|
|
|
Information ("////////////////////////////////////////");
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
Information ("\nUpdating Cocoapods repo...");
|
|
|
|
CocoaPodRepoUpdate ();
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
Information ("////////////////////////////////////////");
|
|
|
|
Information ("// Pods Repo Update Ended //");
|
|
|
|
Information ("////////////////////////////////////////");
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-08-28 06:33:26 +03:00
|
|
|
if (string.IsNullOrWhiteSpace (NAMES)) {
|
2019-08-03 01:08:24 +03:00
|
|
|
foreach (var artifact in ARTIFACTS_TO_BUILD) {
|
|
|
|
UpdateVersionInCsproj (artifact);
|
|
|
|
CreateAndInstallPodfile (artifact);
|
|
|
|
BuildSdkOnPodfile (artifact);
|
|
|
|
}
|
|
|
|
} else {
|
2019-08-14 00:07:39 +03:00
|
|
|
foreach (var artifact in ARTIFACTS_TO_BUILD) {
|
|
|
|
UpdateVersionInCsproj (artifact);
|
|
|
|
|
2019-08-03 01:08:24 +03:00
|
|
|
foreach (var podSpec in artifact.PodSpecs) {
|
|
|
|
if (podSpec.FrameworkSource != FrameworkSource.Pods)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (DirectoryExists (EXTERNALS_PATH.Combine ($"{podSpec.FrameworkName}.framework")))
|
|
|
|
break;
|
|
|
|
|
|
|
|
CreateAndInstallPodfile (artifact);
|
|
|
|
BuildSdkOnPodfile (artifact);
|
|
|
|
}
|
2019-08-14 00:07:39 +03:00
|
|
|
}
|
2016-04-20 21:40:45 +03:00
|
|
|
}
|
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
// Call here custom methods created at custom_externals_download.cake file
|
|
|
|
// to download frameworks and/or bundles for the artifact
|
2019-07-31 09:58:03 +03:00
|
|
|
// if (ARTIFACTS_TO_BUILD.Contains (FIREBASE_CORE_ARTIFACT))
|
|
|
|
// FirebaseCoreDownload ();
|
2019-07-13 04:07:31 +03:00
|
|
|
});
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
Task ("libs")
|
|
|
|
.IsDependentOn("externals")
|
|
|
|
.Does(() =>
|
|
|
|
{
|
|
|
|
CleanVisualStudioSolution ();
|
2019-08-09 00:07:22 +03:00
|
|
|
RestoreVisualStudioSolution ();
|
2016-04-20 21:40:45 +03:00
|
|
|
|
2019-08-24 04:26:35 +03:00
|
|
|
foreach (var target in SOURCES_TARGETS)
|
|
|
|
MSBuild(SOLUTION_PATH, c => {
|
|
|
|
c.Configuration = "Release";
|
2022-01-25 20:04:16 +03:00
|
|
|
c.Restore = true;
|
2019-08-24 04:26:35 +03:00
|
|
|
c.MaxCpuCount = 0;
|
|
|
|
c.Targets.Clear();
|
2019-08-26 21:05:01 +03:00
|
|
|
c.Targets.Add($@"source{BACKSLASH}{target}");
|
2019-08-24 04:26:35 +03:00
|
|
|
});
|
2019-07-13 04:07:31 +03:00
|
|
|
});
|
2018-03-19 23:00:48 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
Task ("samples")
|
|
|
|
.IsDependentOn("libs")
|
|
|
|
.Does(() =>
|
|
|
|
{
|
2019-08-09 00:07:22 +03:00
|
|
|
foreach (var target in SAMPLES_TARGETS)
|
|
|
|
MSBuild(SOLUTION_PATH, c => {
|
|
|
|
c.Configuration = "Release";
|
2022-01-25 20:04:16 +03:00
|
|
|
c.Restore = true;
|
2019-08-09 00:07:22 +03:00
|
|
|
c.MaxCpuCount = 0;
|
|
|
|
c.Targets.Clear();
|
2022-02-02 02:27:12 +03:00
|
|
|
c.Targets.Add($@"samples-using-source{BACKSLASH}{target}");
|
2019-08-09 00:07:22 +03:00
|
|
|
});
|
2016-04-20 21:40:45 +03:00
|
|
|
});
|
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
Task ("nuget")
|
|
|
|
.IsDependentOn("libs")
|
|
|
|
.Does(() =>
|
2018-12-05 23:49:27 +03:00
|
|
|
{
|
2019-09-19 03:22:44 +03:00
|
|
|
EnsureDirectoryExists("./output/");
|
2019-07-13 04:07:31 +03:00
|
|
|
|
2019-08-24 04:26:35 +03:00
|
|
|
foreach (var target in SOURCES_TARGETS)
|
|
|
|
MSBuild(SOLUTION_PATH, c => {
|
|
|
|
c.Configuration = "Release";
|
|
|
|
c.MaxCpuCount = 0;
|
|
|
|
c.Targets.Clear();
|
2019-08-26 21:05:01 +03:00
|
|
|
c.Targets.Add($@"source{BACKSLASH}{target}:Pack");
|
2019-09-19 03:22:44 +03:00
|
|
|
c.Properties.Add("PackageOutputPath", new [] { "../../../output/" });
|
2019-08-24 04:26:35 +03:00
|
|
|
});
|
2019-07-13 04:07:31 +03:00
|
|
|
});
|
2018-12-05 23:49:27 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
Task ("clean")
|
|
|
|
.Does (() =>
|
|
|
|
{
|
|
|
|
CleanVisualStudioSolution ();
|
2018-12-05 23:49:27 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
var deleteDirectorySettings = new DeleteDirectorySettings {
|
|
|
|
Recursive = true,
|
|
|
|
Force = true
|
|
|
|
};
|
2018-12-05 23:49:27 +03:00
|
|
|
|
2019-08-09 00:07:22 +03:00
|
|
|
if (DirectoryExists ("./externals/"))
|
|
|
|
DeleteDirectory ("./externals", deleteDirectorySettings);
|
2018-12-05 23:49:27 +03:00
|
|
|
|
2019-09-19 03:22:44 +03:00
|
|
|
if (DirectoryExists ("./output/"))
|
|
|
|
DeleteDirectory ("./output", deleteDirectorySettings);
|
2019-07-13 04:07:31 +03:00
|
|
|
});
|
2018-12-05 23:49:27 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
Teardown (context =>
|
|
|
|
{
|
|
|
|
var artifacts = GetFiles ("./output/**/*");
|
2018-12-05 23:49:27 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
if (artifacts?.Count () <= 0)
|
|
|
|
return;
|
2018-12-05 23:49:27 +03:00
|
|
|
|
2019-07-13 04:07:31 +03:00
|
|
|
Information ($"Found Artifacts ({artifacts.Count ()})");
|
|
|
|
foreach (var a in artifacts)
|
|
|
|
Information ("{0}", a);
|
2018-12-05 23:49:27 +03:00
|
|
|
});
|
|
|
|
|
2016-04-20 21:40:45 +03:00
|
|
|
RunTarget (TARGET);
|