Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Build fails with unrecognized command-line option '-arch' when cross-compiling #93

Open
edmorley opened this issue Mar 28, 2022 · 3 comments

Comments

@edmorley
Copy link

edmorley commented Mar 28, 2022

Hi :-)

Has anyone seen anything like this before when cross-compiling on an M1 Mac?

This cross-compile configuration works successfully for a variety of other crates, however this is the first crate I'm using that uses CMake, so I'm not sure if it's a libz-sys specific problem, or with cross-compiling with CMake and this toolchain in general.

Steps to reproduce

  1. brew install messense/macos-cross-toolchains/x86_64-unknown-linux-musl (to install this cross-compile toolchain)
  2. brew install cmake (since libz-sys requires it)
  3. rustup target add x86_64-unknown-linux-musl
  4. Ensure the new toolchain can be found:
    export CC_x86_64_unknown_linux_musl=x86_64-unknown-linux-musl-gcc
    export CXX_x86_64_unknown_linux_musl=x86_64-unknown-linux-musl-g++
    export AR_x86_64_unknown_linux_musl=x86_64-unknown-linux-musl-ar
    export CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=x86_64-unknown-linux-musl-gcc
  5. cargo new testcase-libz-sys-cross-compile && cd_
  6. cargo build --target x86_64-unknown-linux-musl

Expected

The build completes successfully (like it does on this machine, when not cross-compiling).

Actual

The build fails with:

   Compiling cc v1.0.73
   Compiling pkg-config v0.3.24
   Compiling libc v0.2.121
   Compiling cmake v0.1.48
   Compiling libz-sys v1.1.5
error: failed to run custom build command for `libz-sys v1.1.5`

