Skip to content

Commit b007e1f

Browse files
authored
Build archive files for packages (#234)
* Build archive files for packages * Sort packages * Update dictionary * Fix linting * Refactor * Refactor * Define FFI archive suffix * Modify lib/os * Remove unused argument * Ignore entire lib/os * Refactor
1 parent b2fe744 commit b007e1f

18 files changed

+380
-152
lines changed

.cspell.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"words": [
33
"aarch",
4+
"algo",
45
"arity",
56
"bincode",
67
"builddir",
@@ -20,6 +21,7 @@
2021
"itertools",
2122
"malloc",
2223
"mtriple",
24+
"petgraph",
2325
"realloc",
2426
"renamer",
2527
"repr",
@@ -28,6 +30,7 @@
2830
"tailcallopt",
2931
"tempfile",
3032
"termcolor",
33+
"toposort",
3134
"wasi"
3235
]
3336
}

Cargo.lock

Lines changed: 1 addition & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ members = [
88
"lib/lang",
99
"lib/mir",
1010
"lib/mir-fmm",
11-
"lib/os/ffi",
1211
"lib/prelude/ffi",
1312
]
14-
exclude = ["lib/os/.pen", "lib/core/.pen", "tmp"]
13+
exclude = ["lib/os", "lib/core/.pen", "tmp"]

lib/app/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ lang = { path = "../lang" }
1212
mir = { path = "../mir" }
1313
mir-fmm = { path = "../mir-fmm" }
1414
once_cell = "1"
15+
petgraph = "0.6"
1516
regex = "1"
1617
serde = { version = "1", features = ["derive", "rc"] }
1718
url = "2"

lib/app/src/common/file_path_resolver.rs

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ use crate::{
77
},
88
};
99

10+
const MAIN_ARCHIVE_BASENAME: &str = "main";
11+
const FFI_ARCHIVE_SUFFIX: &str = "_ffi";
12+
1013
pub fn resolve_object_directory(output_directory: &FilePath) -> FilePath {
1114
output_directory.join(&FilePath::new([OBJECT_DIRECTORY]))
1215
}
@@ -47,11 +50,38 @@ pub fn resolve_package_directory(output_directory: &FilePath, url: &url::Url) ->
4750
]))
4851
}
4952

53+
pub fn resolve_main_package_archive_file(
54+
output_directory: &FilePath,
55+
file_path_configuration: &FilePathConfiguration,
56+
) -> FilePath {
57+
resolve_package_archive_file(
58+
output_directory,
59+
MAIN_ARCHIVE_BASENAME,
60+
file_path_configuration,
61+
)
62+
}
63+
5064
pub fn resolve_main_package_ffi_archive_file(
5165
output_directory: &FilePath,
5266
file_path_configuration: &FilePathConfiguration,
5367
) -> FilePath {
54-
resolve_package_ffi_archive_file(output_directory, "main", file_path_configuration)
68+
resolve_package_ffi_archive_file(
69+
output_directory,
70+
MAIN_ARCHIVE_BASENAME,
71+
file_path_configuration,
72+
)
73+
}
74+
75+
pub fn resolve_external_package_archive_file(
76+
output_directory: &FilePath,
77+
url: &url::Url,
78+
file_path_configuration: &FilePathConfiguration,
79+
) -> FilePath {
80+
resolve_package_archive_file(
81+
output_directory,
82+
&package_id_calculator::calculate(url),
83+
file_path_configuration,
84+
)
5585
}
5686

