Skip to content

Commit 0becd27

Browse files
authored
Create a parent CMake project for building app bundles on CI (#58965)
1 parent 206dba7 commit 0becd27

6 files changed

Lines changed: 294 additions & 75 deletions

File tree

eng/testing/AppleRunnerTemplate.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ if [[ "$TARGET" == "ios-device" ]]; then SCHEME_SDK=Release-iphoneos; fi
3535
if [[ "$TARGET" == "tvos-device" ]]; then SCHEME_SDK=Release-appletvos; fi
3636
if [[ "$TARGET" == "maccatalyst" ]]; then SCHEME_SDK=Release-maccatalyst; fi
3737

38+
if [[ "$TARGET" == "ios-device" || "$TARGET" == "tvos-device" ]]; then SIGNAL_APP_END="--signal-app-end"; fi
39+
3840
cd $EXECUTION_DIR
3941

4042
# it doesn't support parallel execution yet, so, here is a hand-made semaphore:
@@ -62,6 +64,7 @@ $HARNESS_RUNNER apple $XHARNESS_CMD \
6264
--targets="$TARGET" \
6365
--xcode="$XCODE_PATH" \
6466
--output-directory="$XHARNESS_OUT" \
67+
$SIGNAL_APP_END \
6568
$ADDITIONAL_ARGS
6669

6770
_exitCode=$?

eng/testing/tests.mobile.targets

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
<PropertyGroup>
33
<!-- OutDir is not set early enough to set this property in .props file. -->
44
<BundleDir>$([MSBuild]::NormalizeDirectory('$(OutDir)', 'AppBundle'))</BundleDir>
5+
<PublishDir Condition="'$(UseAppBundleRootForBuildingTests)' == 'true' and '$(IgnoreForCI)' != 'true' and '$(IsFunctionalTest)' != 'true'">$(AppBundleRoot)tests\$(AssemblyName)</PublishDir>
6+
<PublishDir Condition="'$(UseAppBundleRootForBuildingTests)' == 'true' and '$(IgnoreForCI)' != 'true' and '$(IsFunctionalTest)' == 'true'">$(AppBundleRoot)runonly\$(AssemblyName)</PublishDir>
7+
<BundleDir Condition="'$(UseAppBundleRootForBuildingTests)' == 'true' and '$(IgnoreForCI)' != 'true'">$([MSBuild]::NormalizeDirectory('$(PublishDir)', 'AppBundle'))</BundleDir>
58
<RunScriptOutputPath>$([MSBuild]::NormalizePath('$(BundleDir)', '$(RunScriptOutputName)'))</RunScriptOutputPath>
69
<RunAOTCompilation Condition="'$(TargetOS)' == 'iOS' or '$(TargetOS)' == 'tvOS'">true</RunAOTCompilation>
710

@@ -159,6 +162,10 @@
159162
<Optimized>true</Optimized>
160163
<MainLibraryFileName Condition="'$(MainLibraryFileName)' == ''">AppleTestRunner.dll</MainLibraryFileName>
161164
<_MobileIntermediateOutputPath Condition="'$(RunAOTCompilation)' == 'true'">$(IntermediateOutputPath)mobile</_MobileIntermediateOutputPath>
165+
<GenerateXcodeProject>true</GenerateXcodeProject>
166+
<GenerateCMakeProject>false</GenerateCMakeProject>
167+
<GenerateXcodeProject Condition="'$(UseAppBundleRootForBuildingTests)' == 'true'">false</GenerateXcodeProject>
168+
<GenerateCMakeProject Condition="'$(UseAppBundleRootForBuildingTests)' == 'true' and '$(IgnoreForCI)' != 'true'">true</GenerateCMakeProject>
162169
</PropertyGroup>
163170
<PropertyGroup>
164171
<AOTMode Condition="'$(TargetOS)' != 'MacCatalyst'">Full</AOTMode>
@@ -217,26 +224,27 @@
217224
ForceInterpreter="$(MonoForceInterpreter)"
218225
InvariantGlobalization="$(InvariantGlobalization)"
219226
UseConsoleUITemplate="True"
220-
GenerateXcodeProject="True"
221-
BuildAppBundle="True"
227+
GenerateXcodeProject="$(GenerateXcodeProject)"
228+
GenerateCMakeProject="$(GenerateCMakeProject)"
229+
BuildAppBundle="$(GenerateXcodeProject)"
222230
Optimized="$(Optimized)"
223231
DevTeamProvisioning="$(DevTeamProvisioning)"
224232
OutputDirectory="$(BundleDir)"
225233
AppDir="$(PublishDir)">
226234
<Output TaskParameter="AppBundlePath" PropertyName="AppBundlePath" />
227235
<Output TaskParameter="XcodeProjectPath" PropertyName="XcodeProjectPath" />
228236
</AppleAppBuilderTask>
229-
<Message Importance="High" Text="Xcode: $(XcodeProjectPath)"/>
230-
<Message Importance="High" Text="App: $(AppBundlePath)"/>
237+
<Message Importance="High" Text="Xcode: $(XcodeProjectPath)" Condition="'$(GenerateXcodeProject)' == 'true'" />
238+
<Message Importance="High" Text="App: $(AppBundlePath)" Condition="'$(GenerateXcodeProject)' == 'true'"/>
231239

232-
<ItemGroup>
240+
<ItemGroup Condition="'$(GenerateXcodeProject)' == 'true'">
233241
<_appFiles Include="$(AppBundlePath)/../**/*" />
234242
</ItemGroup>
235243

236244
<Copy SourceFiles="@(_appFiles)"
237245
DestinationFolder="$(TestArchiveTestsDir)/%(RecursiveDir)"
238246
SkipUnchangedFiles="true"
239-
Condition="'$(ArchiveTests)' == 'true' and '$(IgnoreForCI)' != 'true'" />
247+
Condition="'$(ArchiveTests)' == 'true' and '$(IgnoreForCI)' != 'true' and '$(GenerateXcodeProject)' == 'true'" />
240248

241249
<RemoveDir Condition="'$(ArchiveTests)' == 'true' and '$(IgnoreForCI)' != 'true'"
242250
Directories="$(OutDir)" />

src/libraries/Directory.Build.props

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@
116116
<TestArchiveTestsDir>$(TestArchiveTestsRoot)$(OSPlatformConfig)/</TestArchiveTestsDir>
117117
<TestArchiveRuntimeRoot>$(TestArchiveRoot)runtime/</TestArchiveRuntimeRoot>
118118

119+
<UseAppBundleRootForBuildingTests Condition="'$(ArchiveTests)' == 'true' and ('$(TargetOS)' == 'MacCatalyst' or '$(TargetOS)' == 'iOS' or '$(TargetOS)' == 'iOSSimulator' or '$(TargetOS)' == 'tvOS' or '$(TargetOS)' == 'tvOSSimulator')">true</UseAppBundleRootForBuildingTests>
120+
<AppBundleRoot Condition="'$(UseAppBundleRootForBuildingTests)' == 'true'">$(ArtifactsDir)bundles\</AppBundleRoot>
121+
119122
<NetCoreAppCurrentRefPath>$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'ref', '$(NetCoreAppCurrent)'))</NetCoreAppCurrentRefPath>
120123
<NetCoreAppCurrentRuntimePath>$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'runtime', '$(NetCoreAppCurrent)-$(TargetOS)-$(Configuration)-$(TargetArchitecture)'))</NetCoreAppCurrentRuntimePath>
121124