Caused by:
  process didn't exit successfully: `/Users/emorley/src/testcase-libz-sys-cross-compile/target/debug/build/libz-sys-720c0d8a10ea6099/build-script-build` (exit status: 101)
  --- stdout
  cargo:rerun-if-env-changed=LIBZ_SYS_STATIC
  cargo:rerun-if-changed=build.rs
  CMAKE_TOOLCHAIN_FILE_x86_64-unknown-linux-musl = None
  CMAKE_TOOLCHAIN_FILE_x86_64_unknown_linux_musl = None
  TARGET_CMAKE_TOOLCHAIN_FILE = None
  CMAKE_TOOLCHAIN_FILE = None
  CMAKE_GENERATOR_x86_64-unknown-linux-musl = None
  CMAKE_GENERATOR_x86_64_unknown_linux_musl = None
  TARGET_CMAKE_GENERATOR = None
  CMAKE_GENERATOR = None
  CMAKE_PREFIX_PATH_x86_64-unknown-linux-musl = None
  CMAKE_PREFIX_PATH_x86_64_unknown_linux_musl = None
  TARGET_CMAKE_PREFIX_PATH = None
  CMAKE_PREFIX_PATH = None
  CMAKE_x86_64-unknown-linux-musl = None
  CMAKE_x86_64_unknown_linux_musl = None
  TARGET_CMAKE = None
  CMAKE = None
  running: "cmake" "/Users/emorley/.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.5/src/zlib-ng" "-DBUILD_SHARED_LIBS=OFF" "-DZLIB_COMPAT=ON" "-DWITH_GZFILEOP=ON" "-DCMAKE_INSTALL_PREFIX=/Users/emorley/src/testcase-libz-sys-cross-compile/target/x86_64-unknown-linux-musl/debug/build/libz-sys-2b3ea8f924a72b91/out" "-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64" "-DCMAKE_C_COMPILER=/opt/homebrew/bin/x86_64-unknown-linux-musl-gcc" "-DCMAKE_CXX_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64" "-DCMAKE_CXX_COMPILER=/opt/homebrew/bin/x86_64-unknown-linux-musl-g++" "-DCMAKE_ASM_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64" "-DCMAKE_ASM_COMPILER=/opt/homebrew/bin/x86_64-unknown-linux-musl-gcc" "-DCMAKE_BUILD_TYPE=Debug"
  -- Using CMake version 3.22.3
  -- ZLIB_HEADER_VERSION: 1.2.11
  -- ZLIBNG_HEADER_VERSION: 2.1.0.devel
  -- The C compiler identification is GNU 11.2.0
  -- Checking whether C compiler has -isysroot
  -- Checking whether C compiler has -isysroot - yes
  -- Checking whether C compiler supports OSX deployment target flag
  -- Checking whether C compiler supports OSX deployment target flag - no
  -- Detecting C compiler ABI info
  -- Detecting C compiler ABI info - failed
  -- Check for working C compiler: /opt/homebrew/bin/x86_64-unknown-linux-musl-gcc
  -- Check for working C compiler: /opt/homebrew/bin/x86_64-unknown-linux-musl-gcc - broken
  -- Configuring incomplete, errors occurred!
  See also "/Users/emorley/src/testcase-libz-sys-cross-compile/target/x86_64-unknown-linux-musl/debug/build/libz-sys-2b3ea8f924a72b91/out/build/CMakeFiles/CMakeOutput.log".
  See also "/Users/emorley/src/testcase-libz-sys-cross-compile/target/x86_64-unknown-linux-musl/debug/build/libz-sys-2b3ea8f924a72b91/out/build/CMakeFiles/CMakeError.log".

  --- stderr
  CMake Error at /opt/homebrew/Cellar/cmake/3.22.3/share/cmake/Modules/CMakeTestCCompiler.cmake:69 (message):
    The C compiler

      "/opt/homebrew/bin/x86_64-unknown-linux-musl-gcc"

    is not able to compile a simple test program.

    It fails with the following output:

      Change Dir: /Users/emorley/src/testcase-libz-sys-cross-compile/target/x86_64-unknown-linux-musl/debug/build/libz-sys-2b3ea8f924a72b91/out/build/CMakeFiles/CMakeTmp

      Run Build Command(s):/usr/bin/make -f Makefile cmTC_710b5/fast && /Library/Developer/CommandLineTools/usr/bin/make  -f CMakeFiles/cmTC_710b5.dir/build.make CMakeFiles/cmTC_710b5.dir/build
      Building C object CMakeFiles/cmTC_710b5.dir/testCCompiler.c.o
      /opt/homebrew/bin/x86_64-unknown-linux-musl-gcc   -ffunction-sections -fdata-sections -fPIC -m64  -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk -std=c11 -o CMakeFiles/cmTC_710b5.dir/testCCompiler.c.o -c /Users/emorley/src/testcase-libz-sys-cross-compile/target/x86_64-unknown-linux-musl/debug/build/libz-sys-2b3ea8f924a72b91/out/build/CMakeFiles/CMakeTmp/testCCompiler.c
      x86_64-unknown-linux-musl-gcc: error: unrecognized command-line option '-arch'
      make[1]: *** [CMakeFiles/cmTC_710b5.dir/testCCompiler.c.o] Error 1
      make: *** [cmTC_710b5/fast] Error 2

    CMake will not be able to correctly generate this project.
  Call Stack (most recent call first):
    CMakeLists.txt:37 (project)

  thread 'main' panicked at '
  command did not execute successfully, got: exit status: 1

  build script failed, must exit now', /Users/emorley/.cargo/registry/src/github.com-1ecc6299db9ec823/cmake-0.1.48/src/lib.rs:975:5
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Environment

  • macOS 12.3 on Apple Silicon (M1 Max)
  • rustc 1.60.0-beta.6 (7bccde197 2022-03-22)
  • Crate versions at time of testing:
    • libz-sys: 1.1.5
    • cmake: 0.1.48
    • pkg-config: 0.3.24
  • The cross-compile toolchain currently uses GCC 11.2.
@edmorley
Copy link
Author

The CMakeError.log file mentioned contains:

Detecting C compiler ABI info failed to compile with the following output:
Change Dir: /Users/emorley/src/testcase-libz-sys-cross-compile/target/x86_64-unknown-linux-musl/debug/build/libz-sys-2b3ea8f924a72b91/out/build/CMakeFiles/CMakeTmp