5787
pub fn resolve_external_package_ffi_archive_file(
@@ -68,10 +98,22 @@ pub fn resolve_external_package_ffi_archive_file(
6898

6999
fn resolve_package_ffi_archive_file(
70100
output_directory: &FilePath,
71-
package_id: &str,
101+
basename: &str,
102+
file_path_configuration: &FilePathConfiguration,
103+
) -> FilePath {
104+
resolve_package_archive_file(
105+
output_directory,
106+
&(basename.to_owned() + FFI_ARCHIVE_SUFFIX),
107+
file_path_configuration,
108+
)
109+
}
110+
111+
fn resolve_package_archive_file(
112+
output_directory: &FilePath,
113+
basename: &str,
72114
file_path_configuration: &FilePathConfiguration,
73115
) -> FilePath {
74116
resolve_archive_directory(output_directory)
75-
.join(&FilePath::new([package_id]))
117+
.join(&FilePath::new([format!("lib{}", basename)]))
76118
.with_extension(file_path_configuration.archive_file_extension)
77119
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
use crate::{
2+
external_package_configuration_reader,
3+
infra::{FilePath, Infrastructure, PackageConfiguration},
4+
};
5+
use petgraph::{algo::toposort, Graph};
6+
use std::{collections::HashMap, error::Error};
7+
8+
pub fn sort(
9+
infrastructure: &Infrastructure,
10+
package_directory: &FilePath,
11+
output_directory: &FilePath,
12+
) -> Result<Vec<url::Url>, Box<dyn Error>> {
13+
sort_external_packages(&external_package_configuration_reader::read_recursively(
14+
infrastructure,
15+
package_directory,
16+
output_directory,
17+
)?)
18+
}
19+
20+
fn sort_external_packages(
21+
package_configurations: &HashMap<url::Url, PackageConfiguration>,
22+
) -> Result<Vec<url::Url>, Box<dyn std::error::Error>> {
23+
let mut graph = Graph::<url::Url, ()>::new();
24+
let mut indices = HashMap::<url::Url, _>::new();
25+
26+
for external_package in package_configurations.keys() {
27+
indices.insert(
28+
external_package.clone(),
29+
graph.add_node(external_package.clone()),
30+
);
31+
}
32+
33+
for (url, package_configuration) in package_configurations {
34+
for dependency_url in package_configuration.dependencies.values() {
35+
graph.add_edge(indices[dependency_url], indices[url], ());
36+
}
37+
}
38+
39+
Ok(toposort(&graph, None)
40+
.unwrap()
41+
.into_iter()
42+
.map(|index| graph[index].clone())
43+
.collect())
44+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use crate::{
2+
common::file_path_resolver,
3+
infra::{FilePath, Infrastructure, PackageConfiguration},
4+
};
5+
use std::{collections::HashMap, error::Error};
6+
7+
pub fn read_recursively(
8+
infrastructure: &Infrastructure,
9+
package_directory: &FilePath,
10+
output_directory: &FilePath,
11+
) -> Result<HashMap<url::Url, PackageConfiguration>, Box<dyn Error>> {
12+
read_dependencies(
13+
infrastructure,
14+
&infrastructure
15+
.package_configuration_reader
16+
.read(package_directory)?,
17+
output_directory,
18+
)
19+
}
20+
21+
fn read_dependencies(
22+
infrastructure: &Infrastructure,
23+
configuration: &PackageConfiguration,
24+
output_directory: &FilePath,
25+
) -> Result<HashMap<url::Url, PackageConfiguration>, Box<dyn Error>> {
26+
Ok(configuration
27+
.dependencies
28+
.values()
29+
.map(|url| -> Result<_, Box<dyn Error>> {
30+
let configuration = infrastructure.package_configuration_reader.read(
31+
&file_path_resolver::resolve_package_directory(output_directory, url),
32+
)?;
33+
34+
Ok(vec![(url.clone(), configuration.clone())]
35+
.into_iter()
36+
.chain(read_dependencies(
37+
infrastructure,
38+
&configuration,
39+
output_directory,
40+
)?)
41+
.collect::<Vec<_>>())
42+
})
43+
.collect::<Result<Vec<_>, _>>()?
44+
.into_iter()
45+
.flatten()
46+
.collect())
47+
}

lib/app/src/infra/application_linker.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ pub trait ApplicationLinker {
55
fn link(
66
&self,
77
system_package_directory: &FilePath,
8-
object_files: &[FilePath],
98
archive_files: &[FilePath],
109
application_file: &FilePath,
1110
target_triple: Option<&str>,

lib/app/src/infra/build_script_compiler.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ pub trait BuildScriptCompiler {
99
main_module_target: Option<&MainModuleTarget>,
1010
child_build_script_files: &[FilePath],
1111
prelude_interface_files: &[FilePath],
12+
archive_file: &FilePath,
1213
ffi_archive_file: &FilePath,
1314
package_directory: &FilePath,
1415
output_directory: &FilePath,
@@ -18,13 +19,15 @@ pub trait BuildScriptCompiler {
1819
fn compile_external(
1920
&self,
2021
module_targets: &[ModuleTarget],
22+
archive_file: &FilePath,
2123
ffi_archive_file: &FilePath,
2224
package_directory: &FilePath,
2325
) -> Result<String, Box<dyn Error>>;
2426

2527
fn compile_prelude(
2628
&self,
2729
module_targets: &[ModuleTarget],
30+
archive_file: &FilePath,
2831
ffi_archive_file: &FilePath,
2932
package_directory: &FilePath,
3033
) -> Result<String, Box<dyn Error>>;

lib/app/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
mod application_configuration;
22
mod common;
33
mod error;
4+
mod external_package_archive_sorter;
5+
mod external_package_configuration_reader;
46
pub mod infra;
57
pub mod module_compiler;
68
pub mod module_dependency_resolver;

lib/app/src/package_build_script_compiler/mod.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ pub fn compile_main(
8787
output_directory,
8888
prelude_package_url,
8989
)?,
90+
&file_path_resolver::resolve_main_package_archive_file(
91+
output_directory,
92+
&infrastructure.file_path_configuration,
93+
),
9094
&file_path_resolver::resolve_main_package_ffi_archive_file(
9195
output_directory,
9296
&infrastructure.file_path_configuration,
@@ -120,6 +124,11 @@ pub fn compile_external(
120124
&package_directory,
121125
output_directory,
122126
)?,
127+
&file_path_resolver::resolve_external_package_archive_file(
128+
output_directory,
129+
package_url,
130+
&infrastructure.file_path_configuration,
131+
),
123132
&file_path_resolver::resolve_external_package_ffi_archive_file(
124133
output_directory,
125134
package_url,
@@ -152,6 +161,11 @@ pub fn compile_prelude(
152161
&package_directory,
153162
output_directory,
154163
)?,
164+
&file_path_resolver::resolve_external_package_archive_file(
165+
output_directory,
166+
package_url,
167+
&infrastructure.file_path_configuration,
168+
),
155169
&file_path_resolver::resolve_external_package_ffi_archive_file(
156170
output_directory,
157171
package_url,

0 commit comments

Comments
 (0)