Skip to content

Commit

Permalink
Add HelloIOS sample and create IosTestBundle within AppleApp project
Browse files Browse the repository at this point in the history
  • Loading branch information
yhuang-i authored and jspelletier committed Dec 8, 2023
1 parent f00af8a commit 936fbd1
Show file tree
Hide file tree
Showing 37 changed files with 1,534 additions and 37 deletions.
14 changes: 14 additions & 0 deletions SamplesDef.json
Expand Up @@ -472,6 +472,20 @@
"./Compile.ps1 -slnOrPrjFile \"XCodeProjects_mac_xcode.xcworkspace\" -configuration {configuration}_fastbuild -WorkingDirectory \"{testFolder}/temp/solutions\" -compiler xcode -scheme \"GetBrightness FastBuild\"",
"./Compile.ps1 -slnOrPrjFile \"XCodeProjects_mac_xcode.xcworkspace\" -configuration {configuration}_fastbuild -WorkingDirectory \"{testFolder}/temp/solutions\" -compiler xcode -scheme \"SetBrightness FastBuild\""
]
},
{
"Name": "HelloIOS",
"CIs": [ "github", "gitlab" ],
"OSs": [ "macos" ],
"Frameworks": [ "net6.0" ],
"Configurations": [ "debug", "release" ],
"TestFolder": "samples/HelloIOS",
"Commands":
[
"xcodebuild -version",
"./RunSharpmake.ps1 -workingDirectory {testFolder} -sharpmakeFile \"HelloIOS.Main.sharpmake.cs\" -framework {framework}",
"xcodebuild build-for-testing CODE_SIGNING_ALLOWED=NO -workspace {testFolder}/codebase/temp/solutions/HelloIOS_ios.xcworkspace -configuration {configuration} -scheme exe_ios -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 12 Pro' test -derivedDataPath {testFolder}/test"
]
}
]
}
18 changes: 13 additions & 5 deletions Sharpmake.Generators/Apple/XCodeProj.Template.cs
Expand Up @@ -381,22 +381,30 @@ private static class Template
@" [item.Uid] /* UnitTest Target - [item.Optimization] */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = ""[testHost]"";
BUNDLE_LOADER = ""$(TEST_HOST)"";
CODE_SIGN_IDENTITY = ""[item.Options.CodeSigningIdentity]"";
""CODE_SIGN_IDENTITY[sdk=iphoneos*]"" = ""[item.Options.CodeSigningIdentity]"";
CONFIGURATION_BUILD_DIR = ""[item.Options.BuildDirectory]"";
EXCLUDED_SOURCE_FILE_NAMES = [item.Options.ExcludedSourceFileNames];
DEVELOPMENT_TEAM = [item.Options.DevelopmentTeam];
EXCLUDED_SOURCE_FILE_NAMES = [ExcludedSourceFileNames];
FRAMEWORK_SEARCH_PATHS = (
[item.Options.FrameworkPaths]
);
GCC_DYNAMIC_NO_PIC = [item.Options.DynamicNoPic];
GCC_ENABLE_CPP_RTTI = [item.Options.RuntimeTypeInfo];
GCC_SYMBOLS_PRIVATE_EXTERN = [item.Options.PrivateSymbols];
INFOPLIST_FILE = ""[item.Options.InfoPListFile]"";
PRODUCT_NAME = ""[item.Configuration.TargetFileName]"";
HEADER_SEARCH_PATHS = [item.Options.IncludePaths];
INFOPLIST_FILE = ""[item.Options.UnitTestInfoPListFile]"";
IPHONEOS_DEPLOYMENT_TARGET = ""[item.Options.IPhoneOSDeploymentTarget]"";
LIBRARY_SEARCH_PATHS = [item.Options.LibraryPaths];
OTHER_LDFLAGS = -ObjC;
PRODUCT_NAME = ""[item.Target.Identifier]"";
PRODUCT_BUNDLE_IDENTIFIER = ""[item.Options.ProductBundleIdentifier].unittest"";
SYMROOT = ""[SymRoot]"";
TARGETED_DEVICE_FAMILY = ""[item.Options.TargetedDeviceFamily]"";
TEST_HOST = ""[testHost]"";
WRAPPER_EXTENSION = xctest;
};
};
name = [item.Options.TargetName];
};
" },
Expand Down
242 changes: 211 additions & 31 deletions Sharpmake.Generators/Apple/XCodeProj.cs

