Skip to content

Commit c357f55

Browse files
committed
Reorder extensions
Extensions are defined to mirror the modules defined in src. However, this leads to circular dependencies, where some extensions trigger loading of others. This is not properly handled by the precompiling logic in Julia as of Julia 1.9-1.11 (fixed in master, upcoming to Julia 1.12, or maybe it will be backported at some point). Here, I change the way extensions are organized to match the packages that are needed to load them. In this, I still maintain the abstraction that each module in `src` has its implementation in `ext/XYZExt.jl`. I also added the prefix `ClimaUtilities` to everything to make sure that it won't clash with anything.
1 parent 18bad9c commit c357f55

13 files changed

+96
-31
lines changed

NEWS.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
ClimaUtilities.jl Release Notes
22
===============================
33

4+
v0.1.9
5+
------
6+
7+
- Extensions are internally reorganized, removing precompilation errors. PR
8+
[#69](https://github.com/CliMA/ClimaUtilities.jl/pull/69)
9+
410
v0.1.8
511
------
612

Project.toml

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,29 @@ Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
99

1010
[weakdeps]
1111
Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
12+
CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
1213
ClimaComms = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d"
1314
ClimaCore = "d414da3d-4745-48bb-8d80-42e94e092884"
1415
ClimaCoreTempestRemap = "d934ef94-cdd4-4710-83d6-720549644b70"
15-
CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
1616
Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
1717
NCDatasets = "85f8d34a-cbdd-5861-8df4-14fed0d494ab"
1818

1919
[extensions]
20-
CUDAUtilsExt = ["ClimaCore", "CUDA"]
21-
DataHandlingExt = ["ClimaCore", "NCDatasets"]
22-
InterpolationsRegridderExt = ["Interpolations", "ClimaCore"]
23-
MPIUtilsExt = "ClimaComms"
24-
NCFileReaderExt = "NCDatasets"
25-
SpaceVaryingInputsExt = ["ClimaCore", "NCDatasets"]
26-
TempestRegridderExt = "ClimaCoreTempestRemap"
27-
TimeVaryingInputs0DExt = "ClimaCore"
28-
TimeVaryingInputsExt = ["ClimaCore", "NCDatasets"]
20+
ClimaUtilitiesClimaCoreExt = "ClimaCore"
21+
ClimaUtilitiesClimaCoreInterpolationsExt = ["ClimaCore", "Interpolations"]
22+
ClimaUtilitiesClimaCoreNCDatasetsExt = ["ClimaCore", "NCDatasets"]
23+
ClimaUtilitiesNCDatasetsExt = "NCDatasets"
24+
ClimaUtilitiesClimaCommsCUDAExt = ["ClimaComms", "CUDA"]
25+
ClimaUtilitiesClimaCommsExt = "ClimaComms"
26+
ClimaUtilitiesClimaCoreTempestRemapExt = "ClimaCoreTempestRemap"
2927

3028
[compat]
3129
Adapt = "3.3, 4"
3230
Artifacts = "1"
31+
CUDA = "5"
3332
ClimaComms = "0.5.6, 0.6"
3433
ClimaCore = "0.12, 0.13, 0.14"
3534
ClimaCoreTempestRemap = "0.3.13"
36-
CUDA = "5"
3735
Dates = "1"
3836
Interpolations = "0.15"
3937
NCDatasets = "0.13.1, 0.14"

README.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,18 @@ it should not depend on any package outside of the standard library and should
3939
have negligible import costs. To accomplish this, everything is implemented in
4040
Julia extensions.
4141

42+
Extensions are organized in the following way. The extensions defined in the
43+
`Project.toml` are defined in terms of the packages they require to be loaded.
44+
This avoids circular dependencies among extensions. Each of these extensions
45+
`include`s modules that match what is defined in `src`.
46+
47+
For example, `ClimaUtilitiesClimaCoreNCDatasetsExt` is loaded when `ClimaCore`
48+
and `NCDatasets` are loaded. Internally, `ClimaUtilitiesClimaCoreNCDatasetsExt`
49+
loads `DataHandlingExt.jl`, `SpaceVaryingInputsExt.jl`, and
50+
`TimeVaryingInputsExt.jl`. Each of them implements methods defined in
51+
`src/DataHandling.jl`, `src/SpaceVaryingInputs.jl`, and
52+
`src/TimeVaryingInputs.jl` respectively
53+
4254
### Tests and environments
4355

4456
We prioritize well-tested code to guarantee `ClimaUtilities.jl` functions
@@ -75,15 +87,15 @@ used by our Buildkite pipeline.
7587
7688
#### Running tests
7789

78-
There are two equivalent ways to run tests.
90+
There are two equivalent ways to run tests.
7991

8092
First, Start a Julia session in the `ClimaUtilities` directory:
8193
``` sh
8294
julia --project
8395
```
8496
Enter `Pkg` mode by typing `]`. This will change the prompt. Run `test`.
8597

86-
Equivalently, you can run
98+
Equivalently, you can run
8799
``` sh
88100
julia --project=test tests/runtests.jl
89101
```

docs/make.jl

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,17 @@ makedocs(
4444
clean = true,
4545
modules = [
4646
ClimaUtilities,
47-
Base.get_extension(ClimaUtilities, :DataHandlingExt),
48-
Base.get_extension(ClimaUtilities, :InterpolationsRegridderExt),
49-
Base.get_extension(ClimaUtilities, :MPIUtilsExt),
50-
Base.get_extension(ClimaUtilities, :NCFileReaderExt),
51-
Base.get_extension(ClimaUtilities, :SpaceVaryingInputsExt),
52-
Base.get_extension(ClimaUtilities, :TempestRegridderExt),
53-
Base.get_extension(ClimaUtilities, :TimeVaryingInputs0DExt),
54-
Base.get_extension(ClimaUtilities, :TimeVaryingInputsExt),
47+
Base.get_extension(ClimaUtilities, :ClimaUtilitiesClimaCoreExt),
48+
Base.get_extension(
49+
ClimaUtilities,
50+
:ClimaUtilitiesClimaCoreInterpolationsExt,
51+
),
52+
Base.get_extension(
53+
ClimaUtilities,
54+
:ClimaUtilitiesClimaCoreNCDatasetsExt,
55+
),
56+
Base.get_extension(ClimaUtilities, :ClimaUtilitiesNCDatasetsExt),
57+
Base.get_extension(ClimaUtilities, :ClimaUtilitiesClimaCommsExt),
5558
],
5659
)
5760

ext/CUDAUtilsExt.jl renamed to ext/ClimaUtilitiesClimaCommsCUDAExt.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
module CUDAUtilsExt
1+
module ClimaUtilitiesClimaCommsCUDAExt
22

3-
import ClimaCore: ClimaComms
3+
import ClimaComms
44
import ClimaUtilities
55
import ClimaUtilities.TimeVaryingInputs
66
import CUDA
@@ -17,8 +17,8 @@ function TimeVaryingInputs.evaluate!(
1717
@assert itp isa
1818
Base.get_extension(
1919
ClimaUtilities,
20-
:TimeVaryingInputs0DExt,
21-
).InterpolatingTimeVaryingInput0D
20+
:ClimaUtilitiesClimaCoreExt,
21+
).TimeVaryingInputs0DExt.InterpolatingTimeVaryingInput0D
2222
CUDA.@cuda TimeVaryingInputs.evaluate!(
2323
parent(destination),
2424
itp,

ext/ClimaUtilitiesClimaCommsExt.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module ClimaUtilitiesClimaCommsExt
2+
3+
include("MPIUtilsExt.jl")
4+
5+
end

ext/ClimaUtilitiesClimaCoreExt.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module ClimaUtilitiesClimaCoreExt
2+
3+
include("TimeVaryingInputs0DExt.jl")
4+
5+
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module ClimaUtilitiesClimaCoreInterpolationsExt
2+
3+
include("InterpolationsRegridderExt.jl")
4+
5+
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module ClimaUtilitiesClimaCoreNCDatasetsExt
2+
3+
include("DataHandlingExt.jl")
4+
include("SpaceVaryingInputsExt.jl")
5+
include("TimeVaryingInputsExt.jl")
6+
7+
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module ClimaUtilitiesClimaCoreTempestRemapExt
2+
3+
include("TempestRegridderExt.jl")
4+
5+
end

0 commit comments

Comments
 (0)