1515import nunavut
1616import nunavut .lang
1717import nunavut .jinja
18-
18+ from pycyphal . dsdl . _lockfile import Locker
1919
2020_AnyPath = Union [str , pathlib .Path ]
2121
@@ -171,26 +171,12 @@ def compile( # pylint: disable=redefined-builtin
171171 (root_namespace_name ,) = set (map (lambda x : x .root_namespace , composite_types )) # type: ignore
172172 _logger .info ("Read %d definitions from root namespace %r" , len (composite_types ), root_namespace_name )
173173
174- # Generate code
175- assert isinstance (output_directory , pathlib .Path )
176174 root_ns = nunavut .build_namespace_tree (
177175 types = composite_types ,
178176 root_namespace_dir = str (root_namespace_directory ),
179177 output_dir = str (output_directory ),
180178 language_context = language_context ,
181179 )
182- code_generator = nunavut .jinja .DSDLCodeGenerator (
183- namespace = root_ns ,
184- generate_namespace_types = nunavut .YesNoDefault .YES ,
185- followlinks = True ,
186- )
187- code_generator .generate_all ()
188- _logger .info (
189- "Generated %d types from the root namespace %r in %.1f seconds" ,
190- len (composite_types ),
191- root_namespace_name ,
192- time .monotonic () - started_at ,
193- )
194180 else :
195181 root_ns = nunavut .build_namespace_tree (
196182 types = [],
@@ -199,28 +185,35 @@ def compile( # pylint: disable=redefined-builtin
199185 language_context = language_context ,
200186 )
201187
202- support_generator = nunavut .jinja .SupportGenerator (
203- namespace = root_ns ,
204- )
205- support_generator .generate_all ()
206-
207- # A minor UX improvement; see https://github.com/OpenCyphal/pycyphal/issues/115
208- for p in sys .path :
209- if pathlib .Path (p ).resolve () == pathlib .Path (output_directory ):
210- break
211- else :
212- if os .name == "nt" :
213- quick_fix = f'Quick fix: `$env:PYTHONPATH += ";{ output_directory .resolve ()} "`'
214- elif os .name == "posix" :
215- quick_fix = f'Quick fix: `export PYTHONPATH="{ output_directory .resolve ()} "`'
216- else :
217- quick_fix = "Quick fix is not available for this OS."
218- _logger .info (
219- "Generated package is stored in %r, which is not in Python module search path list. "
220- "The package will fail to import unless you add the destination directory to sys.path or PYTHONPATH. %s" ,
221- str (output_directory ),
222- quick_fix ,
223- )
188+ if root_namespace_name is not None :
189+ with Locker (
190+ root_namespace_name = root_namespace_name ,
191+ output_directory = output_directory ,
192+ ) as lockfile :
193+ if lockfile :
194+ assert isinstance (output_directory , pathlib .Path )
195+ code_generator = nunavut .jinja .DSDLCodeGenerator (
196+ namespace = root_ns ,
197+ generate_namespace_types = nunavut .YesNoDefault .YES ,
198+ followlinks = True ,
199+ )
200+ code_generator .generate_all ()
201+ _logger .info (
202+ "Generated %d types from the root namespace %r in %.1f seconds" ,
203+ len (composite_types ),
204+ root_namespace_name ,
205+ time .monotonic () - started_at ,
206+ )
207+
208+ with Locker (
209+ root_namespace_name = "_support_" ,
210+ output_directory = output_directory ,
211+ ) as support_lockfile :
212+ if support_lockfile :
213+ support_generator = nunavut .jinja .SupportGenerator (
214+ namespace = root_ns ,
215+ )
216+ support_generator .generate_all ()
224217
225218 return GeneratedPackageInfo (
226219 path = pathlib .Path (output_directory ) / pathlib .Path (root_namespace_name ),
0 commit comments