Skip to content

Commit

Permalink
Merge pull request #262 from moonbitlang/conditional-compilation
Browse files Browse the repository at this point in the history
feat: support conditional compilation
  • Loading branch information
lijunchen authored Sep 9, 2024
2 parents 053e71e + 7548af6 commit 061fd52
Show file tree
Hide file tree
Showing 37 changed files with 496 additions and 17 deletions.
2 changes: 1 addition & 1 deletion crates/moon/src/cli/generate_test_driver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ pub fn generate_test_driver(
};

let backend_filtered: Vec<PathBuf> =
moonutil::common::backend_filter(files, moonc_opt.link_opt.target_backend);
moonutil::common::backend_filter(files, pkg.targets.as_ref(), &moonc_opt);
let mbts_test_data =
moonc_gen_test_info(&backend_filtered, &target_dir.join(pkg.rel.fs_full_name()))?;

Expand Down
1 change: 1 addition & 0 deletions crates/moon/tests/cmd_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ fn cmd_test() {
all_results.sort();
expect_test::expect![[r#"
[
${WORK_DIR}/cond_comp.in/moon.test, ok,
${WORK_DIR}/moon_build_package.in/moon.test, ok,
${WORK_DIR}/moon_info_001.in/moon.test, ok,
${WORK_DIR}/moon_info_002.in/moon.test, ok,
Expand Down
2 changes: 2 additions & 0 deletions crates/moon/tests/test_cases/cond_comp.in/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
target/
.mooncakes/
1 change: 1 addition & 0 deletions crates/moon/tests/test_cases/cond_comp.in/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# username/hello
10 changes: 10 additions & 0 deletions crates/moon/tests/test_cases/cond_comp.in/moon.mod.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "username/hello",
"version": "0.1.0",
"readme": "README.md",
"repository": "",
"license": "",
"keywords": [],
"description": "",
"source": "src"
}
54 changes: 54 additions & 0 deletions crates/moon/tests/test_cases/cond_comp.in/moon.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
$ moon build --dry-run --sort-input --nostd
moonc build-package ./src/lib/all.mbt ./src/lib/not_js.mbt -o ./target/wasm-gc/release/build/lib/lib.core -pkg username/hello/lib -pkg-sources username/hello/lib:./src/lib -target wasm-gc
moonc build-package ./src/main/main.mbt -o ./target/wasm-gc/release/build/main/main.core -pkg username/hello/main -is-main -i ./target/wasm-gc/release/build/lib/lib.mi:lib -pkg-sources username/hello/main:./src/main -target wasm-gc
moonc link-core ./target/wasm-gc/release/build/lib/lib.core ./target/wasm-gc/release/build/main/main.core -main username/hello/main -o ./target/wasm-gc/release/build/main/main.wasm -pkg-sources username/hello/lib:./src/lib -pkg-sources username/hello/main:./src/main -target wasm-gc

$ moon build --target wasm --dry-run --sort-input --nostd
moonc build-package ./src/lib/all.mbt ./src/lib/not_js.mbt -o ./target/wasm/release/build/lib/lib.core -pkg username/hello/lib -pkg-sources username/hello/lib:./src/lib -target wasm
moonc build-package ./src/main/main.mbt -o ./target/wasm/release/build/main/main.core -pkg username/hello/main -is-main -i ./target/wasm/release/build/lib/lib.mi:lib -pkg-sources username/hello/main:./src/main -target wasm
moonc link-core ./target/wasm/release/build/lib/lib.core ./target/wasm/release/build/main/main.core -main username/hello/main -o ./target/wasm/release/build/main/main.wasm -pkg-sources username/hello/lib:./src/lib -pkg-sources username/hello/main:./src/main -target wasm

$ moon build --target wasm-gc --dry-run --sort-input --nostd
moonc build-package ./src/lib/all.mbt ./src/lib/not_js.mbt -o ./target/wasm-gc/release/build/lib/lib.core -pkg username/hello/lib -pkg-sources username/hello/lib:./src/lib -target wasm-gc
moonc build-package ./src/main/main.mbt -o ./target/wasm-gc/release/build/main/main.core -pkg username/hello/main -is-main -i ./target/wasm-gc/release/build/lib/lib.mi:lib -pkg-sources username/hello/main:./src/main -target wasm-gc
moonc link-core ./target/wasm-gc/release/build/lib/lib.core ./target/wasm-gc/release/build/main/main.core -main username/hello/main -o ./target/wasm-gc/release/build/main/main.wasm -pkg-sources username/hello/lib:./src/lib -pkg-sources username/hello/main:./src/main -target wasm-gc

$ moon build --dry-run --target js --sort-input --nostd
moonc build-package ./src/lib/all.mbt ./src/lib/js_and_release.mbt ./src/lib/only_js.mbt -o ./target/js/release/build/lib/lib.core -pkg username/hello/lib -pkg-sources username/hello/lib:./src/lib -target js
moonc build-package ./src/main/main.mbt -o ./target/js/release/build/main/main.core -pkg username/hello/main -is-main -i ./target/js/release/build/lib/lib.mi:lib -pkg-sources username/hello/main:./src/main -target js
moonc link-core ./target/js/release/build/lib/lib.core ./target/js/release/build/main/main.core -main username/hello/main -o ./target/js/release/build/main/main.js -pkg-sources username/hello/lib:./src/lib -pkg-sources username/hello/main:./src/main -target js

$ moon build --dry-run --target wasm --sort-input --nostd --debug
moonc build-package ./src/lib/all.mbt ./src/lib/not_js.mbt ./src/lib/only_debug.mbt -o ./target/wasm/debug/build/lib/lib.core -pkg username/hello/lib -pkg-sources username/hello/lib:./src/lib -target wasm -g
moonc build-package ./src/main/main.mbt -o ./target/wasm/debug/build/main/main.core -pkg username/hello/main -is-main -i ./target/wasm/debug/build/lib/lib.mi:lib -pkg-sources username/hello/main:./src/main -target wasm -g
moonc link-core ./target/wasm/debug/build/lib/lib.core ./target/wasm/debug/build/main/main.core -main username/hello/main -o ./target/wasm/debug/build/main/main.wasm -pkg-sources username/hello/lib:./src/lib -pkg-sources username/hello/main:./src/main -target wasm -g

$ moon build --dry-run --target wasm-gc --sort-input --nostd --debug
moonc build-package ./src/lib/all.mbt ./src/lib/not_js.mbt ./src/lib/only_debug.mbt -o ./target/wasm-gc/debug/build/lib/lib.core -pkg username/hello/lib -pkg-sources username/hello/lib:./src/lib -target wasm-gc -g -source-map
moonc build-package ./src/main/main.mbt -o ./target/wasm-gc/debug/build/main/main.core -pkg username/hello/main -is-main -i ./target/wasm-gc/debug/build/lib/lib.mi:lib -pkg-sources username/hello/main:./src/main -target wasm-gc -g -source-map
moonc link-core ./target/wasm-gc/debug/build/lib/lib.core ./target/wasm-gc/debug/build/main/main.core -main username/hello/main -o ./target/wasm-gc/debug/build/main/main.wasm -pkg-sources username/hello/lib:./src/lib -pkg-sources username/hello/main:./src/main -target wasm-gc -g -source-map

$ moon build --dry-run --target js --sort-input --nostd --debug
moonc build-package ./src/lib/all.mbt ./src/lib/only_debug.mbt ./src/lib/only_js.mbt -o ./target/js/debug/build/lib/lib.core -pkg username/hello/lib -pkg-sources username/hello/lib:./src/lib -target js -g -source-map
moonc build-package ./src/main/main.mbt -o ./target/js/debug/build/main/main.core -pkg username/hello/main -is-main -i ./target/js/debug/build/lib/lib.mi:lib -pkg-sources username/hello/main:./src/main -target js -g -source-map
moonc link-core ./target/js/debug/build/lib/lib.core ./target/js/debug/build/main/main.core -main username/hello/main -o ./target/js/debug/build/main/main.js -pkg-sources username/hello/lib:./src/lib -pkg-sources username/hello/main:./src/main -target js -g -source-map

$ moon check --dry-run --target js --sort-input --nostd
moonc check ./src/lib/all.mbt ./src/lib/js_and_release.mbt ./src/lib/only_js.mbt -o ./target/js/release/check/lib/lib.mi -pkg username/hello/lib -pkg-sources username/hello/lib:./src/lib -target js
moonc check ./src/main/main.mbt -o ./target/js/release/check/main/main.mi -pkg username/hello/main -is-main -i ./target/js/release/check/lib/lib.mi:lib -pkg-sources username/hello/main:./src/main -target js
moonc check ./src/lib/hello_test.mbt ./src/lib/js_only_test.mbt -o ./target/js/release/check/lib/lib.blackbox_test.mi -pkg username/hello/lib_blackbox_test -i ./target/js/release/check/lib/lib.mi:lib -pkg-sources username/hello/lib_blackbox_test:./src/lib -target js

$ moon test --dry-run --target js --sort-input --nostd
moon generate-test-driver --source-dir . --target-dir ./target/js/debug/test --package username/hello/lib --sort-input --target js --driver-kind blackbox
moonc build-package ./src/lib/all.mbt ./src/lib/only_debug.mbt ./src/lib/only_js.mbt -o ./target/js/debug/test/lib/lib.core -pkg username/hello/lib -pkg-sources username/hello/lib:./src/lib -target js -g
moonc build-package ./src/lib/hello_test.mbt ./src/lib/js_only_test.mbt ./target/js/debug/test/lib/__generated_driver_for_blackbox_test.mbt -o ./target/js/debug/test/lib/lib.blackbox_test.core -pkg username/hello/lib_blackbox_test -is-main -i ./target/js/debug/test/lib/lib.mi:lib -pkg-sources username/hello/lib_blackbox_test:./src/lib -target js -g
moonc link-core ./target/js/debug/test/lib/lib.core ./target/js/debug/test/lib/lib.blackbox_test.core -main username/hello/lib_blackbox_test -o ./target/js/debug/test/lib/lib.blackbox_test.js -test-mode -pkg-sources username/hello/lib:./src/lib -pkg-sources username/hello/lib_blackbox_test:./src/lib -exported_functions execute -js-format cjs -target js -g
moon generate-test-driver --source-dir . --target-dir ./target/js/debug/test --package username/hello/lib --sort-input --target js --driver-kind internal
moonc build-package ./src/lib/all.mbt ./src/lib/only_debug.mbt ./src/lib/only_js.mbt ./target/js/debug/test/lib/__generated_driver_for_internal_test.mbt -o ./target/js/debug/test/lib/lib.internal_test.core -pkg username/hello/lib -is-main -pkg-sources username/hello/lib:./src/lib -target js -g
moonc link-core ./target/js/debug/test/lib/lib.internal_test.core -main username/hello/lib -o ./target/js/debug/test/lib/lib.internal_test.js -test-mode -pkg-sources username/hello/lib:./src/lib -exported_functions execute -js-format cjs -target js -g

$ moon bundle --dry-run --target js --sort-input --nostd
moonc build-package ./src/lib/all.mbt ./src/lib/js_and_release.mbt ./src/lib/only_js.mbt -o ./target/js/release/bundle/lib/lib.core -pkg username/hello/lib -pkg-sources username/hello/lib:./lib -target js
moonc build-package ./src/main/main.mbt -o ./target/js/release/bundle/main/main.core -pkg username/hello/main -is-main -i ./target/js/release/bundle/lib/lib.mi:lib -pkg-sources username/hello/main:./main -target js
moonc bundle-core ./target/js/release/bundle/lib/lib.core ./target/js/release/bundle/main/main.core -o ./target/js/release/bundle/hello.core

3 changes: 3 additions & 0 deletions crates/moon/tests/test_cases/cond_comp.in/src/lib/all.mbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pub fn hello() -> String {
"Hello, world!"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
test "hello" {
if @lib.hello() != "Hello, world!" {
fail!("@lib.hello() != \"Hello, world!\"")
}
}
Empty file.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"targets": {
"only_js.mbt": ["and", "js"],
"not_js.mbt": ["not", "js"],
"only_debug.mbt": ["and", "debug"],
"js_and_release.mbt": ["and", ["or", "js"], ["or", "release"]],
"js_only_test.mbt": ["and", "js"]
}
}
Empty file.
Empty file.
3 changes: 3 additions & 0 deletions crates/moon/tests/test_cases/cond_comp.in/src/lib/only_js.mbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pub fn hello2() -> String {
"Hello, world!"
}
3 changes: 3 additions & 0 deletions crates/moon/tests/test_cases/cond_comp.in/src/main/main.mbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
fn main {
println(@lib.hello())
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"is-main": true,
"import": [
"username/hello/lib"
]
}
2 changes: 2 additions & 0 deletions crates/moon/tests/test_cases/cond_comp_errors.in/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
target/
.mooncakes/
1 change: 1 addition & 0 deletions crates/moon/tests/test_cases/cond_comp_errors.in/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# username/hello
10 changes: 10 additions & 0 deletions crates/moon/tests/test_cases/cond_comp_errors.in/moon.mod.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "username/hello",
"version": "0.1.0",
"readme": "README.md",
"repository": "",
"license": "",
"keywords": [],
"description": "",
"source": "src"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pub fn hello() -> String {
"Hello, world!"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
test "hello" {
if @lib.hello() != "Hello, world!" {
fail!("@lib.hello() != \"Hello, world!\"")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"targets": {
"hello.mbt": ["x"]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
fn main {
println(@lib.hello())
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"is-main": true,
"import": [
"username/hello/lib"
]
}
2 changes: 2 additions & 0 deletions crates/moonbuild/src/bench.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ pub fn f() -> Unit {{
link: None,
warn_list: None,
alert_list: None,
targets: None,
};
moonutil::common::write_package_json_to_file(&pkg, &moon_pkg).unwrap();
}
Expand Down Expand Up @@ -188,6 +189,7 @@ pub fn write(config: &Config, base_dir: &Path) {
link: None,
warn_list: None,
alert_list: None,
targets: None,
};

moonutil::common::write_package_json_to_file(&pkg, &base_dir.join("main").join(MOON_PKG_JSON))
Expand Down
2 changes: 1 addition & 1 deletion crates/moonbuild/src/gen/gen_build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ pub fn gen_build_build_item(
let mi_out = pkg.artifact.with_extension("mi");

let backend_filtered =
moonutil::common::backend_filter(&pkg.files, moonc_opt.link_opt.target_backend);
moonutil::common::backend_filter(&pkg.files, pkg.targets.as_ref(), moonc_opt);

let mbt_deps = backend_filtered
.iter()
Expand Down
2 changes: 1 addition & 1 deletion crates/moonbuild/src/gen/gen_bundle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ pub fn pkg_to_bundle_item(
let mi_out = pkg.artifact.with_extension("mi");

let backend_filtered =
moonutil::common::backend_filter(&pkg.files, moonc_opt.link_opt.target_backend);
moonutil::common::backend_filter(&pkg.files, pkg.targets.as_ref(), moonc_opt);
let mbt_deps = backend_filtered
.iter()
.filter(|f| {
Expand Down
7 changes: 4 additions & 3 deletions crates/moonbuild/src/gen/gen_check.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ fn pkg_to_check_item(
let out = pkg.artifact.with_extension("mi");

let backend_filtered =
moonutil::common::backend_filter(&pkg.files, moonc_opt.link_opt.target_backend);
moonutil::common::backend_filter(&pkg.files, pkg.targets.as_ref(), moonc_opt);
let mbt_deps: Vec<String> = backend_filtered
.iter()
.map(|f| f.display().to_string())
Expand Down Expand Up @@ -113,7 +113,8 @@ fn pkg_with_wbtest_to_check_item(
.chain(pkg.wbtest_files.iter())
.cloned()
.collect::<Vec<_>>(),
moonc_opt.link_opt.target_backend,
pkg.targets.as_ref(),
moonc_opt,
);
let mbt_deps: Vec<String> = backend_filtered
.iter()
Expand Down Expand Up @@ -186,7 +187,7 @@ fn pkg_with_test_to_check_item(
.with_file_name(format!("{}.blackbox_test.mi", pkg.last_name()));

let backend_filtered =
moonutil::common::backend_filter(&pkg.test_files, moonc_opt.link_opt.target_backend);
moonutil::common::backend_filter(&pkg.test_files, pkg.targets.as_ref(), moonc_opt);
let mbt_deps: Vec<String> = backend_filtered
.iter()
.map(|f| f.display().to_string())
Expand Down
10 changes: 5 additions & 5 deletions crates/moonbuild/src/gen/gen_runtest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ pub fn gen_package_core(
let mi_out = pkg.artifact.with_extension("mi");

let backend_filtered: Vec<PathBuf> =
moonutil::common::backend_filter(&pkg.files, moonc_opt.link_opt.target_backend);
moonutil::common::backend_filter(&pkg.files, pkg.targets.as_ref(), moonc_opt);
let mbt_deps = backend_filtered
.iter()
.map(|f| f.display().to_string())
Expand Down Expand Up @@ -191,7 +191,7 @@ pub fn gen_package_internal_test(
.with_file_name(format!("{}.internal_test.mi", pkgname));

let backend_filtered =
moonutil::common::backend_filter(&pkg.files, moonc_opt.link_opt.target_backend);
moonutil::common::backend_filter(&pkg.files, pkg.targets.as_ref(), moonc_opt);
let mut mbt_deps: Vec<String> = backend_filtered
.iter()
.map(|f| f.display().to_string())
Expand Down Expand Up @@ -255,7 +255,7 @@ pub fn gen_package_whitebox_test(
.with_file_name(format!("{}.whitebox_test.mi", pkgname));

let backend_filtered =
moonutil::common::backend_filter(&pkg.files, moonc_opt.link_opt.target_backend);
moonutil::common::backend_filter(&pkg.files, pkg.targets.as_ref(), moonc_opt);
let mut mbt_deps: Vec<String> = backend_filtered
.iter()
.chain(pkg.wbtest_files.iter())
Expand Down Expand Up @@ -339,7 +339,7 @@ pub fn gen_package_blackbox_test(
.with_file_name(format!("{}.blackbox_test.mi", pkgname));

let backend_filtered =
moonutil::common::backend_filter(&pkg.test_files, moonc_opt.link_opt.target_backend);
moonutil::common::backend_filter(&pkg.test_files, pkg.targets.as_ref(), moonc_opt);
let mut mbt_deps: Vec<String> = backend_filtered
.iter()
.map(|f| f.display().to_string())
Expand Down Expand Up @@ -618,7 +618,7 @@ pub fn gen_link_blackbox_test(

pub fn contain_mbt_test_file(pkg: &Package, moonc_opt: &MooncOpt) -> bool {
let backend_filtered =
moonutil::common::backend_filter(&pkg.files, moonc_opt.link_opt.target_backend);
moonutil::common::backend_filter(&pkg.files, pkg.targets.as_ref(), moonc_opt);
backend_filtered.iter().any(|f| {
let filename = f.file_name().unwrap().to_str().unwrap().to_string();
filename.ends_with("_test.mbt")
Expand Down
2 changes: 2 additions & 0 deletions crates/moonbuild/src/new.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ pub fn moon_new_exec(
link: None,
warn_list: None,
alert_list: None,
targets: None,
};
moonutil::common::write_package_json_to_file(&j, &main_moon_pkg)?;
}
Expand Down Expand Up @@ -211,6 +212,7 @@ fn common(
link: None,
warn_list: None,
alert_list: None,
targets: None,
};
moonutil::common::write_package_json_to_file(&j, &lib_moon_pkg)?;
}
Expand Down
13 changes: 13 additions & 0 deletions crates/moonbuild/template/pkg.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,19 @@
"null"
]
},
"targets": {
"description": "Conditional compilation targets",
"type": [
"object",
"null"
],
"additionalProperties": {
"type": [
"string",
"null"
]
}
},
"test-import": {
"description": "Black box test imported packages of the package",
"anyOf": [
Expand Down
Loading

0 comments on commit 061fd52

Please sign in to comment.