@@ -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 ( ) ;
@@ -1697,10 +1697,33 @@ internal void Resolve(Resolver resolver)
1697
1697
public string TargetFileFullNameWithExtension { get ; internal set ; } = "[conf.TargetFileFullName][conf.TargetFileFullExtension]" ;
1698
1698
1699
1699
/// <summary>
1700
- /// Gets or sets the ordering index of the target when added as a library to another
1700
+ /// Sets the ordering index of the target when added as a library to another. This will only affect the order of libraries
1701
+ /// at the same dependency level. Dependent libraries always appear first.
1701
1702
/// project.
1703
+ /// Gets the combined user order and dependency order.
1702
1704
/// </summary>
1703
- public int TargetFileOrderNumber = 0 ;
1705
+ public int TargetFileOrderNumber
1706
+ {
1707
+ get
1708
+ {
1709
+ return _targetFileOrderNumber + _autoFileOrderNumer ;
1710
+ }
1711
+ set
1712
+ {
1713
+ if ( value <= - _autoFileNumberStep / 2 || value >= _autoFileNumberStep / 2 )
1714
+ {
1715
+ throw new ArgumentOutOfRangeException ( string . Format ( "TargetFileOrderNumber should only be between {0} and {1}. Got {2}" ,
1716
+ - _autoFileNumberStep / 2 , _autoFileNumberStep / 2 , value ) ) ;
1717
+ }
1718
+ _targetFileOrderNumber = value ;
1719
+ }
1720
+ }
1721
+
1722
+ internal int _targetFileOrderNumber = 0 ;
1723
+ // Used internaly to order by dependency before applying TargetFileOrderNumber or other ordering
1724
+ internal int _autoFileOrderNumer = 0 ;
1725
+ // Make depdencies 1000 items from each other, this means that a user would need to put huge numbers in target file orders to cause cross over
1726
+ internal const int _autoFileNumberStep = 1000 ;
1704
1727
1705
1728
/// <summary>
1706
1729
/// Gets or sets the ordering index of the library paths when added as a library to
@@ -2856,6 +2879,21 @@ internal DependencyNode(Configuration inConfiguration, DependencySetting inDepen
2856
2879
_dependencySetting = inDependencySetting ;
2857
2880
}
2858
2881
2882
+ internal void UpdateAutoDependencies ( )
2883
+ {
2884
+ // Configurations are shared so it's likely the dependency has been processed already so don't process it again
2885
+ // dependency roots will always be 0, but also have no children, anyone else will have a non-zero value once set
2886
+ // and that value should remain stable each time the dependency tree is walked.
2887
+ if ( _configuration . _autoFileOrderNumer == 0 )
2888
+ {
2889
+ foreach ( var child in _childNodes )
2890
+ {
2891
+ child . Key . UpdateAutoDependencies ( ) ;
2892
+ _configuration . _autoFileOrderNumer = Math . Min ( _configuration . _autoFileOrderNumer , child . Key . _configuration . _autoFileOrderNumer - 1000 ) ;
2893
+ }
2894
+ }
2895
+ }
2896
+
2859
2897
internal Configuration _configuration ;
2860
2898
internal DependencySetting _dependencySetting ;
2861
2899
internal Dictionary < DependencyNode , DependencyType > _childNodes = new Dictionary < DependencyNode , DependencyType > ( ) ;
@@ -3105,8 +3143,9 @@ internal void Link(Builder builder)
3105
3143
if ( dependencySetting . HasFlag ( DependencySetting . LibraryPaths ) )
3106
3144
DependenciesOtherLibraryPaths . AddRange ( dependency . LibraryPaths ) ;
3107
3145
3146
+ // Use dependency.TargetFileOrderNumber to make sure to group dependent libraries by their dependencies
3108
3147
if ( dependencySetting . HasFlag ( DependencySetting . LibraryFiles ) )
3109
- DependenciesOtherLibraryFiles . AddRange ( dependency . LibraryFiles ) ;
3148
+ DependenciesOtherLibraryFiles . AddRange ( dependency . LibraryFiles , dependency . TargetFileOrderNumber , OrderableStrings . OrderResolve . Greater ) ;
3110
3149
3111
3150
if ( dependencySetting . HasFlag ( DependencySetting . ForceUsingAssembly ) )
3112
3151
DependenciesForceUsingFiles . AddRange ( dependency . ForceUsingFiles ) ;
@@ -3138,8 +3177,9 @@ internal void Link(Builder builder)
3138
3177
if ( dependencySetting . HasFlag ( DependencySetting . LibraryPaths ) )
3139
3178
DependenciesOtherLibraryPaths . AddRange ( dependency . LibraryPaths ) ;
3140
3179
3180
+ // Use dependency.TargetFileOrderNumber to make sure to group dependent libraries by their dependencies
3141
3181
if ( dependencySetting . HasFlag ( DependencySetting . LibraryFiles ) )
3142
- DependenciesOtherLibraryFiles . AddRange ( dependency . LibraryFiles ) ;
3182
+ DependenciesOtherLibraryFiles . AddRange ( dependency . LibraryFiles , dependency . TargetFileOrderNumber , OrderableStrings . OrderResolve . Greater ) ;
3143
3183
}
3144
3184
}
3145
3185
@@ -3303,6 +3343,7 @@ static private DependencyNode BuildDependencyNodeTree(Builder builder, Configura
3303
3343
3304
3344
Stack < DependencyNode > visiting = new Stack < DependencyNode > ( ) ;
3305
3345
visiting . Push ( rootNode ) ;
3346
+
3306
3347
while ( visiting . Count > 0 )
3307
3348
{
3308
3349
DependencyNode visitedNode = visiting . Pop ( ) ;
@@ -3340,6 +3381,7 @@ static private DependencyNode BuildDependencyNodeTree(Builder builder, Configura
3340
3381
if ( ! visitedConfiguration . _dependenciesSetting . TryGetValue ( pair , out dependencySetting ) )
3341
3382
dependencySetting = DependencySetting . Default ;
3342
3383
3384
+ // We use steps of 1000 to allow for related libraries to be grouped alongside their dependencies
3343
3385
DependencyNode childNode = new DependencyNode ( dependencyConf , dependencySetting ) ;
3344
3386
System . Diagnostics . Debug . Assert ( ! visitedNode . _childNodes . ContainsKey ( childNode ) ) ;
3345
3387
visitedNode . _childNodes . Add ( childNode , dependencyType ) ;
@@ -3349,6 +3391,9 @@ static private DependencyNode BuildDependencyNodeTree(Builder builder, Configura
3349
3391
}
3350
3392
}
3351
3393
3394
+ // update dependency hierarchy
3395
+ rootNode . UpdateAutoDependencies ( ) ;
3396
+
3352
3397
return rootNode ;
3353
3398
}
3354
3399
0 commit comments