@@ -417,36 +417,39 @@ not is_empty(DupModules)
417
417
io:: di, io:: uo) is det .
418
418
419
419
build_dependency_info( Targets , MaybeDeps , ! DirInfo , ! IO ) :-
420
- Modules0 = make_module_info( Targets ) ,
421
-
422
- % The term Target is overloaded here, it means both the whole things
423
- % that plzbuild is trying to build, but also the steps that ninja does
424
- % to build them.
425
- map_foldl2( find_module_file, Modules0 , MaybeModules0 , ! DirInfo , ! IO ) ,
426
- MaybeModules = result_list_to_result( MaybeModules0 ) ,
427
- find_foreign_sources( Targets , MaybeForeignSources , ! DirInfo , ! IO ) ,
428
-
429
- ( MaybeModules = ok( Modules ) ,
430
- MaybeForeignSources = ok( ForeignSources ) ,
431
- ModuleTargets = map( make_module_targets, Modules ) ,
432
- ProgramTargets = map( make_program_target, Targets ) ,
433
- ForeignLinkTargets = condense( map( make_foreign_link_targets,
434
- Targets )) ,
435
- ForeignCompileTargets = map( make_foreign_target, ForeignSources ) ,
436
-
437
- MaybeDeps = ok( condense( ModuleTargets ) ++
438
- ForeignCompileTargets ++
439
- ForeignLinkTargets ++ ProgramTargets )
440
-
441
- ; MaybeModules = ok( _ ) ,
442
- MaybeForeignSources = errors( Errors ) ,
443
- MaybeDeps = errors( Errors )
444
- ; MaybeModules = errors( Errors ) ,
445
- MaybeForeignSources = ok( _ ) ,
420
+ MaybeModules0 = make_module_info( Targets ) ,
421
+ ( MaybeModules0 = ok( Modules0 ) ,
422
+ % The term Target is overloaded here, it means both the whole things
423
+ % that plzbuild is trying to build, but also the steps that ninja does
424
+ % to build them.
425
+ map_foldl2( find_module_file, Modules0 , MaybeModules1 , ! DirInfo , ! IO ) ,
426
+ MaybeModules = result_list_to_result( MaybeModules1 ) ,
427
+ find_foreign_sources( Targets , MaybeForeignSources , ! DirInfo , ! IO ) ,
428
+
429
+ ( MaybeModules = ok( Modules ) ,
430
+ MaybeForeignSources = ok( ForeignSources ) ,
431
+ ModuleTargets = map( make_module_targets, Modules ) ,
432
+ ProgramTargets = map( make_program_target, Targets ) ,
433
+ ForeignLinkTargets = condense( map( make_foreign_link_targets,
434
+ Targets )) ,
435
+ ForeignCompileTargets = map( make_foreign_target, ForeignSources ) ,
436
+
437
+ MaybeDeps = ok( condense( ModuleTargets ) ++
438
+ ForeignCompileTargets ++
439
+ ForeignLinkTargets ++ ProgramTargets )
440
+
441
+ ; MaybeModules = ok( _ ) ,
442
+ MaybeForeignSources = errors( Errors ) ,
443
+ MaybeDeps = errors( Errors )
444
+ ; MaybeModules = errors( Errors ) ,
445
+ MaybeForeignSources = ok( _ ) ,
446
+ MaybeDeps = errors( Errors )
447
+ ; MaybeModules = errors( ErrorsA ) ,
448
+ MaybeForeignSources = errors( ErrorsB ) ,
449
+ MaybeDeps = errors( ErrorsA ++ ErrorsB )
450
+ )
451
+ ; MaybeModules0 = errors( Errors ) ,
446
452
MaybeDeps = errors( Errors )
447
- ; MaybeModules = errors( ErrorsA ) ,
448
- MaybeForeignSources = errors( ErrorsB ) ,
449
- MaybeDeps = errors( ErrorsA ++ ErrorsB )
450
453
) .
451
454
452
455
:- type module_info
@@ -457,12 +460,16 @@ not is_empty(DupModules)
457
460
mi_pcflags :: string
458
461
) .
459
462
460
- :- func make_module_info( list( target)) = list( module_info) .
463
+ :- func make_module_info( list( target)) = result ( list( module_info) , string ) .
461
464
462
465
make_module_info( Targets ) = Modules :-
463
466
Modules0 = condense( map( target_get_modules, Targets )) ,
464
- foldl( resolve_duplicate_modules, Modules0 , init, Modules1 ) ,
465
- Modules = map.values( Modules1 ) .
467
+ foldl_result( resolve_duplicate_modules, Modules0 , init, MaybeModules1 ) ,
468
+ ( MaybeModules1 = ok( Modules1 ) ,
469
+ Modules = ok( map.values( Modules1 ))
470
+ ; MaybeModules1 = errors( Error ) ,
471
+ Modules = errors( Error )
472
+ ) .
466
473
467
474
:- func target_get_modules( target) = list( module_info) .
468
475
@@ -473,30 +480,34 @@ not is_empty(DupModules)
473
480
Target ^ t_modules) .
474
481
475
482
:- pred resolve_duplicate_modules( module_info:: in,
476
- map( q_name, module_info) :: in, map( q_name, module_info) :: out) is det .
483
+ map( q_name, module_info) :: in,
484
+ result( map( q_name, module_info) , string) :: out) is det .
477
485
478
486
resolve_duplicate_modules( Module , ! Map ) :-
479
487
Name = Module ^ mi_name,
480
- map_set_or_update ( func( M ) = module_merge( M , Module ) ,
488
+ map_set_or_update_result ( func( M ) = module_merge( M , Module ) ,
481
489
Name , Module , ! Map ) .
482
490
483
- :- func module_merge( module_info, module_info) = module_info.
491
+ :- func module_merge( module_info, module_info) = result ( module_info, string ) .
484
492
485
493
module_merge( Ma , Mb ) =
486
- module_info( Ma ^ mi_name,
494
+ ( if Ma ^ mi_pcflags = Mb ^ mi_pcflags then
495
+ ok( module_info( Ma ^ mi_name,
487
496
context_earliest( Ma ^ mi_context, Mb ^ mi_context) ,
488
497
Ma ^ mi_file,
489
- Ma ^ mi_pcflags) :-
490
- expect( unify( Ma ^ mi_pcflags, Mb ^ mi_pcflags) ,
491
- $module , $pred , "Flags set for module differently in different
492
- programs" ) .
498
+ Ma ^ mi_pcflags))
499
+ else
500
+ return_error( context_earliest( Ma ^ mi_context, Mb ^ mi_context) ,
501
+ "Flags set for the same module in different programs do not match" )
502
+ ) .
493
503
494
504
:- pred find_module_file( module_info:: in,
495
505
result( module_info, string) :: out,
496
506
dir_info:: in, dir_info:: out, io:: di, io:: uo) is det .
497
507
498
508
find_module_file( Module , ModuleResult , ! DirInfo , ! IO ) :-
499
- find_module_file( "." , source_extension, Module ^ mi_name, FileRes , ! DirInfo , ! IO ) ,
509
+ find_module_file( "." , source_extension, Module ^ mi_name, FileRes ,
510
+ ! DirInfo , ! IO ) ,
500
511
( FileRes = yes ( File ) ,
501
512
ModuleResult = ok( Module ^ mi_file := File )
502
513
; FileRes = no ,
0 commit comments