src/libraries/tests.proj

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,85 @@
332332
Condition="'$(TestAssemblies)' == 'true' and
333333
'$(Coverage)' == 'true'" />
334334

335+
<!-- Build Apple app bundles using AppBundleRoot -->
336+
<UsingTask Condition="'$(UseAppBundleRootForBuildingTests)' == 'true'"
337+
TaskName="XcodeCreateProject"
338+
AssemblyFile="$(AppleAppBuilderTasksAssemblyPath)" />
339+
340+
<UsingTask Condition="'$(UseAppBundleRootForBuildingTests)' == 'true'"
341+
TaskName="XcodeBuildApp"
342+
AssemblyFile="$(AppleAppBuilderTasksAssemblyPath)" />
343+
344+
<Target Condition="'$(UseAppBundleRootForBuildingTests)' == 'true'"
345+
Name="BuildAppleAppBundles"
346+
AfterTargets="Build">
347+
348+
<PropertyGroup>
349+
<!-- TODO: Unify this with TestArchiveTestsRoot in src/libraries/Directory.Build.props somehow,
350+
we can't use IsFunctionalTest==true here because it is only set in the context of the .csproj -->
351+
<TestArchiveNormalTestsRoot>$(TestArchiveRoot)tests/</TestArchiveNormalTestsRoot>
352+
<TestArchiveFunctionalTestsRoot>$(TestArchiveRoot)runonly/</TestArchiveFunctionalTestsRoot>
353+
354+
<TestArchiveNormalTestsDir>$(TestArchiveNormalTestsRoot)$(OSPlatformConfig)/</TestArchiveNormalTestsDir>
355+
<TestArchiveFunctionalTestsDir>$(TestArchiveFunctionalTestsRoot)$(OSPlatformConfig)/</TestArchiveFunctionalTestsDir>
356+
357+
<NormalTestsAppBundleRoot>$(AppBundleRoot)/tests/</NormalTestsAppBundleRoot>
358+
<FunctionalTestsAppBundleRoot>$(AppBundleRoot)/runonly/</FunctionalTestsAppBundleRoot>
359+
360+
<NormalTestsAllAppBundlesRoot>$(AppBundleRoot)/tests.all/</NormalTestsAllAppBundlesRoot>
361+
<FunctionalTestsAllAppBundlesRoot>$(AppBundleRoot)/runonly.all/</FunctionalTestsAllAppBundlesRoot>
362+
</PropertyGroup>
363+
364+
<ItemGroup>
365+
<NormalTestAppBundles Include="$(NormalTestsAppBundleRoot)*/AppBundle/CMakeLists.txt" />
366+
<NormalTestCMakeEntries Include="cmake_minimum_required(VERSION 3.16)" />
367+
<NormalTestCMakeEntries Include="project(NormalTestAppBundles)" />
368+
<NormalTestCMakeEntries Include="add_subdirectory(%(NormalTestAppBundles.RootDir)%(NormalTestAppBundles.Directory) %(NormalTestAppBundles.RecursiveDir) EXCLUDE_FROM_ALL)" />
369+
370+
<FunctionalTestAppBundles Include="$(FunctionalTestsAppBundleRoot)*/AppBundle/CMakeLists.txt" />
371+
<FunctionalTestCMakeEntries Include="cmake_minimum_required(VERSION 3.16)" />
372+
<FunctionalTestCMakeEntries Include="project(FunctionalTestAppBundles)" />
373+
<FunctionalTestCMakeEntries Include="add_subdirectory(%(FunctionalTestAppBundles.RootDir)%(FunctionalTestAppBundles.Directory) %(FunctionalTestAppBundles.RecursiveDir) EXCLUDE_FROM_ALL)" />
374+
</ItemGroup>
375+
376+
<WriteLinesToFile File="$(NormalTestsAllAppBundlesRoot)CMakeLists.txt" Lines="@(NormalTestCMakeEntries)" Overwrite="true" WriteOnlyWhenDifferent="true" />
377+
<WriteLinesToFile File="$(FunctionalTestsAllAppBundlesRoot)CMakeLists.txt" Lines="@(FunctionalTestCMakeEntries)" Overwrite="true" WriteOnlyWhenDifferent="true" />
378+
379+
<XcodeCreateProject
380+
TargetOS="$(TargetOS)"
381+
Arch="$(TargetArchitecture)"
382+
ProjectName="NormalTestAppBundles"
383+
CMakeListsDirectory="$(NormalTestsAllAppBundlesRoot)"
384+
Condition="'@(NormalTestAppBundles)' != ''" />
385+
386+
<XcodeCreateProject
387+
TargetOS="$(TargetOS)"
388+
Arch="$(TargetArchitecture)"
389+
ProjectName="FunctionalTestAppBundles"
390+
CMakeListsDirectory="$(FunctionalTestsAllAppBundlesRoot)"
391+
Condition="'@(FunctionalTestAppBundles)' != ''" />
392+
393+
<MakeDir Directories="$(TestArchiveNormalTestsDir)" />
394+
<MakeDir Directories="$(TestArchiveFunctionalTestsDir)" />
395+
396+
<ItemGroup>
397+
<!-- xcodeproj are directories, not files -->
398+
<XcodeProjects Condition="'@(NormalTestAppBundles)' != ''" Include="$([System.IO.Directory]::GetDirectories('$(NormalTestsAllAppBundlesRoot)NormalTestAppBundles/%(NormalTestAppBundles.RecursiveDir)', '*.xcodeproj'))" DestinationFolder="$(TestArchiveNormalTestsDir)" />
399+
<XcodeProjects Condition="'@(FunctionalTestAppBundles)' != ''" Include="$([System.IO.Directory]::GetDirectories('$(FunctionalTestsAllAppBundlesRoot)FunctionalTestAppBundles/%(FunctionalTestAppBundles.RecursiveDir)', '*.xcodeproj'))" DestinationFolder="$(TestArchiveFunctionalTestsDir)" />
400+
</ItemGroup>
401+
402+
<XcodeBuildApp
403+
TargetOS="$(TargetOS)"
404+
Arch="$(TargetArchitecture)"
405+
XcodeProjectPath="%(XcodeProjects.Identity)"
406+
DevTeamProvisioning="$(DevTeamProvisioning)"
407+
Optimized="True"
408+
DestinationFolder="%(XcodeProjects.DestinationFolder)" />
409+
410+
<RemoveDir Condition="'$(ArchiveTests)' == 'true'"
411+
Directories="$(AppBundleRoot)" />
412+
</Target>
413+
335414
<!-- Restoring all trimming test projects upfront in one single call to RestoreTrimmingProjects
336415
so as to avoid possible race conditions that could happen if we restore each individually. -->
337416
<Target Name="RestoreTrimmingProjects"