Large diffs are not rendered by default.

Expand Up @@ -793,6 +793,12 @@ public virtual void SelectCompilerOptions(IGenerationContext context)
else
options["InfoPListFile"] = FileGeneratorUtilities.RemoveLineTag;

Options.XCode.Compiler.UnitTestInfoPListFile unitTestInfoPListFile = Options.GetObject<Options.XCode.Compiler.UnitTestInfoPListFile>(conf);
if (unitTestInfoPListFile != null)
options["UnitTestInfoPListFile"] = XCodeUtil.ResolveProjectPaths(project, unitTestInfoPListFile.Value);
else
options["UnitTestInfoPListFile"] = FileGeneratorUtilities.RemoveLineTag;

context.SelectOption(
Options.Option(Options.XCode.Compiler.ICloud.Disable, () => options["iCloud"] = "0"),
Options.Option(Options.XCode.Compiler.ICloud.Enable, () => options["iCloud"] = "1")
Expand Down
2 changes: 1 addition & 1 deletion Sharpmake.UnitTests/TestXcodeProjectGenerator.cs
Expand Up @@ -45,7 +45,7 @@ public void TestUncompilableNotInCompileSources()
xcodePrj._projectItems.Add(projectSourcesBuildPhase);
xcodePrj._sourcesBuildPhases.Add(xCodeTargetName, projectSourcesBuildPhase);
xcodePrj.SetRootGroup(project, configuration);
xcodePrj.PrepareSourceFiles(xCodeTargetName, sourceFiles, project, configuration);
xcodePrj.PrepareSourceFiles(xCodeTargetName, sourceFiles, project, configuration, false);
var compileSources = xcodePrj._projectItems.Where(item => item is ProjectBuildFile);

Assert.IsTrue(compileSources.Count() == 0);
Expand Down
9 changes: 9 additions & 0 deletions Sharpmake/Options.XCode.cs
Expand Up @@ -333,6 +333,15 @@ public InfoPListFile(string value)
}
}

public class UnitTestInfoPListFile
{
public string Value;
public UnitTestInfoPListFile(string value)
{
Value = value;
}
}