Run Build Command(s):/usr/bin/make -f Makefile cmTC_1760d/fast && /Library/Developer/CommandLineTools/usr/bin/make  -f CMakeFiles/cmTC_1760d.dir/build.make CMakeFiles/cmTC_1760d.dir/build
Building C object CMakeFiles/cmTC_1760d.dir/CMakeCCompilerABI.c.o
/opt/homebrew/bin/x86_64-unknown-linux-musl-gcc   -ffunction-sections -fdata-sections -fPIC -m64  -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk   -v -Wl,-v -std=c11 -o CMakeFiles/cmTC_1760d.dir/CMakeCCompilerABI.c.o -c /opt/homebrew/Cellar/cmake/3.22.3/share/cmake/Modules/CMakeCCompilerABI.c
Using built-in specs.
COLLECT_GCC=/opt/homebrew/bin/x86_64-unknown-linux-musl-gcc
x86_64-unknown-linux-musl-gcc: error: unrecognized command-line option '-arch'
Target: x86_64-unknown-linux-musl
Configured with: /Volumes/build/.build/x86_64-unknown-linux-musl/src/gcc/configure --build=aarch64-build_apple-darwin21.3.0 --host=aarch64-build_apple-darwin21.3.0 --target=x86_64-unknown-linux-musl --prefix=/Volumes/tools/x86_64-unknown-linux-musl --exec_prefix=/Volumes/tools/x86_64-unknown-linux-musl --with-sysroot=/Volumes/tools/x86_64-unknown-linux-musl/x86_64-unknown-linux-musl/sysroot --enable-languages=c,c++,fortran --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --disable-libmpx --with-gmp=/Volumes/build/.build/x86_64-unknown-linux-musl/buildtools --with-mpfr=/Volumes/build/.build/x86_64-unknown-linux-musl/buildtools --with-mpc=/Volumes/build/.build/x86_64-unknown-linux-musl/buildtools --with-isl=/Volumes/build/.build/x86_64-unknown-linux-musl/buildtools --enable-lto --enable-threads=posix --enable-target-optspace --with-linker-hash-style=both --enable-plugin --enable-gold --disable-nls --disable-multilib --with-local-prefix=/Volumes/tools/x86_64-unknown-linux-musl/x86_64-unknown-linux-musl/sysroot --enable-long-long
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.2.0 (GCC) 
make[1]: *** [CMakeFiles/cmTC_1760d.dir/CMakeCCompilerABI.c.o] Error 1
make: *** [cmTC_1760d/fast] Error 2




Determining if the C compiler works failed with the following output:
Change Dir: /Users/emorley/src/testcase-libz-sys-cross-compile/target/x86_64-unknown-linux-musl/debug/build/libz-sys-2b3ea8f924a72b91/out/build/CMakeFiles/CMakeTmp

Run Build Command(s):/usr/bin/make -f Makefile cmTC_bd1e5/fast && /Library/Developer/CommandLineTools/usr/bin/make  -f CMakeFiles/cmTC_bd1e5.dir/build.make CMakeFiles/cmTC_bd1e5.dir/build
Building C object CMakeFiles/cmTC_bd1e5.dir/testCCompiler.c.o
/opt/homebrew/bin/x86_64-unknown-linux-musl-gcc   -ffunction-sections -fdata-sections -fPIC -m64  -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk -std=c11 -o CMakeFiles/cmTC_bd1e5.dir/testCCompiler.c.o -c /Users/emorley/src/testcase-libz-sys-cross-compile/target/x86_64-unknown-linux-musl/debug/build/libz-sys-2b3ea8f924a72b91/out/build/CMakeFiles/CMakeTmp/testCCompiler.c
x86_64-unknown-linux-musl-gcc: error: unrecognized command-line option '-arch'
make[1]: *** [CMakeFiles/cmTC_bd1e5.dir/testCCompiler.c.o] Error 1
make: *** [cmTC_bd1e5/fast] Error 2

And .../out/build/CMakeFiles/3.22.3/CMakeSystem.cmake contains:

