diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ab96515..8998c98 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -76,15 +76,12 @@ jobs: run: | make TOIT_VERSION=${{ github.event.inputs.toit-version }} download-toit - - name: Build the host SDK - run: | - make build-host - - - name: Install ESP32 tools + - name: Patch Toit run: | - toit/third_party/esp-idf/install.sh + # Temporary patch until upstream is fixed. + (cd toit && patch -p1 < ../patches/toit.patch) - - name: Build tool + - name: Build the host SDK env: IDF_CCACHE_ENABLE: 1 CCACHE_DIR: ${{ github.workspace }}/.ccache @@ -92,6 +89,14 @@ jobs: CCACHE_COMPRESS: true CCACHE_COMPRESSLEVEL: '6' CCACHE_MAXSIZE: 800M + run: | + make build-host + + - name: Install ESP32 tools + run: | + toit/third_party/esp-idf/install.sh + + - name: Build tool run: | build/host/sdk/bin/toit.compile -o build/env-tool tools/main.toit diff --git a/patches/toit.patch b/patches/toit.patch new file mode 100644 index 0000000..e385fdc --- /dev/null +++ b/patches/toit.patch @@ -0,0 +1,260 @@ +diff --git a/Makefile b/Makefile +index 1d704aa4..20e3791a 100644 +--- a/Makefile ++++ b/Makefile +@@ -18,8 +18,9 @@ + SHELL=bash + + # General options. +-HOST=host +-BUILD_TYPE=Release ++BUILD ?= build ++HOST ?= host ++BUILD_TYPE ?= Release + TARGET ?= $(HOST) + TOOLCHAIN ?= $(TARGET) + +@@ -94,58 +95,58 @@ endif + # cmake needs to be rerun, but we don't detect that, so it might not + # get run enough. It takes <1s on Linux to run cmake, so it's + # usually best to run it eagerly. +-.PHONY: build/$(TARGET)/CMakeCache.txt +-build/$(TARGET)/CMakeCache.txt: ++.PHONY: $(BUILD)/$(TARGET)/CMakeCache.txt ++$(BUILD)/$(TARGET)/CMakeCache.txt: + $(MAKE) rebuild-cmake + + ifneq ($(TARGET),$(HOST)) + # Support for cross-compilation. + +-.PHONY: build/$(HOST)/CMakeCache.txt +-build/$(HOST)/CMakeCache.txt: ++.PHONY: $(BUILD)/$(HOST)/CMakeCache.txt ++$(BUILD)/$(HOST)/CMakeCache.txt: + $(MAKE) TARGET=$(HOST) rebuild-cmake + + .PHONY: sysroot + sysroot: check-env +- $(MAKE) build/$(TARGET)/sysroot/usr ++ $(MAKE) $(BUILD)/$(TARGET)/sysroot/usr + endif + +-BIN_DIR = $(CURDIR)/build/$(HOST)/sdk/bin ++BIN_DIR = $(abspath $(BUILD)/$(HOST)/sdk/bin) + TOITPKG_BIN = $(BIN_DIR)/toit.pkg$(EXE_SUFFIX) + TOITC_BIN = $(BIN_DIR)/toit.compile$(EXE_SUFFIX) + FIRMWARE_BIN = $(TOIT_TOOLS_DIR)/firmware$(EXE_SUFFIX) + + .PHONY: download-packages +-download-packages: check-env build/$(HOST)/CMakeCache.txt tools +- (cd build/$(HOST) && ninja download_packages) ++download-packages: check-env $(BUILD)/$(HOST)/CMakeCache.txt tools ++ (cd $(BUILD)/$(HOST) && ninja download_packages) + + .PHONY: rebuild-cmake + rebuild-cmake: +- mkdir -p build/$(TARGET) +- (cd build/$(TARGET) && cmake ../../ -G Ninja -DTOITC=$(TOITC_BIN) -DTOITPKG=$(TOITPKG_BIN) -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DCMAKE_TOOLCHAIN_FILE=../../toolchains/$(TOOLCHAIN).cmake --no-warn-unused-cli) ++ mkdir -p $(BUILD)/$(TARGET) ++ (cd $(BUILD)/$(TARGET) && cmake $(CURDIR) -G Ninja -DTOITC=$(TOITC_BIN) -DTOITPKG=$(TOITPKG_BIN) -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DCMAKE_TOOLCHAIN_FILE=$(CURDIR)/toolchains/$(TOOLCHAIN).cmake --no-warn-unused-cli) + + .PHONY: host-tools +-host-tools: check-env build/$(HOST)/CMakeCache.txt +- (cd build/$(HOST) && ninja build_tools) ++host-tools: check-env $(BUILD)/$(HOST)/CMakeCache.txt ++ (cd $(BUILD)/$(HOST) && ninja build_tools) + + .PHONY: tools + # This rule contains a reference to host-tools. + # This means that on host we will try to build host twice, but + # the second attempt will be a no-op. +-tools: host-tools check-env build/$(TARGET)/CMakeCache.txt +- (cd build/$(TARGET) && ninja build_tools) ++tools: host-tools check-env $(BUILD)/$(TARGET)/CMakeCache.txt ++ (cd $(BUILD)/$(TARGET) && ninja build_tools) + + .PHONY: toit-tools + toit-tools: tools download-packages +- (cd build/$(TARGET) && ninja build_toit_tools) ++ (cd $(BUILD)/$(TARGET) && ninja build_toit_tools) + + .PHONY: vessels +-vessels: check-env build/$(TARGET)/CMakeCache.txt +- (cd build/$(TARGET) && ninja build_vessels) ++vessels: check-env $(BUILD)/$(TARGET)/CMakeCache.txt ++ (cd $(BUILD)/$(TARGET) && ninja build_vessels) + + .PHONY: version-file +-version-file: build/$(TARGET)/CMakeCache.txt +- (cd build/$(TARGET) && ninja build_version_file) ++version-file: $(BUILD)/$(TARGET)/CMakeCache.txt ++ (cd $(BUILD)/$(TARGET) && ninja build_version_file) + + + .PHONY: pi +@@ -157,17 +158,17 @@ SYSROOT_URL=https://github.com/toitlang/sysroots/releases/download/v1.3.0/sysroo + + rebuild-cmake: sysroot + +-build/$(TARGET)/sysroot/sysroot.tar.xz: ++$(BUILD)/$(TARGET)/sysroot/sysroot.tar.xz: + if [[ "$(SYSROOT_URL)" == "" ]]; then \ + echo "No sysroot URL for $(TARGET)"; \ + exit 1; \ + fi + +- mkdir -p build/$(TARGET)/sysroot +- curl --location --output build/$(TARGET)/sysroot/sysroot.tar.xz $(SYSROOT_URL) ++ mkdir -p $(BUILD)/$(TARGET)/sysroot ++ curl --location --output $(BUILD)/$(TARGET)/sysroot/sysroot.tar.xz $(SYSROOT_URL) + +-build/$(TARGET)/sysroot/usr: build/$(TARGET)/sysroot/sysroot.tar.xz +- tar x -f build/$(TARGET)/sysroot/sysroot.tar.xz -C build/$(TARGET)/sysroot ++$(BUILD)/$(TARGET)/sysroot/usr: $(BUILD)/$(TARGET)/sysroot/sysroot.tar.xz ++ tar x -f $(BUILD)/$(TARGET)/sysroot/sysroot.tar.xz -C $(BUILD)/$(TARGET)/sysroot + touch $@ + endif + +@@ -196,7 +197,7 @@ esp32: + + .PHONY: esp32-no-env + esp32-no-env: check-env check-esp32-env sdk +- cmake -E env IDF_TARGET=$(IDF_TARGET) IDF_CCACHE_ENABLE=1 python$(EXE_SUFFIX) $(IDF_PY) -C toolchains/$(ESP32_CHIP) -B build/$(ESP32_CHIP) -p "$(ESP32_PORT)" build ++ cmake -E env IDF_TARGET=$(IDF_TARGET) IDF_CCACHE_ENABLE=1 python$(EXE_SUFFIX) $(IDF_PY) -C toolchains/$(ESP32_CHIP) -B $(BUILD)/$(ESP32_CHIP) -p "$(ESP32_PORT)" build + + # ESP32 MENU CONFIG + .PHONY: menuconfig +@@ -206,7 +207,7 @@ menuconfig: + + .PHONY: menuconfig-no-env + menuconfig-no-env: check-env check-esp32-env +- cmake -E env IDF_TARGET=$(IDF_TARGET) python$(EXE_SUFFIX) $(IDF_PY) -C toolchains/$(ESP32_CHIP) -B build/$(ESP32_CHIP) -p "$(ESP32_PORT)" menuconfig ++ cmake -E env IDF_TARGET=$(IDF_TARGET) python$(EXE_SUFFIX) $(IDF_PY) -C toolchains/$(ESP32_CHIP) -B $(BUILD)/$(ESP32_CHIP) -p "$(ESP32_PORT)" menuconfig + + .PHONY: flash + flash: +@@ -215,21 +216,21 @@ flash: + + .PHONY: flash-no-env + flash-no-env: esp32-no-env +- cmake -E env IDF_TARGET=$(IDF_TARGET) python$(EXE_SUFFIX) $(IDF_PY) -C toolchains/$(ESP32_CHIP) -B build/$(ESP32_CHIP) -p "$(ESP32_PORT)" flash monitor ++ cmake -E env IDF_TARGET=$(IDF_TARGET) python$(EXE_SUFFIX) $(IDF_PY) -C toolchains/$(ESP32_CHIP) -B $(BUILD)/$(ESP32_CHIP) -p "$(ESP32_PORT)" flash monitor + + # UTILITY + .PHONY: clean + clean: +- rm -rf build/ ++ rm -rf $(BUILD)/ + find toolchains -name sdkconfig -exec rm '{}' ';' + + INSTALL_SRC_ARCH := $(TARGET) + + .PHONY: install-sdk install + install-sdk: +- install -D --target-directory="$(DESTDIR)$(prefix)"/bin "$(CURDIR)"/build/$(INSTALL_SRC_ARCH)/sdk/bin/* +- install -D --target-directory="$(DESTDIR)$(prefix)"/tools "$(CURDIR)"/build/$(INSTALL_SRC_ARCH)/sdk/tools/* +- install -D --target-directory="$(DESTDIR)$(prefix)"/vessels "$(CURDIR)"/build/$(INSTALL_SRC_ARCH)/sdk/vessels/* ++ install -D --target-directory="$(DESTDIR)$(prefix)"/bin "$(BUILD)"/$(INSTALL_SRC_ARCH)/sdk/bin/* ++ install -D --target-directory="$(DESTDIR)$(prefix)"/tools "$(BUILD)"/$(INSTALL_SRC_ARCH)/sdk/tools/* ++ install -D --target-directory="$(DESTDIR)$(prefix)"/vessels "$(BUILD)"/$(INSTALL_SRC_ARCH)/sdk/vessels/* + mkdir -p "$(DESTDIR)$(prefix)"/lib + cp -R "$(CURDIR)"/lib/* "$(DESTDIR)$(prefix)"/lib + find "$(DESTDIR)$(prefix)"/lib -type f -exec chmod 644 {} \; +@@ -240,41 +241,41 @@ install: install-sdk + # TESTS (host) + .PHONY: test + test: +- (cd build/$(HOST) && ninja check_slow check_fuzzer_lib) ++ (cd $(BUILD)/$(HOST) && ninja check_slow check_fuzzer_lib) + + .PHONY: test-fast + test-fast: +- (cd build/$(HOST) && ninja check) ++ (cd $(BUILD)/$(HOST) && ninja check) + + .PHONY: update-gold + update-gold: + $(MAKE) rebuild-cmake +- (cd build/$(HOST) && ninja update_gold) +- (cd build/$(HOST) && ninja update_minus_s_gold) +- (cd build/$(HOST) && ninja update_type_gold) ++ (cd $(BUILD)/$(HOST) && ninja update_gold) ++ (cd $(BUILD)/$(HOST) && ninja update_minus_s_gold) ++ (cd $(BUILD)/$(HOST) && ninja update_type_gold) + + .PHONY: test-health + test-health: download-packages + $(MAKE) rebuild-cmake +- (cd build/$(HOST) && ninja check_health) ++ (cd $(BUILD)/$(HOST) && ninja check_health) + + .PHONY: update-health-gold + update-health-gold: download-packages + $(MAKE) rebuild-cmake +- (cd build/$(HOST) && ninja clear_health_gold) +- (cd build/$(HOST) && ninja update_health_gold) ++ (cd $(BUILD)/$(HOST) && ninja clear_health_gold) ++ (cd $(BUILD)/$(HOST) && ninja update_health_gold) + + .PHONY: enable-external + enable-external: + $(MAKE) rebuild-cmake # Ensure the cmake-directory was created. +- cmake -DTOIT_TEST_EXTERNAL=ON build/$(HOST) ++ cmake -DTOIT_TEST_EXTERNAL=ON $(BUILD)/$(HOST) + $(MAKE) download-external + $(MAKE) rebuild-cmake + $(MAKE) download-packages + + .PHONY: check-external-enabled + check-external-enabled: +- @ if ! cmake -LA -N build/$(HOST) | grep 'TOIT_TEST_EXTERNAL:BOOL=ON'; then \ ++ @ if ! cmake -LA -N $(BUILD)/$(HOST) | grep 'TOIT_TEST_EXTERNAL:BOOL=ON'; then \ + echo "external projects are not enabled. Run 'make enable-external' first."; \ + exit 1; \ + fi +@@ -282,23 +283,23 @@ check-external-enabled: + .PHONY: disable-external + disable-external: check-external-enabled + $(MAKE) rebuild-cmake # Ensure the cmake-directory was created. +- cmake -DTOIT_TEST_EXTERNAL=OFF build/$(HOST) ++ cmake -DTOIT_TEST_EXTERNAL=OFF $(BUILD)/$(HOST) + + .PHONY: download-external + download-external: check-external-enabled + # Download with higher parallelism. +- (cd build/$(HOST) && ninja -j 16 download_external) ++ (cd $(BUILD)/$(HOST) && ninja -j 16 download_external) + + .PHONY: test-external + test-external: check-external-enabled +- (cd build/$(HOST) && ninja check_external) ++ (cd $(BUILD)/$(HOST) && ninja check_external) + + .PHONY: test-external-health + test-external-health: check-external-enabled +- (cd build/$(HOST) && ninja check_external_health) ++ (cd $(BUILD)/$(HOST) && ninja check_external_health) + + .PHONY: update-external-health-gold + update-external-health-gold: download-packages check-external-enabled + $(MAKE) rebuild-cmake +- (cd build/$(HOST) && ninja clear_external_health_gold) +- (cd build/$(HOST) && ninja update_external_health_gold) ++ (cd $(BUILD)/$(HOST) && ninja clear_external_health_gold) ++ (cd $(BUILD)/$(HOST) && ninja update_external_health_gold) +diff --git a/toolchains/idf/components/toit/CMakeLists.txt b/toolchains/idf/components/toit/CMakeLists.txt +index 894d9069..a1cba859 100644 +--- a/toolchains/idf/components/toit/CMakeLists.txt ++++ b/toolchains/idf/components/toit/CMakeLists.txt +@@ -12,7 +12,10 @@ set(TOIT_SYSTEM_NAME "esp32") + + set(TOIT_INTERPRETER_FLAGS "-fno-crossjumping;-fno-tree-tail-merge" CACHE STRING "toit interpreter flags") + +-set(TOIT_SDK_DIR ${TOIT_BASE_DIR}/build/host/sdk) ++# If TOIT_SDK_DIR is not set, do it now. ++if (NOT TOIT_SDK_DIR) ++ set(TOIT_SDK_DIR ${TOIT_BASE_DIR}/build/host/sdk) ++endif() + set(TOIT_SDK_DIR ${TOIT_SDK_DIR} PARENT_SCOPE) + set(TOITC ${TOIT_SDK_DIR}/bin/toit.compile) + set(TOITPKG ${TOIT_SDK_DIR}/bin/toit.pkg)