Skip to content

Commit a7bc012

Browse files
committed
Call "cmake" via "emcmake"/"emmake" for Emscripten
Emscripten toolchain has "emcmake" helper which sets the proper CMAKE_TOOLCHAIN_FILE and other CMake variables that get CMake to produce build files for cross-compiling via Emscripten. There is also "emmake" helper that sets the environment variables for cross-compilation. It should not be necessary for CMake when used with Makefiles and Ninja, but Emscripten recommends it anyway.
1 parent c7c8c9c commit a7bc012

File tree

1 file changed

+28
-6
lines changed

1 file changed

+28
-6
lines changed

src/lib.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ impl Config {
512512
let cmake_prefix_path = env::join_paths(&cmake_prefix_path).unwrap();
513513

514514
// Build up the first cmake command to build the build system.
515-
let mut cmd = self.cmake_configure_command();
515+
let mut cmd = self.cmake_configure_command(&target);
516516

517517
if self.verbose_cmake {
518518
cmd.arg("-Wdev");
@@ -784,7 +784,7 @@ impl Config {
784784
}
785785

786786
// And build!
787-
let mut cmd = self.cmake_build_command();
787+
let mut cmd = self.cmake_build_command(&target);
788788
cmd.current_dir(&build);
789789

790790
for &(ref k, ref v) in c_compiler.env().iter().chain(&self.env) {
@@ -841,12 +841,34 @@ impl Config {
841841
.unwrap_or(OsString::from("cmake"))
842842
}
843843

844-
fn cmake_configure_command(&mut self) -> Command {
845-
Command::new(self.cmake_executable())
844+
// If we are building for Emscripten, wrap the calls to CMake
845+
// as "emcmake cmake ..." and "emmake cmake --build ...".
846+
// https://emscripten.org/docs/compiling/Building-Projects.html
847+
848+
fn cmake_configure_command(&mut self, target: &str) -> Command {
849+
if target.contains("emscripten") {
850+
let emcmake = self
851+
.getenv_target_os("EMCMAKE")
852+
.unwrap_or(OsString::from("emcmake"));
853+
let mut cmd = Command::new(emcmake);
854+
cmd.arg(self.cmake_executable());
855+
cmd
856+
} else {
857+
Command::new(self.cmake_executable())
858+
}
846859
}
847860

848-
fn cmake_build_command(&mut self) -> Command {
849-
Command::new(self.cmake_executable())
861+
fn cmake_build_command(&mut self, target: &str) -> Command {
862+
if target.contains("emscripten") {
863+
let emmake = self
864+
.getenv_target_os("EMMAKE")
865+
.unwrap_or(OsString::from("emmake"));
866+
let mut cmd = Command::new(emmake);
867+
cmd.arg(self.cmake_executable());
868+
cmd
869+
} else {
870+
Command::new(self.cmake_executable())
871+
}
850872
}
851873

852874
fn getenv_os(&mut self, v: &str) -> Option<OsString> {

0 commit comments

Comments
 (0)