@@ -565,78 +565,63 @@ def make_so(compiler, code, extension, comm):
565565 exe = compiler .cc
566566 compiler_flags = compiler .cflags
567567
568- # Compile on compilation communicator (ccomm) rank 0
569- if ccomm .rank == 0 :
570- # Track exceptions as values so that they may be raised collectively
568+ def compile_single_rank ():
569+ # Adding random 2-digit hexnum avoids using excessive filesystem inodes
570+ tempdir = MEM_TMP_DIR .joinpath (f"{ randint (0 , 255 ):02x} " )
571+ tempdir .mkdir (parents = True , exist_ok = True )
572+ # This path + filename should be unique
573+ descriptor , filename = mkstemp (suffix = f".{ extension } " , dir = tempdir , text = True )
574+ filename = Path (filename )
575+
576+ cname = filename
577+ oname = filename .with_suffix (".o" )
578+ soname = filename .with_suffix (".so" )
579+ logfile = filename .with_suffix (".log" )
580+ errfile = filename .with_suffix (".err" )
581+
571582 try :
572- # Adding random 2-digit hexnum avoids using excessive filesystem inodes
573- tempdir = MEM_TMP_DIR .joinpath (f"{ randint (0 , 255 ):02x} " )
574- tempdir .mkdir (parents = True , exist_ok = True )
575- # This path + filename should be unique
576- descriptor , filename = mkstemp (suffix = f".{ extension } " , dir = tempdir , text = True )
577- filename = Path (filename )
578-
579- cname = filename
580- oname = filename .with_suffix (".o" )
581- soname = filename .with_suffix (".so" )
582- logfile = filename .with_suffix (".log" )
583- errfile = filename .with_suffix (".err" )
584- except BaseException as e :
585- result = e
586- else :
587- try :
588- with progress (INFO , 'Compiling wrapper' ):
589- # Write source code to disk
590- with open (cname , "w" ) as fh :
591- fh .write (code )
592- os .close (descriptor )
593-
594- if not compiler .ld :
595- # Compile and link
596- cc = (exe ,) + compiler_flags + ('-o' , str (soname ), str (cname )) + compiler .ldflags
597- _run (cc , logfile , errfile )
598- else :
599- # Compile
600- cc = (exe ,) + compiler_flags + ('-c' , '-o' , str (oname ), str (cname ))
601- _run (cc , logfile , errfile )
602- # Extract linker specific "cflags" from ldflags and link
603- ld = tuple (shlex .split (compiler .ld )) + ('-o' , str (soname ), str (oname )) + tuple (expandWl (compiler .ldflags ))
604- _run (ld , logfile , errfile , step = "Linker" , filemode = "a" )
605-
606- result = soname
607- except subprocess .CalledProcessError as e :
608- msg = dedent (f"""
609- Command "{ e .cmd } " return error status { e .returncode } .
610- Unable to compile code
611- """ )
612- if os .environ .get ("FIREDRAKE_CI" , False ):
613- msg += dedent (f"""
614- Code is:
615- { code }
616- """ )
617- with open (errfile ) as err :
618- msg += dedent (f"""
619- Compiler output is:
620- { '' .join (err .readlines ())}
621- """ )
583+ with progress (INFO , 'Compiling wrapper' ):
584+ # Write source code to disk
585+ with open (cname , "w" ) as fh :
586+ fh .write (code )
587+ os .close (descriptor )
588+
589+ if not compiler .ld :
590+ # Compile and link
591+ cc = (exe ,) + compiler_flags + ('-o' , str (soname ), str (cname )) + compiler .ldflags
592+ _run (cc , logfile , errfile )
622593 else :
594+ # Compile
595+ cc = (exe ,) + compiler_flags + ('-c' , '-o' , str (oname ), str (cname ))
596+ _run (cc , logfile , errfile )
597+ # Extract linker specific "cflags" from ldflags and link
598+ ld = tuple (shlex .split (compiler .ld )) + ('-o' , str (soname ), str (oname )) + tuple (expandWl (compiler .ldflags ))
599+ _run (ld , logfile , errfile , step = "Linker" , filemode = "a" )
600+ except subprocess .CalledProcessError as e :
601+ msg = dedent (f"""
602+ Command "{ e .cmd } " return error status { e .returncode } .
603+ Unable to compile code
604+ """ )
605+ if os .environ .get ("FIREDRAKE_CI" , False ):
606+ msg += dedent (f"""
607+ Code is:
608+ { code }
609+ """ )
610+ with open (errfile ) as err :
623611 msg += dedent (f"""
624- Compile log in { logfile !s }
625- Compile errors in { errfile !s }
612+ Compiler output is:
613+ { '' . join ( err . readlines ()) }
626614 """ )
627- result = CompilationError (msg )
628- result .__cause__ = e # equivalent to 'raise XXX from e'
629- except BaseException as e :
630- # catch and broadcast all exceptions to prevent deadlocks
631- result = e
632- else :
633- result = None
615+ else :
616+ msg += dedent (f"""
617+ Compile log in { logfile !s}
618+ Compile errors in { errfile !s}
619+ """ )
620+ raise CompilationError (msg ) from e
621+ else :
622+ return soname
634623
635- result = ccomm .bcast (result )
636- if isinstance (result , BaseException ):
637- raise result
638- else :
639- return result
624+ return mpi .safe_noncollective (ccomm , compile_single_rank , root = 0 )
640625
641626
642627def _run (cc , logfile , errfile , step = "Compilation" , filemode = "w" ):
0 commit comments