diff --git a/recipes/emsdk/all/conandata.yml b/recipes/emsdk/all/conandata.yml index 454e2ddd01a6d..b6bf4a9b30489 100644 --- a/recipes/emsdk/all/conandata.yml +++ b/recipes/emsdk/all/conandata.yml @@ -1,91 +1,13 @@ sources: + "4.0.10": + url: "https://github.com/emscripten-core/emsdk/archive/4.0.10.tar.gz" + sha256: "2497b55ddbba9bf9be2d18cfca3e973d40a0cfaa8d18f6caacb882a65b2faf1c" + "4.0.6": + url: "https://github.com/emscripten-core/emsdk/archive/4.0.6.tar.gz" + sha256: "2d3292d508b4f5477f490b080b38a34aaefed43e85258a1de72cb8dde3f8f3af" "3.1.73": url: "https://github.com/emscripten-core/emsdk/archive/3.1.73.tar.gz" sha256: "01e5e57a1f4ad74bff88134f00f4827aeb3b72b3bf91de9c8ad8bfa12ab9479a" - "3.1.72": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.72.tar.gz" - sha256: "62886722da99173789f1efc31b754c83c8ea09575035ce7fdfe5a7389bb3cec3" "3.1.50": url: "https://github.com/emscripten-core/emsdk/archive/3.1.50.tar.gz" sha256: "7491a881eb5ee15fe81bbabcfff1fd571e45ccdb24a81890af429f9970cbd1f3" - "3.1.49": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.49.tar.gz" - sha256: "c99d98da9241c7e72784bc764a3e60a65d8f27202d45f3cd422b2ac7245380d9" - "3.1.48": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.48.tar.gz" - sha256: "94b965ba8f2ff0949ff67c6943bf5638a1b8850e4491a25413cdaff5b18da42b" - "3.1.47": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.47.tar.gz" - sha256: "a882560a83cbacec67867e7ce6b00420d557e71c501b523d2ed956ded021f9b4" - "3.1.46": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.46.tar.gz" - sha256: "5dd94e557b720800a60387ec078bf3b3a527cbd916ad74a696fe399f1544474f" - "3.1.45": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.45.tar.gz" - sha256: "8b5b3433eb732dcc7643a2707a12fd5cbe793a5dadbbae9a60c24a737a78fe33" - "3.1.44": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.44.tar.gz" - sha256: "cb8cded78f6953283429d724556e89211e51ac4d871fcf38e0b32405ee248e91" - "3.1.38": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.38.tar.gz" - sha256: "45ffb273503e48aae28c04549026b9cbdd750a5d36e3da3e22bc9977d2bfd61f" - "3.1.31": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.31.tar.gz" - sha256: "1d38b7375e12e85197165a4c51d76d90e1d9db8c2c593b64cfaec4338af54750" - "3.1.30": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.30.tar.gz" - sha256: "7b9c4e0b19f08df9f0d807112926f3908fe73a2960b752a87c3862956da8b9a8" - "3.1.29": - url: "https://github.com/emscripten-core/emsdk/archive/refs/tags/3.1.29.tar.gz" - sha256: "506376d0d2a71fc3dd1a4dba6fb4cf18f0a2fa4e1936aa04ba4b59f2d435bf3f" - "3.1.23": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.23.tar.gz" - sha256: "a2609fd97580e4e332acbf49b6cc363714982f06cb6970d54c9789df8e91381c" - "3.1.20": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.20.tar.gz" - sha256: "fd336c6d3e51c7205a8ec68e835c442dcbb187f92e50c42b3d7d54a312072ef7" - "3.1.18": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.18.tar.gz" - sha256: "6479c60710bfb1d146a8bdd8619b693699e73185c850a6eb79ef2bd7e2a8e411" - "3.1.17": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.17.tar.gz" - sha256: "f52359d3f265162dc875ac4c9d4570abc9d012e30bef8d380cb74f0e427800a3" - "3.1.16": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.16.tar.gz" - sha256: "0a7a822e09bb22d081a49bf4229377689aef473376f36b5fe62db040d7e1c065" - "3.1.15": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.15.tar.gz" - sha256: "74c7c54b3544555ec38d1e9dcc7e90b9f49ed0e04f2cc3fd44663c598af24124" - "3.1.12": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.12.tar.gz" - sha256: "1b8d8fdebf9f155131ba74f91d2c0dd572b2ba5d1d4a22fb123d20d3ca258e30" - "3.1.7": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.7.tar.gz" - sha256: "bcceced0b7cad2e08375adf74ef20fa431230abbae8766bdad268c43e34f8d03" - "3.1.5": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.5.tar.gz" - sha256: "ae540d681aa04f32b92afbda1c9ef737aa03c81222c1ce3fd567de5af7d36625" - "3.1.4": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.4.tar.gz" - sha256: "7dc13d967705582e11ff62ae143425dbc63c38372f1a1b14f0cb681fda413714" - "3.1.3": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.3.tar.gz" - sha256: "c03767ad4b6d24f143c0a4922735c80ec17d745191ebf54b8f97dbe5d81eb52f" - "3.1.0": - url: "https://github.com/emscripten-core/emsdk/archive/3.1.0.tar.gz" - sha256: "a2c5f3cf36525cf6a4b569f9d25500e3b2f7341c6e6779b54bcf4703b834202d" - "3.0.1": - url: "https://github.com/emscripten-core/emsdk/archive/3.0.1.tar.gz" - sha256: "3a51e17d45878a5c6d1b6c20f35d308b95d58d56dbfbee4ec058e2ee216b2c90" - "3.0.0": - url: "https://github.com/emscripten-core/emsdk/archive/3.0.0.tar.gz" - sha256: "a41dccfd15be9e85f923efaa0ac21943cbab77ec8d39e52f25eca1ec61a9ac9e" - "2.0.34": - url: "https://github.com/emscripten-core/emsdk/archive/2.0.34.tar.gz" - sha256: "a96ddf34de8de779c78be2785df04ae63c9a557da9e83e85332cda3d01bca250" - "2.0.31": - url: "https://github.com/emscripten-core/emsdk/archive/2.0.31.tar.gz" - sha256: "6bf70f4522308de1941200f8cdb9bde6967ba7aacb03445e9d136a5dd812b728" - "2.0.30": - url: https://github.com/emscripten-core/emsdk/archive/refs/tags/2.0.30.tar.gz - sha256: 69050d76c8907a58f99b08831e8cb7a4fba857efec6037d5e59df4b73111ba36 diff --git a/recipes/emsdk/all/conanfile.py b/recipes/emsdk/all/conanfile.py index b8fc485ded548..bc2eb6ae0ef38 100644 --- a/recipes/emsdk/all/conanfile.py +++ b/recipes/emsdk/all/conanfile.py @@ -1,13 +1,12 @@ -from conan import ConanFile, conan_version +from conan import ConanFile from conan.tools.build import cross_building -from conan.tools.env import Environment -from conan.tools.files import chdir, copy, get, replace_in_file +from conan.tools.env import Environment, VirtualBuildEnv +from conan.tools.files import chdir, copy, get from conan.tools.layout import basic_layout -from conan.tools.scm import Version -import json +from pathlib import Path import os -required_conan_version = ">=1.52.0" +required_conan_version = ">=2.1" class EmSDKConan(ConanFile): @@ -15,28 +14,16 @@ class EmSDKConan(ConanFile): description = "Emscripten SDK. Emscripten is an Open Source LLVM to JavaScript compiler" url = "https://github.com/conan-io/conan-center-index" homepage = "https://github.com/kripken/emscripten" - topics = ("emsdk", "emscripten", "sdk") + topics = ("emsdk", "emscripten", "sdk", "emcc", "em++", "nodejs") license = "MIT" - settings = "os", "arch", "compiler", "build_type" - - short_paths = True - - @property - def _settings_build(self): - return getattr(self, "settings_build", self.settings) + package_type = "application" + settings = "os", "arch" + upload_policy = "skip" + build_policy = "missing" def layout(self): basic_layout(self, src_folder="src") - def requirements(self): - self.requires("nodejs/16.3.0") - # self.requires("python") # FIXME: Not available as Conan package - # self.requires("wasm") # FIXME: Not available as Conan package - - def package_id(self): - del self.info.settings.compiler - del self.info.settings.build_type - def source(self): get(self, **self.conan_data["sources"][self.version], destination=self.source_folder, strip_root=True) @@ -65,6 +52,13 @@ def _em_config(self): def _em_cache(self): return os.path.join(self.package_folder, "bin", ".emscripten_cache") + @property + def _node_path(self): + subfolders = [path for path in (Path(self.package_folder) / "bin" / "node").iterdir() if path.is_dir()] + if len(subfolders) != 1: + return None + return os.path.join("bin", "node", subfolders[0].name, "bin") + def generate(self): env = Environment() env.prepend_path("PATH", self._paths) @@ -74,70 +68,35 @@ def generate(self): env.define_path("EM_CACHE", self._em_cache) env.vars(self, scope="emsdk").save_script("emsdk_env_file") - @staticmethod - def _chmod_plus_x(filename): - if os.name == "posix": - os.chmod(filename, os.stat(filename).st_mode | 0o111) - - def _tools_for_version(self): - ret = {} - # Select release-upstream from version (wasm-binaries) - with open(os.path.join(self.source_folder, "emscripten-releases-tags.json"), "r") as f: - data = json.load(f) - ret["wasm"] = f"releases-upstream-{data['releases'][self.version]}-64bit" - # Select python and node versions - with open(os.path.join(self.source_folder, "emsdk_manifest.json"), "r") as f: - data = json.load(f) - tools = data["tools"] - if self.settings.os == "Windows": - python = next((it for it in tools if (it["id"] == "python" and not it.get("is_old", False))), None) - ret["python"] = f"python-{python['version']}-64bit" - node = next((it for it in tools if (it["id"] == "node" and not it.get("is_old", False))), None) - ret["nodejs"] = f"node-{node['version']}-64bit" - return ret + # To avoid issues when cross-compiling or with not common arch in profiles we need to set EMSDK_ARCH + # This is important for the emsdk install command + env = VirtualBuildEnv(self) + # Special consideration for armv8 as emsdk expects "arm64" + arch = "arm64" if str(self.settings.arch) == "armv8" else str(self.settings.arch) + env.environment().define("EMSDK_ARCH", arch) + env.generate() def build(self): with chdir(self, self.source_folder): - emsdk = "emsdk.bat" if self._settings_build.os == "Windows" else "./emsdk" - self._chmod_plus_x("emsdk") - - # Install required tools - required_tools = self._tools_for_version() - for key, value in required_tools.items(): - if key != 'nodejs': - self.run(f"{emsdk} install {value}") - self.run(f"{emsdk} activate {value}") + emsdk = "emsdk.bat" if self.settings_build.os == "Windows" else "./emsdk" + self.run(f"{emsdk} install latest") + self.run(f"{emsdk} activate latest") def package(self): copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses")) copy(self, "*", src=self.source_folder, dst=os.path.join(self.package_folder, "bin")) - emscripten = os.path.join(self.package_folder, "bin", "upstream", "emscripten") - toolchain = os.path.join(emscripten, "cmake", "Modules", "Platform", "Emscripten.cmake") - # FIXME: conan should add the root of conan package requirements to CMAKE_PREFIX_PATH (LIBRARY/INCLUDE -> ONLY; PROGRAM -> NEVER) - # allow to find conan libraries - replace_in_file(self, toolchain, - "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)", - "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)") - replace_in_file(self, toolchain, - "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)", - "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)") - replace_in_file(self, toolchain, - "set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)", - "set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)") if not cross_building(self): self.run("embuilder build MINIMAL", env=["conanemsdk", "conanrun"]) # force cache population - # the line below forces emscripten to accept the cache as-is, even after re-location - # https://github.com/emscripten-core/emscripten/issues/15053#issuecomment-920950710 + # Avoid cache failures in case this package is uploaded as paths in sanity.txt are absolute os.remove(os.path.join(self._em_cache, "sanity.txt")) def _define_tool_var(self, value): suffix = ".bat" if self.settings.os == "Windows" else "" path = os.path.join(self._emscripten, f"{value}{suffix}") - self._chmod_plus_x(path) return path def package_info(self): - self.cpp_info.bindirs = self._relative_paths + self.cpp_info.bindirs = self._relative_paths + [self._node_path] self.cpp_info.includedirs = [] self.cpp_info.libdirs = [] self.cpp_info.resdirs = [] @@ -180,17 +139,3 @@ def package_info(self): os.path.join("bin", "upstream", "emscripten", "tests", "cmake", "target_library"), os.path.join("bin", "upstream", "lib", "cmake", "llvm"), ] - - if Version(conan_version).major < 2: - self.env_info.PATH.extend(self._paths) - self.env_info.CONAN_CMAKE_TOOLCHAIN_FILE = toolchain - self.env_info.EMSDK = self._emsdk - self.env_info.EMSCRIPTEN = self._emscripten - self.env_info.EM_CONFIG = self._em_config - self.env_info.EM_CACHE = self._em_cache - self.env_info.CC = compiler_executables["c"] - self.env_info.CXX = compiler_executables["cpp"] - self.env_info.AR = self._define_tool_var("emar") - self.env_info.NM = self._define_tool_var("emnm") - self.env_info.RANLIB = self._define_tool_var("emranlib") - self.env_info.STRIP = self._define_tool_var("emstrip") diff --git a/recipes/emsdk/all/test_package/CMakeLists.txt b/recipes/emsdk/all/test_package/CMakeLists.txt deleted file mode 100644 index f776bcb524ea6..0000000000000 --- a/recipes/emsdk/all/test_package/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -cmake_minimum_required(VERSION 3.1) -project(test_package LANGUAGES CXX) - -add_executable(${PROJECT_NAME} test_package.cpp) diff --git a/recipes/emsdk/all/test_package/conanfile.py b/recipes/emsdk/all/test_package/conanfile.py index 5bce241404bf4..a0948bea18d56 100644 --- a/recipes/emsdk/all/test_package/conanfile.py +++ b/recipes/emsdk/all/test_package/conanfile.py @@ -1,40 +1,16 @@ from conan import ConanFile -from conan.tools.env import Environment -from conan.tools.cmake import CMake, cmake_layout -import os +from conan.tools.build import can_run class TestPackageConan(ConanFile): settings = "os", "arch", "compiler", "build_type" - generators = "CMakeToolchain", "VirtualBuildEnv" - test_type = "explicit" - def build_requirements(self): - self.tool_requires(self.tested_reference_str) - - def layout(self): - cmake_layout(self) - - def generate(self): - if self.settings.os == "Emscripten": - env = Environment() - env.define_path("EM_CACHE", os.path.join(self.build_folder, ".emcache")) - envvars = env.vars(self, scope="build") - envvars.save_script("em_cache") - - def build(self): - # It only makes sense to build a library, if the target os is Emscripten - if self.settings.os == "Emscripten": - cmake = CMake(self) - cmake.configure() - cmake.build() + def requirements(self): + self.requires(self.tested_reference_str) def test(self): # Check the package provides working binaries - self.run("emcc -v") - self.run("em++ -v") - - # Run the project that was built using emsdk - if self.settings.os == "Emscripten": - test_file = os.path.join(self.cpp.build.bindirs[0], "test_package.js") - self.run(f"node {test_file}") + if can_run(self): + self.run("emcc -v", env="conanrun") + self.run("em++ -v", env="conanrun") + self.run("node -v", env="conanrun") diff --git a/recipes/emsdk/all/test_package/test_package.cpp b/recipes/emsdk/all/test_package/test_package.cpp deleted file mode 100644 index dc0f143f2972b..0000000000000 --- a/recipes/emsdk/all/test_package/test_package.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include - -int main() -{ - std::cout << "conan-center-index\n"; - return EXIT_SUCCESS; -} diff --git a/recipes/emsdk/all/test_v1_package/CMakeLists.txt b/recipes/emsdk/all/test_v1_package/CMakeLists.txt deleted file mode 100644 index f7c5ddc942cf1..0000000000000 --- a/recipes/emsdk/all/test_v1_package/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -cmake_minimum_required(VERSION 3.1) -project(test_package LANGUAGES CXX) - -include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) -conan_basic_setup(TARGETS) - -add_executable(${PROJECT_NAME} ../test_package/test_package.cpp) diff --git a/recipes/emsdk/all/test_v1_package/conanfile.py b/recipes/emsdk/all/test_v1_package/conanfile.py deleted file mode 100644 index 434f5772df524..0000000000000 --- a/recipes/emsdk/all/test_v1_package/conanfile.py +++ /dev/null @@ -1,30 +0,0 @@ -from conans import ConanFile, CMake, tools -import os - - -class TestPackageConan(ConanFile): - settings = "os", "arch", "compiler", "build_type" - test_type = "explicit" - generators = "cmake" - - def build_requirements(self): - self.build_requires(self.tested_reference_str) - - def build(self): - # It only makes sense to build a library, if the target os is Emscripten - if self.settings.os == "Emscripten": - with tools.environment_append({"EM_CACHE": os.path.join(self.build_folder, ".emcache")}): - cmake = CMake(self) - cmake.configure() - cmake.build() - - def test(self): - # Check the package provides working binaries - if not tools.cross_building(self): - self.run("emcc -v", run_environment=True) - self.run("em++ -v", run_environment=True) - - # Run the project that was built using emsdk - if self.settings.os == "Emscripten": - test_file = os.path.join("bin", "test_package.js") - self.run(f"node {test_file}", run_environment=True) diff --git a/recipes/emsdk/config.yml b/recipes/emsdk/config.yml index cc38cd3c728ca..9d3927bc2c183 100644 --- a/recipes/emsdk/config.yml +++ b/recipes/emsdk/config.yml @@ -1,61 +1,9 @@ versions: - "3.1.73": - folder: all - "3.1.72": - folder: all - "3.1.50": - folder: all - "3.1.49": - folder: all - "3.1.48": - folder: all - "3.1.47": - folder: all - "3.1.46": - folder: all - "3.1.45": - folder: all - "3.1.44": - folder: all - "3.1.38": - folder: all - "3.1.31": - folder: all - "3.1.30": - folder: all - "3.1.29": - folder: all - "3.1.23": + "4.0.10": folder: all - "3.1.20": + "4.0.6": folder: all - "3.1.18": - folder: all - "3.1.17": - folder: all - "3.1.16": - folder: all - "3.1.15": - folder: all - "3.1.12": - folder: all - "3.1.7": - folder: all - "3.1.5": - folder: all - "3.1.4": - folder: all - "3.1.3": - folder: all - "3.1.0": - folder: all - "3.0.1": - folder: all - "3.0.0": - folder: all - "2.0.34": + "3.1.73": folder: all - "2.0.31": + "3.1.50": folder: all - "2.0.30": - folder: all \ No newline at end of file