src/tasks/AppleAppBuilder/AppleAppBuilder.cs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class AppleAppBuilderTask : Task
1515
private string targetOS = TargetNames.iOS;
1616

1717
/// <summary>
18-
/// The Apple OS we are targeting (iOS or tvOS)
18+
/// The Apple OS we are targeting (ios, tvos, iossimulator, tvossimulator)
1919
/// </summary>
2020
[Required]
2121
public string TargetOS
@@ -64,7 +64,7 @@ public string TargetOS
6464
public ITaskItem[] Assemblies { get; set; } = Array.Empty<ITaskItem>();
6565

6666
/// <summary>
67-
/// Target arch, can be "arm64" (device) or "x64" (simulator) at the moment
67+
/// Target arch, can be "arm64", "arm" or "x64" at the moment
6868
/// </summary>
6969
[Required]
7070
public string Arch { get; set; } = ""!;
@@ -106,6 +106,11 @@ public string TargetOS
106106
/// </summary>
107107
public bool GenerateXcodeProject { get; set; }
108108

109+
/// <summary>
110+
/// Generate CMake project
111+
/// </summary>
112+
public bool GenerateCMakeProject { get; set; }
113+
109114
/// <summary>
110115
/// Files to be ignored in AppDir
111116
/// </summary>
@@ -224,14 +229,12 @@ public override bool Execute()
224229
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
225230
}
226231

