2025-03-31 14:55:24 +08:00
using HybridCLR.Editor.Installer ;
using HybridCLR.Editor.Settings ;
using System.IO ;
using System.Text ;
2025-06-12 18:00:06 +08:00
using System.Text.RegularExpressions ;
2025-03-31 14:55:24 +08:00
using UnityEditor ;
using UnityEditor.Build ;
using UnityEditor.Callbacks ;
using UnityEngine ;
2025-06-12 18:00:06 +08:00
#if UNITY_2022 & & ( UNITY_IOS | | UNITY_TVOS | | UNITY_VISIONOS )
2025-03-31 14:55:24 +08:00
namespace HybridCLR.Editor.BuildProcessors
{
public static class AddLil2cppSourceCodeToXcodeproj2022OrNewer
{
[PostProcessBuild]
public static void OnPostProcessBuild ( BuildTarget target , string pathToBuiltProject )
{
2025-06-12 18:00:06 +08:00
if ( ! HybridCLRSettings . Instance . enable )
2025-03-31 14:55:24 +08:00
return ;
2025-06-12 18:00:06 +08:00
string pbxprojFile = BuildProcessorUtil . GetXcodeProjectFile ( pathToBuiltProject ) ;
2025-03-31 14:55:24 +08:00
RemoveExternalLibil2cppOption ( pbxprojFile ) ;
CopyLibil2cppToXcodeProj ( pathToBuiltProject ) ;
}
2025-06-12 18:00:06 +08:00
private static string TryRemoveDunplicateShellScriptSegment ( string pbxprojFile , string pbxprojContent )
{
// will appear duplicated Shell Script segment when append to existed xcode project.
// This is unity bug.
// we remove duplicated Shell Script to avoid build error.
string copyFileComment = @"/\* CopyFiles \*/,\s+([A-Z0-9]{24}) /\* ShellScript \*/,\s+([A-Z0-9]{24}) /\* ShellScript \*/," ;
var m = Regex . Match ( pbxprojContent , copyFileComment , RegexOptions . Multiline ) ;
if ( ! m . Success )
{
return pbxprojContent ;
}
if ( m . Groups [ 1 ] . Value ! = m . Groups [ 2 ] . Value )
{
throw new BuildFailedException ( $"find invalid /* ShellScript */ segment" ) ;
}
int startIndexOfDupShellScript = m . Groups [ 2 ] . Index ;
int endIndexOfDupShellScript = pbxprojContent . IndexOf ( "," , startIndexOfDupShellScript ) ;
pbxprojContent = pbxprojContent . Remove ( startIndexOfDupShellScript , endIndexOfDupShellScript + 1 - startIndexOfDupShellScript ) ;
Debug . LogWarning ( $"[AddLil2cppSourceCodeToXcodeproj] remove duplicated '/* ShellScript */' from file '{pbxprojFile}'" ) ;
return pbxprojContent ;
}
2025-03-31 14:55:24 +08:00
private static void RemoveExternalLibil2cppOption ( string pbxprojFile )
{
string pbxprojContent = File . ReadAllText ( pbxprojFile , Encoding . UTF8 ) ;
string removeBuildOption = @"--external-lib-il2-cpp=\""$PROJECT_DIR/Libraries/libil2cpp.a\""" ;
2025-06-12 18:00:06 +08:00
if ( pbxprojContent . Contains ( removeBuildOption ) )
2025-03-31 14:55:24 +08:00
{
2025-06-12 18:00:06 +08:00
pbxprojContent = pbxprojContent . Replace ( removeBuildOption , "" ) ;
Debug . Log ( $"[AddLil2cppSourceCodeToXcodeproj] remove il2cpp build option '{removeBuildOption}' from file '{pbxprojFile}'" ) ;
}
else
{
Debug . LogWarning ( $"[AddLil2cppSourceCodeToXcodeproj] project.pbxproj remove building option:'{removeBuildOption}' fail. This may occur when 'Append' to existing xcode project in building" ) ;
2025-03-31 14:55:24 +08:00
}
2025-06-12 18:00:06 +08:00
pbxprojContent = TryRemoveDunplicateShellScriptSegment ( pbxprojFile , pbxprojContent ) ;
2025-03-31 14:55:24 +08:00
File . WriteAllText ( pbxprojFile , pbxprojContent , Encoding . UTF8 ) ;
}
private static void CopyLibil2cppToXcodeProj ( string pathToBuiltProject )
{
string srcLibil2cppDir = $"{SettingsUtil.LocalIl2CppDir}/libil2cpp" ;
string destLibil2cppDir = $"{pathToBuiltProject}/Il2CppOutputProject/IL2CPP/libil2cpp" ;
BashUtil . RemoveDir ( destLibil2cppDir ) ;
BashUtil . CopyDir ( srcLibil2cppDir , destLibil2cppDir , true ) ;
}
}
}
#endif