2019-08-23 22:03:43 +03:00
|
|
|
#addin nuget:?package=Cake.XCode&version=4.1.0
|
|
|
|
#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"
|
|
|
|
#load "custom_externals_download.cake"
|
|
|
|
|
|
|
|
var TARGET = Argument ("t", Argument ("target", "build"));
|
|
|
|
var SDKS = Argument ("sdks", "");
|
|
|
|
|
|
|
|
var SOLUTION_PATH = "./Xamarin.Google.sln";
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
|
|
// Podfile basic structure
|
|
|
|
var PODFILE_BEGIN = new [] {
|
|
|
|
"platform :ios, '{0}'",
|
|
|
|
"install! 'cocoapods', :integrate_targets => false",
|
|
|
|
"use_frameworks!",
|
|
|
|
"target 'XamarinGoogle' do",
|
|
|
|
};
|
|
|
|
var PODFILE_END = new [] {
|
|
|
|
"end",
|
|
|
|
};
|
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 (),
|
|
|
|
Arguments = new Dictionary<string, string> { { "target", target }, { "sdks", SDKS } },
|
|
|
|
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-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-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-06 07:51:50 +03:00
|
|
|
if (string.IsNullOrWhiteSpace (SDKS)) {
|
2019-07-13 04:07:31 +03:00
|
|
|
orderedArtifactsForBuild.AddRange (ARTIFACTS.Values);
|
2019-08-06 07:51:50 +03:00
|
|
|
orderedArtifactsForSamples.AddRange (ARTIFACTS.Values);
|
2016-04-20 21:40:45 +03:00
|
|
|
} else {
|
2019-07-13 04:07:31 +03:00
|
|
|
var sdks = SDKS.Split (',');
|
|
|
|
foreach (var sdk in sdks) {
|
|
|
|
if (!(ARTIFACTS.ContainsKey (sdk) && ARTIFACTS [sdk] is Artifact artifact))
|
|
|
|
throw new Exception($"The {sdk} component does not exist.");
|
2018-03-19 23:00:48 +03:00
|
|
|
|
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 19:54:55 +03:00
|
|
|
SOURCES_TARGETS.Add($@"{artifact.ComponentGroup}\{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 19:54:55 +03:00
|
|
|
SAMPLES_TARGETS.Add($@"{artifact.ComponentGroup}\{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")
|
|
|
|
.WithCriteria (!DirectoryExists ("./externals/"))
|
|
|
|
.Does (() =>
|
2016-04-20 21:40:45 +03:00
|
|
|
{
|
2019-07-13 04:07:31 +03:00
|
|
|
EnsureDirectoryExists ("./externals/");
|
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-07-13 04:07:31 +03:00
|
|
|
foreach (var artifact in ARTIFACTS_TO_BUILD) {
|
|
|
|
UpdateVersionInCsproj (artifact);
|
|
|
|
CreateAndInstallPodfile (artifact);
|
|
|
|
BuildSdkOnPodfile (artifact);
|
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
|
|
|
|
});
|
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";
|
|
|
|
c.MaxCpuCount = 0;
|
|
|
|
c.Targets.Clear();
|
2019-08-26 19:54:55 +03:00
|
|
|
c.Targets.Add($@"source\{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";
|
|
|
|
c.MaxCpuCount = 0;
|
|
|
|
c.Targets.Clear();
|
2019-08-26 19:54:55 +03:00
|
|
|
c.Targets.Add($@"samples\{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-08-23 22:03:43 +03:00
|
|
|
EnsureDirectoryExists("./artifacts");
|
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 19:54:55 +03:00
|
|
|
c.Targets.Add($@"source\{target}:Pack");
|
2019-08-24 04:26:35 +03:00
|
|
|
c.Properties.Add("PackageOutputPath", new [] { "../../../artifacts/" });
|
|
|
|
});
|
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-07-13 04:07:31 +03:00
|
|
|
if (DirectoryExists ("./output/"))
|
|
|
|
DeleteDirectory ("./output", deleteDirectorySettings);
|
|
|
|
});
|
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);
|