232+
var generator = new Xcode(Log, TargetOS, Arch);
233+
227234
if (GenerateXcodeProject)
228235
{
229-
Xcode generator = new Xcode(Log, TargetOS, Arch);
230-
generator.EnableRuntimeLogging = EnableRuntimeLogging;
231-
generator.DiagnosticPorts = DiagnosticPorts;
232-
233236
XcodeProjectPath = generator.GenerateXCode(ProjectName, MainLibraryFileName, assemblerFiles, assemblerFilesToLink,
234-
AppDir, binDir, MonoRuntimeHeaders, !isDevice, UseConsoleUITemplate, ForceAOT, ForceInterpreter, InvariantGlobalization, Optimized, RuntimeComponents, NativeMainSource);
237+
AppDir, binDir, MonoRuntimeHeaders, !isDevice, UseConsoleUITemplate, ForceAOT, ForceInterpreter, InvariantGlobalization, Optimized, EnableRuntimeLogging, DiagnosticPorts, RuntimeComponents, NativeMainSource);
235238

236239
if (BuildAppBundle)
237240
{
@@ -242,10 +245,15 @@ public override bool Execute()
242245
}
243246
else
244247
{
245-
AppBundlePath = generator.BuildAppBundle(XcodeProjectPath, Arch, Optimized, DevTeamProvisioning);
248+
AppBundlePath = generator.BuildAppBundle(XcodeProjectPath, Optimized, DevTeamProvisioning);
246249
}
247250
}
248251
}
252+
else if (GenerateCMakeProject)
253+
{
254+
generator.GenerateCMake(ProjectName, MainLibraryFileName, assemblerFiles, assemblerFilesToLink,
255+
AppDir, binDir, MonoRuntimeHeaders, !isDevice, UseConsoleUITemplate, ForceAOT, ForceInterpreter, InvariantGlobalization, Optimized, EnableRuntimeLogging, DiagnosticPorts, RuntimeComponents, NativeMainSource);
256+
}
249257

250258
return true;
251259
}

0 commit comments

Comments
 (0)