set(CMAKE_HOST_SYSTEM "Darwin-21.4.0")
set(CMAKE_HOST_SYSTEM_NAME "Darwin")
set(CMAKE_HOST_SYSTEM_VERSION "21.4.0")
set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64")



set(CMAKE_SYSTEM "Darwin-21.4.0")
set(CMAKE_SYSTEM_NAME "Darwin")
set(CMAKE_SYSTEM_VERSION "21.4.0")
set(CMAKE_SYSTEM_PROCESSOR "arm64")

set(CMAKE_CROSSCOMPILING "FALSE")

set(CMAKE_SYSTEM_LOADED 1)

@edmorley
Copy link
Author

Upgrading from CMake 3.22.3 to the newly released 3.23.0 (both installed via brew), doesn't help.

@edmorley
Copy link
Author

I don't suppose anyone has ideas of what to try next? :-)

edmorley added a commit to heroku/libcnb.rs that referenced this issue Jul 12, 2023
The `flate2` crate supports multiple backends for performing
decompression:
https://github.com/rust-lang/flate2-rs#backends

The default `miniz_oxide` flate2 backend has poor performance in debug
builds/under QEMU:
rust-lang/flate2-rs#297

Ideally we'd use the fastest `zlib-ng` backend, however it fails to
cross-compile:
rust-lang/libz-sys#93

As such we have to use the next best alternate backend, which is the
`zlib` backend.

(This is the backend that the Python CNB already uses.)

GUS-W-13745779.
edmorley added a commit to heroku/libcnb.rs that referenced this issue Jul 12, 2023
The `flate2` crate supports multiple backends for performing
decompression:
https://github.com/rust-lang/flate2-rs#backends

The default `miniz_oxide` flate2 backend has poor performance in debug
builds/under QEMU:
rust-lang/flate2-rs#297

Ideally we'd use the fastest `zlib-ng` backend, however it fails to
cross-compile:
rust-lang/libz-sys#93

As such we have to use the next best alternate backend, which is the
`zlib` backend.

(This is the backend that the Python CNB already uses.)

GUS-W-13745779.
edmorley added a commit to heroku/buildpacks-ruby that referenced this issue Mar 1, 2024
The default `miniz_oxide` flate2 backend has poor performance in debug/under QEMU:
rust-lang/flate2-rs#297

Ideally we'd use the fastest `zlib-ng` backend, however it fails to cross-compile:
rust-lang/libz-sys#93

As such we have to use the next best alternate backend, which is `zlib`.

This makes the `flate2` usage in this repo consistent with `libherokubuildpack`,
Python CNB, PHP CNB etc.
edmorley added a commit to heroku/buildpacks-ruby that referenced this issue Mar 1, 2024
* Bump the rust-dependencies group with 5 updates