public enum ICloud
{
[Default]
Expand Down
27 changes: 27 additions & 0 deletions Sharpmake/Project.Configuration.cs
Expand Up @@ -2582,6 +2582,33 @@ public void GeneratorSetGeneratedInformation(string executableExtension, string

public Strings ResolvedSourceFilesBuildExclude = new Strings();

private Strings _XcodeUnitTestSourceFilesBuildExclude = null;
public Strings XcodeUnitTestSourceFilesBuildExclude
{
get
{
if (_XcodeUnitTestSourceFilesBuildExclude == null)
{
_XcodeUnitTestSourceFilesBuildExclude = new Strings();
}
return _XcodeUnitTestSourceFilesBuildExclude;
}
private set { _XcodeUnitTestSourceFilesBuildExclude = value; }
}
private Strings _XcodeResolvedUnitTestSourceFilesBuildExclude = null;
public Strings XcodeResolvedUnitTestSourceFilesBuildExclude
{
get
{
if (_XcodeResolvedUnitTestSourceFilesBuildExclude == null)
{
_XcodeResolvedUnitTestSourceFilesBuildExclude = new Strings();
}
return _XcodeResolvedUnitTestSourceFilesBuildExclude;
}
private set { _XcodeResolvedUnitTestSourceFilesBuildExclude = value; }
}

public Strings ResolvedSourceFilesBlobExclude = new Strings();

public Strings ResolvedSourceFilesGenerateXmlDocumentationExclude = new Strings();
Expand Down
8 changes: 8 additions & 0 deletions Sharpmake/Project.cs
Expand Up @@ -22,6 +22,8 @@ public string Name
set { SetProperty(ref _name, value); }
}

public string XcodeUnitTestTargetName = "XCTest";

private bool _isFileNameToLower = true; // Makes the ProjectName ToLower or not
public bool IsFileNameToLower
{
Expand Down Expand Up @@ -148,6 +150,10 @@ public int SourceFilesFiltersCount
public Strings ResourceFiles = new Strings();
public Strings ResourceFilesExtensions = new Strings();

public string XcodeUnitTestSourceRootPath; // Source root path in the project for Xcode unit test target
public Strings XcodeUnitTestSourceFiles = new Strings(); // Source files in the project for Xcode unit test target
public Strings XcodeUnitTestSourceFilesBuildExclude = new Strings(); // Source files to be excluded from build from XcodeUnitTestSourceFiles

public Strings NatvisFiles = new Strings();
public Strings NatvisFilesExtensions = new Strings(".natvis");

Expand Down Expand Up @@ -425,6 +431,8 @@ private IEnumerable<Strings> GetStringFields()
yield return SourceFilesBlobExtensions;
yield return ResourceFiles;
yield return ResourceFilesExtensions;
yield return XcodeUnitTestSourceFiles;
yield return XcodeUnitTestSourceFilesBuildExclude;
yield return NatvisFiles;
yield return NatvisFilesExtensions;
yield return PRIFilesExtensions;
Expand Down
148 changes: 148 additions & 0 deletions samples/HelloIOS/HelloIOS.CommonProject.sharpmake.cs
@@ -0,0 +1,148 @@
// Copyright (c) 2020-2021 Ubisoft Entertainment
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using System.IO;
using System.Linq;
using Sharpmake;

namespace HelloIOS
{
public static class ConfigurePriorities
{
public const int All = -75;
public const int Platform = -50;
public const int Optimization = -25;
/* SHARPMAKE DEFAULT IS 0 */
public const int Blobbing = 10;
public const int BuildSystem = 30;
}

public abstract class CommonProject : Sharpmake.Project
{
protected CommonProject()
: base(typeof(CommonTarget))
{
AddTargets(CommonTarget.GetDefaultTargets());

RootPath = Globals.RootDirectory;
IsFileNameToLower = false;
IsTargetFileNameToLower = false;

SourceFilesExtensions.Add(".m", ".mm"); // Objective-C, and Objective-C++ for iOS
SourceFilesCompileExtensions.Add(".m", ".mm");

SourceRootPath = @"[project.RootPath]/[project.Name]";
}

[ConfigurePriority(ConfigurePriorities.All)]
[Configure]
public virtual void ConfigureAll(Configuration conf, CommonTarget target)
{
conf.ProjectFileName = "[project.Name]_[target.Platform]";
if (target.DevEnv != DevEnv.xcode)
conf.ProjectFileName += "_[target.DevEnv]";
conf.ProjectPath = Path.Combine(Globals.TmpDirectory, @"projects\[project.Name]");
conf.IsFastBuild = target.BuildSystem == BuildSystem.FastBuild;

conf.IntermediatePath = Path.Combine(Globals.TmpDirectory, @"obj\[target.DirectoryName]\[project.Name]");
conf.TargetPath = Path.Combine(Globals.OutputDirectory, "[target.DirectoryName]");

// Note: uncomment the following line if we port this sample to windows
//conf.TargetLibraryPath = conf.IntermediatePath; // // .lib files must be with the .obj files when running in fastbuild distributed mode or we'll have missing symbols due to merging of the .pdb
conf.TargetLibraryPath = Path.Combine(Globals.TmpDirectory, @"lib\[target.DirectoryName]\[project.Name]");

// TODO: uncomment and fix this. Didn't find a way to have product with
// different names per configurations to work properly...
//conf.TargetFileName += "_" + target.Optimization.ToString().ToLowerInvariant().First(); // suffix with lowered first letter of optim
if (conf.IsFastBuild)
conf.TargetFileName += "x";

conf.Output = Configuration.OutputType.Lib; // defaults to creating static libs
}

////////////////////////////////////////////////////////////////////////
#region Platfoms
[ConfigurePriority(ConfigurePriorities.Platform)]
[Configure(Platform.ios)]
public virtual void ConfigureIos(Configuration conf, CommonTarget target)
{
if (conf.IsFastBuild)
{
conf.Options.Add(new Sharpmake.Options.XCode.Compiler.Archs("arm64"));
conf.Options.Add(new Sharpmake.Options.XCode.Compiler.ValidArchs("arm64"));
conf.Options.Add(new Options.XCode.Compiler.IPhoneOSDeploymentTarget("13.0"));
}
}
#endregion
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
#region Optimizations
[ConfigurePriority(ConfigurePriorities.Optimization)]
[Configure(Optimization.Debug)]
public virtual void ConfigureDebug(Configuration conf, CommonTarget target)
{
conf.DefaultOption = Options.DefaultTarget.Debug;
}

[ConfigurePriority(ConfigurePriorities.Optimization)]
[Configure(Optimization.Release)]
public virtual void ConfigureRelease(Configuration conf, CommonTarget target)
{
conf.DefaultOption = Options.DefaultTarget.Release;
}
#endregion
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
#region Blobs and unitys
[Configure(Blob.FastBuildUnitys)]
[ConfigurePriority(ConfigurePriorities.Blobbing)]
public virtual void FastBuildUnitys(Configuration conf, CommonTarget target)
{
conf.FastBuildBlobbed = true;
conf.FastBuildUnityPath = Path.Combine(Globals.TmpDirectory, @"unity\[project.Name]");
conf.IncludeBlobbedSourceFiles = false;
conf.IsBlobbed = false;
}

[Configure(Blob.NoBlob)]
[ConfigurePriority(ConfigurePriorities.Blobbing)]
public virtual void BlobNoBlob(Configuration conf, CommonTarget target)
{
conf.FastBuildBlobbed = false;
conf.IsBlobbed = false;

if (conf.IsFastBuild)
conf.ProjectName += "_NoBlob";
}
#endregion
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
#region Compilers and toolchains
[ConfigurePriority(ConfigurePriorities.BuildSystem)]
[Configure(BuildSystem.FastBuild)]
public virtual void ConfigureFastBuild(Configuration conf, CommonTarget target)
{
conf.SolutionFolder = "FastBuild/" + conf.SolutionFolder;
conf.ProjectName += "_FastBuild";
conf.ProjectFileName += "_FastBuild";

conf.Defines.Add("USES_FASTBUILD");
}
#endregion
////////////////////////////////////////////////////////////////////////
}
}
38 changes: 38 additions & 0 deletions samples/HelloIOS/HelloIOS.CommonSolution.sharpmake.cs
@@ -0,0 +1,38 @@
// Copyright (c) 2020 Ubisoft Entertainment
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using Sharpmake;

namespace HelloIOS
{
public class CommonSolution : Sharpmake.Solution
{
public CommonSolution()
: base(typeof(CommonTarget))
{
IsFileNameToLower = false;
}

[ConfigurePriority(ConfigurePriorities.All)]
[Configure]
public virtual void ConfigureAll(Configuration conf, CommonTarget target)
{
conf.SolutionFileName = "[solution.Name]_[target.Platform]";
if (target.DevEnv != DevEnv.xcode)
conf.SolutionFileName += "_[target.DevEnv]";
conf.PlatformName = "[target.SolutionPlatformName]";
conf.SolutionPath = System.IO.Path.Combine(Globals.TmpDirectory, "solutions");
}
}
}

0 comments on commit 936fbd1

Please sign in to comment.