@@ -334,17 +334,41 @@ def merge(self, other):
334
334
self .filenames .append (d )
335
335
336
336
337
+ class ProfileArgs :
338
+ def __init__ (self , args ):
339
+ self ._args = args
340
+
341
+ @staticmethod
342
+ def from_args (args ):
343
+ pr_args = []
344
+ for context in "host" , "build" :
345
+ for f in "profile" , "settings" , "options" , "conf" :
346
+ s = "pr" if f == "profile" else f [0 ]
347
+ pr_args += [f'-{ s } :{ context [0 ]} ="{ v } "' for v in
348
+ getattr (args , f"{ f } _{ context } " ) or []]
349
+ return ProfileArgs (" " .join (pr_args ))
350
+
351
+ @staticmethod
352
+ def deserialize (data ):
353
+ return ProfileArgs (data .get ("args" ))
354
+
355
+ def serialize (self ):
356
+ return {"args" : self ._args }
357
+
358
+
337
359
class InstallGraph :
338
360
""" A graph containing the package references in order to be built/downloaded
339
361
"""
340
362
341
- def __init__ (self , deps_graph , order_by = None ):
363
+ def __init__ (self , deps_graph , order_by = None , profile_args = None ):
342
364
self ._nodes = {} # ref with rev: _InstallGraphNode
343
365
order_by = order_by or "recipe"
344
366
self ._order = order_by
345
367
self ._node_cls = _InstallRecipeReference if order_by == "recipe" else _InstallConfiguration
346
368
self ._is_test_package = False
347
369
self .reduced = False
370
+ self ._profiles = {"self" : profile_args } if profile_args is not None else {}
371
+ self ._filename = None
348
372
if deps_graph is not None :
349
373
self ._initialize_deps_graph (deps_graph )
350
374
self ._is_test_package = deps_graph .root .conanfile .tested_reference_str is not None
@@ -371,15 +395,24 @@ def merge(self, other):
371
395
self ._nodes [ref ] = install_node
372
396
else :
373
397
existing .merge (install_node )
398
+ # Make sure that self is also updated
399
+ current = self ._profiles .pop ("self" , None )
400
+ if current is not None :
401
+ self ._profiles [self ._filename ] = current
402
+ new = other ._profiles .get ("self" )
403
+ if new is not None :
404
+ self ._profiles [other ._filename ] = new
374
405
375
406
@staticmethod
376
407
def deserialize (data , filename ):
377
408
legacy = isinstance (data , list )
378
- order , data , reduced = ("recipe" , data , False ) if legacy else \
379
- (data ["order_by" ], data ["order" ], data ["reduced" ])
409
+ order , data , reduced , profiles = ("recipe" , data , False , {} ) if legacy else \
410
+ (data ["order_by" ], data ["order" ], data ["reduced" ], data . get ( "profiles" , {}) )
380
411
result = InstallGraph (None , order_by = order )
381
412
result .reduced = reduced
382
413
result .legacy = legacy
414
+ result ._filename = filename
415
+ result ._profiles = {k : ProfileArgs .deserialize (v ) for k , v in profiles .items ()}
383
416
for level in data :
384
417
for item in level :
385
418
elem = result ._node_cls .deserialize (item , filename )
@@ -464,17 +497,19 @@ def install_build_order(self):
464
497
install_order = self .install_order ()
465
498
result = {"order_by" : self ._order ,
466
499
"reduced" : self .reduced ,
467
- "order" : [[n .serialize () for n in level ] for level in install_order ]}
500
+ "order" : [[n .serialize () for n in level ] for level in install_order ],
501
+ "profiles" : {k : v .serialize () for k , v in self ._profiles .items ()}
502
+ }
468
503
return result
469
504
470
505
def _get_missing_invalid_packages (self ):
471
506
missing , invalid = [], []
472
507
473
- def analyze_package (package ):
474
- if package .binary == BINARY_MISSING :
475
- missing .append (package )
476
- elif package .binary == BINARY_INVALID :
477
- invalid .append (package )
508
+ def analyze_package (pkg ):
509
+ if pkg .binary == BINARY_MISSING :
510
+ missing .append (pkg )
511
+ elif pkg .binary == BINARY_INVALID :
512
+ invalid .append (pkg )
478
513
for _ , install_node in self ._nodes .items ():
479
514
if self ._order == "recipe" :
480
515
for package in install_node .packages .values ():
@@ -508,7 +543,8 @@ def get_errors(self):
508
543
return "\n " .join (errors )
509
544
return None
510
545
511
- def _raise_invalid (self , invalid ):
546
+ @staticmethod
547
+ def _raise_invalid (invalid ):
512
548
msg = ["There are invalid packages:" ]
513
549
for package in invalid :
514
550
node = package .nodes [0 ]
0 commit comments