Bumps the rust-dependencies group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [tempfile](https://github.com/Stebalien/tempfile) | `3.9.0` | `3.10.1` |
| [thiserror](https://github.com/dtolnay/thiserror) | `1.0.55` | `1.0.57` |
| [ureq](https://github.com/algesten/ureq) | `2.9.1` | `2.9.6` |
| [clap](https://github.com/clap-rs/clap) | `4.4.18` | `4.5.1` |
| [toml](https://github.com/toml-rs/toml) | `0.8.9` | `0.8.10` |


Updates `tempfile` from 3.9.0 to 3.10.1
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](Stebalien/tempfile@v3.9.0...v3.10.1)

Updates `thiserror` from 1.0.55 to 1.0.57
- [Release notes](https://github.com/dtolnay/thiserror/releases)
- [Commits](dtolnay/thiserror@1.0.55...1.0.57)

Updates `ureq` from 2.9.1 to 2.9.6
- [Changelog](https://github.com/algesten/ureq/blob/main/CHANGELOG.md)
- [Commits](algesten/ureq@2.9.1...2.9.6)

Updates `clap` from 4.4.18 to 4.5.1
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](clap-rs/clap@v4.4.18...clap_complete-v4.5.1)

Updates `toml` from 0.8.9 to 0.8.10
- [Commits](toml-rs/toml@toml-v0.8.9...toml-v0.8.10)

---
updated-dependencies:
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rust-dependencies
- dependency-name: thiserror
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-dependencies
- dependency-name: ureq
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-dependencies
- dependency-name: clap
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rust-dependencies
- dependency-name: toml
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>

* Refresh lockfile

* Sort deps in Cargo.toml alphabetically

* Make libcnb-test version specifier consistent

* Remove unnecessary lint suppression

Since the import is now used in the library itself.

* Disable unused Cargo features

* Switch to the `zlib` flate2 backend

The default `miniz_oxide` flate2 backend has poor performance in debug/under QEMU:
rust-lang/flate2-rs#297

Ideally we'd use the fastest `zlib-ng` backend, however it fails to cross-compile:
rust-lang/libz-sys#93

As such we have to use the next best alternate backend, which is `zlib`.

This makes the `flate2` usage in this repo consistent with `libherokubuildpack`,
Python CNB, PHP CNB etc.

* Add TODO about regex vs fancy-regex

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ed Morley <501702+edmorley@users.noreply.github.com>
edmorley added a commit to heroku/buildpacks-jvm that referenced this issue Mar 1, 2024
The default `miniz_oxide` flate2 backend has poor performance in debug/under QEMU:
rust-lang/flate2-rs#297

Ideally we'd use the fastest `zlib-ng` backend, however it fails to cross-compile:
rust-lang/libz-sys#93

As such we have to use the next best alternate backend, which is `zlib`.

This makes the `flate2` usage in this repo consistent with `libherokubuildpack`,
Python CNB, PHP CNB etc.
edmorley added a commit to heroku/buildpacks-jvm that referenced this issue Mar 1, 2024
* Bump the rust-dependencies group with 6 updates

Bumps the rust-dependencies group with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [serde](https://github.com/serde-rs/serde) | `1.0.196` | `1.0.197` |
| [tempfile](https://github.com/Stebalien/tempfile) | `3.9.0` | `3.10.1` |
| [ureq](https://github.com/algesten/ureq) | `2.9.1` | `2.9.6` |
| [thiserror](https://github.com/dtolnay/thiserror) | `1.0.56` | `1.0.57` |
| [toml](https://github.com/toml-rs/toml) | `0.8.9` | `0.8.10` |
| [semver](https://github.com/dtolnay/semver) | `1.0.21` | `1.0.22` |


Updates `serde` from 1.0.196 to 1.0.197
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](serde-rs/serde@v1.0.196...v1.0.197)

Updates `tempfile` from 3.9.0 to 3.10.1
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](Stebalien/tempfile@v3.9.0...v3.10.1)

Updates `ureq` from 2.9.1 to 2.9.6
- [Changelog](https://github.com/algesten/ureq/blob/main/CHANGELOG.md)
- [Commits](algesten/ureq@2.9.1...2.9.6)

Updates `thiserror` from 1.0.56 to 1.0.57
- [Release notes](https://github.com/dtolnay/thiserror/releases)
- [Commits](dtolnay/thiserror@1.0.56...1.0.57)

Updates `toml` from 0.8.9 to 0.8.10
- [Commits](toml-rs/toml@toml-v0.8.9...toml-v0.8.10)

Updates `semver` from 1.0.21 to 1.0.22
- [Release notes](https://github.com/dtolnay/semver/releases)
- [Commits](dtolnay/semver@1.0.21...1.0.22)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-dependencies
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rust-dependencies
- dependency-name: ureq
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-dependencies
- dependency-name: thiserror
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-dependencies
- dependency-name: toml
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-dependencies
- dependency-name: semver
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>

* Refresh lockfile

* Disable unused default Cargo features

* Switch to the `zlib` flate2 backend

The default `miniz_oxide` flate2 backend has poor performance in debug/under QEMU:
rust-lang/flate2-rs#297

Ideally we'd use the fastest `zlib-ng` backend, however it fails to cross-compile:
rust-lang/libz-sys#93

As such we have to use the next best alternate backend, which is `zlib`.

This makes the `flate2` usage in this repo consistent with `libherokubuildpack`,
Python CNB, PHP CNB etc.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ed Morley <501702+edmorley@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant