@@ -1080,6 +1080,13 @@ public Options.Vc.Compiler.Exceptions GetExceptionSettingForFile(string filename
1080
1080
return Sharpmake . Options . Vc . Compiler . Exceptions . Disable ;
1081
1081
}
1082
1082
1083
+ /// <summary>
1084
+ /// When enabled dependendent libraries will be sorted by their dependencies. This can be
1085
+ /// used to fix linker errors on linux platforms that expect libraries to be included in a
1086
+ /// specific order
1087
+ /// </summary>
1088
+ public bool AutoDependenciesOrder = false ;
1089
+
1083
1090
/// <summary>
1084
1091
/// Gets a list of the search directories for static libraries.
1085
1092
/// </summary>
@@ -1151,7 +1158,7 @@ public void AddDependencyBuiltTargetLibraryFile(string libraryFile, int orderNum
1151
1158
{
1152
1159
if ( _linkState != LinkState . Linking )
1153
1160
throw new Error ( $ "Cannot add built target lib '{ libraryFile } ' outside of the link process of the Project.Configuration") ;
1154
- DependenciesBuiltTargetsLibraryFiles . Add ( libraryFile , orderNumber ) ;
1161
+ DependenciesBuiltTargetsLibraryFiles . Add ( libraryFile , orderNumber , OrderableStrings . OrderResolve . Greater ) ;
1155
1162
}
1156
1163
1157
1164
public OrderableStrings DependenciesForceUsingFiles = new OrderableStrings ( ) ;
@@ -2850,15 +2857,17 @@ private static int SortConfigurationForLink(Configuration l, Configuration r)
2850
2857
2851
2858
internal class DependencyNode
2852
2859
{
2853
- internal DependencyNode ( Configuration inConfiguration , DependencySetting inDependencySetting )
2860
+ internal DependencyNode ( Configuration inConfiguration , DependencySetting inDependencySetting , int autoDependenciesOrder = 0 )
2854
2861
{
2855
2862
_configuration = inConfiguration ;
2856
2863
_dependencySetting = inDependencySetting ;
2864
+ _autoDependenciesOrder = autoDependenciesOrder ;
2857
2865
}
2858
2866
2859
2867
internal Configuration _configuration ;
2860
2868
internal DependencySetting _dependencySetting ;
2861
2869
internal Dictionary < DependencyNode , DependencyType > _childNodes = new Dictionary < DependencyNode , DependencyType > ( ) ;
2870
+ internal int _autoDependenciesOrder ;
2862
2871
}
2863
2872
2864
2873
public class VcxprojUserFileSettings
@@ -3105,8 +3114,9 @@ internal void Link(Builder builder)
3105
3114
if ( dependencySetting . HasFlag ( DependencySetting . LibraryPaths ) )
3106
3115
DependenciesOtherLibraryPaths . AddRange ( dependency . LibraryPaths ) ;
3107
3116
3117
+ // Use dependency.TargetFileOrderNumber to make sure to group dependent libraries by their dependencies
3108
3118
if ( dependencySetting . HasFlag ( DependencySetting . LibraryFiles ) )
3109
- DependenciesOtherLibraryFiles . AddRange ( dependency . LibraryFiles ) ;
3119
+ DependenciesOtherLibraryFiles . AddRange ( dependency . LibraryFiles , dependency . TargetFileOrderNumber , OrderableStrings . OrderResolve . Greater ) ;
3110
3120
3111
3121
if ( dependencySetting . HasFlag ( DependencySetting . ForceUsingAssembly ) )
3112
3122
DependenciesForceUsingFiles . AddRange ( dependency . ForceUsingFiles ) ;
@@ -3138,8 +3148,9 @@ internal void Link(Builder builder)
3138
3148
if ( dependencySetting . HasFlag ( DependencySetting . LibraryPaths ) )
3139
3149
DependenciesOtherLibraryPaths . AddRange ( dependency . LibraryPaths ) ;
3140
3150
3151
+ // Use dependency.TargetFileOrderNumber to make sure to group dependent libraries by their dependencies
3141
3152
if ( dependencySetting . HasFlag ( DependencySetting . LibraryFiles ) )
3142
- DependenciesOtherLibraryFiles . AddRange ( dependency . LibraryFiles ) ;
3153
+ DependenciesOtherLibraryFiles . AddRange ( dependency . LibraryFiles , dependency . TargetFileOrderNumber , OrderableStrings . OrderResolve . Greater ) ;
3143
3154
}
3144
3155
}
3145
3156
@@ -3303,6 +3314,7 @@ static private DependencyNode BuildDependencyNodeTree(Builder builder, Configura
3303
3314
3304
3315
Stack < DependencyNode > visiting = new Stack < DependencyNode > ( ) ;
3305
3316
visiting . Push ( rootNode ) ;
3317
+
3306
3318
while ( visiting . Count > 0 )
3307
3319
{
3308
3320
DependencyNode visitedNode = visiting . Pop ( ) ;
@@ -3322,6 +3334,11 @@ static private DependencyNode BuildDependencyNodeTree(Builder builder, Configura
3322
3334
3323
3335
visited . Add ( visitedConfiguration , visitedNode ) ;
3324
3336
3337
+ if ( visitedConfiguration . AutoDependenciesOrder )
3338
+ {
3339
+ visitedConfiguration . TargetFileOrderNumber = Math . Max ( visitedConfiguration . TargetFileOrderNumber , visitedNode . _autoDependenciesOrder ) ;
3340
+ }
3341
+
3325
3342
var unresolvedDependencies = new [ ] { visitedConfiguration . UnResolvedPublicDependencies , visitedConfiguration . UnResolvedPrivateDependencies } ;
3326
3343
foreach ( Dictionary < Type , ITarget > dependencies in unresolvedDependencies )
3327
3344
{
@@ -3340,7 +3357,8 @@ static private DependencyNode BuildDependencyNodeTree(Builder builder, Configura
3340
3357
if ( ! visitedConfiguration . _dependenciesSetting . TryGetValue ( pair , out dependencySetting ) )
3341
3358
dependencySetting = DependencySetting . Default ;
3342
3359
3343
- DependencyNode childNode = new DependencyNode ( dependencyConf , dependencySetting ) ;
3360
+ // We use steps of 1000 to allow for related libraries to be grouped alongside their dependencies
3361
+ DependencyNode childNode = new DependencyNode ( dependencyConf , dependencySetting , visitedNode . _autoDependenciesOrder + 1000 ) ;
3344
3362
System . Diagnostics . Debug . Assert ( ! visitedNode . _childNodes . ContainsKey ( childNode ) ) ;
3345
3363
visitedNode . _childNodes . Add ( childNode , dependencyType ) ;
3346
3364
0 commit comments