@@ -1151,7 +1151,7 @@ public void AddDependencyBuiltTargetLibraryFile(string libraryFile, int orderNum
1151
1151
{
1152
1152
if ( _linkState != LinkState . Linking )
1153
1153
throw new Error ( $ "Cannot add built target lib '{ libraryFile } ' outside of the link process of the Project.Configuration") ;
1154
- DependenciesBuiltTargetsLibraryFiles . Add ( libraryFile , orderNumber ) ;
1154
+ DependenciesBuiltTargetsLibraryFiles . Add ( libraryFile , orderNumber , OrderableStrings . OrderResolve . Greater ) ;
1155
1155
}
1156
1156
1157
1157
public OrderableStrings DependenciesForceUsingFiles = new OrderableStrings ( ) ;
@@ -2850,15 +2850,17 @@ private static int SortConfigurationForLink(Configuration l, Configuration r)
2850
2850
2851
2851
internal class DependencyNode
2852
2852
{
2853
- internal DependencyNode ( Configuration inConfiguration , DependencySetting inDependencySetting )
2853
+ internal DependencyNode ( Configuration inConfiguration , DependencySetting inDependencySetting , int autoDependenciesOrder = 0 )
2854
2854
{
2855
2855
_configuration = inConfiguration ;
2856
2856
_dependencySetting = inDependencySetting ;
2857
+ _autoDependenciesOrder = autoDependenciesOrder ;
2857
2858
}
2858
2859
2859
2860
internal Configuration _configuration ;
2860
2861
internal DependencySetting _dependencySetting ;
2861
2862
internal Dictionary < DependencyNode , DependencyType > _childNodes = new Dictionary < DependencyNode , DependencyType > ( ) ;
2863
+ internal int _autoDependenciesOrder ;
2862
2864
}
2863
2865
2864
2866
public class VcxprojUserFileSettings
@@ -3105,8 +3107,9 @@ internal void Link(Builder builder)
3105
3107
if ( dependencySetting . HasFlag ( DependencySetting . LibraryPaths ) )
3106
3108
DependenciesOtherLibraryPaths . AddRange ( dependency . LibraryPaths ) ;
3107
3109
3110
+ // Use dependency.TargetFileOrderNumber to make sure to group dependent libraries by their dependencies
3108
3111
if ( dependencySetting . HasFlag ( DependencySetting . LibraryFiles ) )
3109
- DependenciesOtherLibraryFiles . AddRange ( dependency . LibraryFiles ) ;
3112
+ DependenciesOtherLibraryFiles . AddRange ( dependency . LibraryFiles , dependency . TargetFileOrderNumber , OrderableStrings . OrderResolve . Greater ) ;
3110
3113
3111
3114
if ( dependencySetting . HasFlag ( DependencySetting . ForceUsingAssembly ) )
3112
3115
DependenciesForceUsingFiles . AddRange ( dependency . ForceUsingFiles ) ;
@@ -3138,8 +3141,9 @@ internal void Link(Builder builder)
3138
3141
if ( dependencySetting . HasFlag ( DependencySetting . LibraryPaths ) )
3139
3142
DependenciesOtherLibraryPaths . AddRange ( dependency . LibraryPaths ) ;
3140
3143
3144
+ // Use dependency.TargetFileOrderNumber to make sure to group dependent libraries by their dependencies
3141
3145
if ( dependencySetting . HasFlag ( DependencySetting . LibraryFiles ) )
3142
- DependenciesOtherLibraryFiles . AddRange ( dependency . LibraryFiles ) ;
3146
+ DependenciesOtherLibraryFiles . AddRange ( dependency . LibraryFiles , dependency . TargetFileOrderNumber , OrderableStrings . OrderResolve . Greater ) ;
3143
3147
}
3144
3148
}
3145
3149
@@ -3303,6 +3307,7 @@ static private DependencyNode BuildDependencyNodeTree(Builder builder, Configura
3303
3307
3304
3308
Stack < DependencyNode > visiting = new Stack < DependencyNode > ( ) ;
3305
3309
visiting . Push ( rootNode ) ;
3310
+
3306
3311
while ( visiting . Count > 0 )
3307
3312
{
3308
3313
DependencyNode visitedNode = visiting . Pop ( ) ;
@@ -3322,6 +3327,11 @@ static private DependencyNode BuildDependencyNodeTree(Builder builder, Configura
3322
3327
3323
3328
visited . Add ( visitedConfiguration , visitedNode ) ;
3324
3329
3330
+ if ( visitedConfiguration . Project . AutoDependenciesOrder )
3331
+ {
3332
+ visitedConfiguration . TargetFileOrderNumber = Math . Max ( visitedConfiguration . TargetFileOrderNumber , visitedNode . _autoDependenciesOrder ) ;
3333
+ }
3334
+
3325
3335
var unresolvedDependencies = new [ ] { visitedConfiguration . UnResolvedPublicDependencies , visitedConfiguration . UnResolvedPrivateDependencies } ;
3326
3336
foreach ( Dictionary < Type , ITarget > dependencies in unresolvedDependencies )
3327
3337
{
@@ -3340,7 +3350,8 @@ static private DependencyNode BuildDependencyNodeTree(Builder builder, Configura
3340
3350
if ( ! visitedConfiguration . _dependenciesSetting . TryGetValue ( pair , out dependencySetting ) )
3341
3351
dependencySetting = DependencySetting . Default ;
3342
3352
3343
- DependencyNode childNode = new DependencyNode ( dependencyConf , dependencySetting ) ;
3353
+ // We use steps of 1000 to allow for related libraries to be grouped alongside their dependencies
3354
+ DependencyNode childNode = new DependencyNode ( dependencyConf , dependencySetting , visitedNode . _autoDependenciesOrder + 1000 ) ;
3344
3355
System . Diagnostics . Debug . Assert ( ! visitedNode . _childNodes . ContainsKey ( childNode ) ) ;
3345
3356
visitedNode . _childNodes . Add ( childNode , dependencyType ) ;
3346
3357
0 commit comments