--- - name: ensure build work dir exists become: yes file: path: "{{build_work_dir}}" state: "directory" owner: "{{ansible_user}}" group: "{{ansible_user}}" mode: "0755" - name: check if mattertimectl build exists stat: path: "{{mattertimectl_srv_dir}}/mattertimectl-{{mattertimectl_version}}.tar.gz" register: build_file # NOTE: rustup is used only because rs-matter requires a newer rustc than # Ubuntu 24.04's apt ships (apt rustc is 1.75; rs-matter needs >= 1.87). Once # the build host runs an Ubuntu whose apt rustc/cargo are new enough, drop # rustup and the toolchain tasks below and just `apt install rustc cargo`. - name: install rustup become: yes apt: name: "rustup" state: "present" - name: install a current stable rust toolchain command: "rustup toolchain install stable" environment: CARGO_HOME: "{{mattertimectl_cargo_home}}" RUSTUP_HOME: "{{mattertimectl_rustup_home}}" when: not build_file.stat.exists - name: unarchive mattertimectl source unarchive: remote_src: yes src: "{{mattertimectl_tar}}" dest: "{{build_work_dir}}/" creates: "{{mattertimectl_build_dir}}" - name: build mattertimectl release binary # rustup run stable dispatches cargo through the toolchain regardless of # the apt rustup package's proxy layout or the configured default. command: "rustup run stable cargo build --release" args: chdir: "{{mattertimectl_build_dir}}" creates: "{{mattertimectl_cargo_target_dir}}/release/mattertimectl" environment: CARGO_HOME: "{{mattertimectl_cargo_home}}" RUSTUP_HOME: "{{mattertimectl_rustup_home}}" CARGO_TARGET_DIR: "{{mattertimectl_cargo_target_dir}}" when: not build_file.stat.exists - name: create build server dir become: yes file: path: "{{mattertimectl_srv_dir}}" mode: "0755" state: "directory" - name: create gz archive of mattertimectl binary become: yes archive: path: "{{mattertimectl_cargo_target_dir}}/release/mattertimectl" dest: "{{mattertimectl_srv_dir}}/mattertimectl-{{mattertimectl_version}}.tar.gz" format: "gz" # force a real tar for the single-file binary; the module otherwise gzips # a lone file into a bare .gz that the server's unarchive can't extract. # The tar preserves the executable bit the target relies on. force_archive: true when: not build_file.stat.exists