eclipse / paho.mqtt.rust

paho.mqtt.rust
Other
518 stars 102 forks source link

cross compile with mips-unknown-linux-uclibc #112

Closed qianchenzhumeng closed 3 years ago

qianchenzhumeng commented 3 years ago

Hello, I tried to cross compile some examples with mips-unknown-linux-uclibc on Ubuntu 20.04.1(Windows Subsystem for Linux), but it didn't work. But on my other computer(Ubuntu 16.04.3, Windows Subsystem for Linux), it can work.

My rust toolchain is a custom toolchain builded from rust source(tag: 1.46.0) with adding mips-unknown-linux-uclibc target.

$ cargo build --target=mips-unknown-linux-uclibc --examples --verbose
$ cat .cargo/config
[target.mips-unknown-linux-uclibc]
linker = "mips-openwrt-linux-uclibc-gcc"
ar = "mips-openwrt-linux-uclibc-ar"
$ echo $CC_mips_unknown_linux_uclibc
mips-openwrt-linux-uclibc-gcc
$ echo $STAGING_DIR
/mnt/f/wsl/OpenWRT/OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir

Searching for head file from /usr/include/ is strange. Normally, it should search for head file from $STAGING_DIR/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/include.

error: failed to run custom build command for `paho-mqtt-sys v0.3.0 (/mnt/f/wsl/source/paho.mqtt.rust/paho-mqtt-sys)`

Caused by:
  process didn't exit successfully: `/mnt/f/wsl/source/paho.mqtt.rust/target/debug/build/paho-mqtt-sys-8824fabeef20cd48/build-script-build` (exit code: 101)
--- stdout
debug:Running the bundled build for Paho C
cargo:rerun-if-changed=build.rs
running: "cmake" "/mnt/f/wsl/source/paho.mqtt.rust/paho-mqtt-sys/paho.mqtt.c/" "-DPAHO_BUILD_SHARED=off" "-DPAHO_BUILD_STATIC=on" "-DPAHO_ENABLE_TESTING=off" "-DPAHO_WITH_SSL=on" "-DCMAKE_INSTALL_PREFIX=/mnt/f/wsl/source/paho.mqtt.rust/target/mips-unknown-linux-uclibc/debug/build/paho-mqtt-sys-d82ee6314985805b/out" "-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC" "-DCMAKE_C_COMPILER=/mnt/f/wsl/OpenWRT/OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-gcc" "-DCMAKE_CXX_FLAGS= -ffunction-sections -fdata-sections -fPIC" "-DCMAKE_CXX_COMPILER=/mnt/f/wsl/OpenWRT/OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-g++" "-DCMAKE_ASM_FLAGS= -ffunction-sections -fdata-sections -fPIC" "-DCMAKE_ASM_COMPILER=/mnt/f/wsl/OpenWRT/OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-gcc" "-DCMAKE_BUILD_TYPE=Debug"
-- The C compiler identification is GNU 4.8.3
-- Check for working C compiler: /mnt/f/wsl/OpenWRT/OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-gcc
-- Check for working C compiler: /mnt/f/wsl/OpenWRT/OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- CMake version: 3.16.3
-- CMake system name: Linux
-- The CXX compiler identification is GNU 4.8.3
-- Check for working CXX compiler: /mnt/f/wsl/OpenWRT/OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-g++
-- Check for working CXX compiler: /mnt/f/wsl/OpenWRT/OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Timestamp is 2020-12-30T13:34:02Z
-- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "1.0.2n")
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/f/wsl/source/paho.mqtt.rust/target/mips-unknown-linux-uclibc/debug/build/paho-mqtt-sys-d82ee6314985805b/out/build
running: "cmake" "--build" "." "--target" "install" "--config" "Debug" "--"
Scanning dependencies of target common_obj_static
Scanning dependencies of target common_ssl_obj_static
[  1%] Building C object src/CMakeFiles/common_obj_static.dir/MQTTTime.c.o
[  3%] Building C object src/CMakeFiles/common_obj_static.dir/MQTTProtocolClient.c.o
[  5%] Building C object src/CMakeFiles/common_obj_static.dir/Clients.c.o
[  6%] Building C object src/CMakeFiles/common_obj_static.dir/utf-8.c.o
[  8%] Building C object src/CMakeFiles/common_obj_static.dir/MQTTPacket.c.o
[ 10%] Building C object src/CMakeFiles/common_obj_static.dir/Messages.c.o
[ 12%] Building C object src/CMakeFiles/common_obj_static.dir/MQTTPacketOut.c.o
[ 15%] Building C object src/CMakeFiles/common_obj_static.dir/Tree.c.o
[ 15%] Building C object src/CMakeFiles/common_obj_static.dir/Socket.c.o
[ 18%] Building C object src/CMakeFiles/common_obj_static.dir/Log.c.o
[ 18%] Building C object src/CMakeFiles/common_obj_static.dir/MQTTPersistence.c.o
[ 24%] Building C object src/CMakeFiles/common_obj_static.dir/Thread.c.o
[ 24%] Building C object src/CMakeFiles/common_obj_static.dir/MQTTProtocolOut.c.o
[ 24%] Building C object src/CMakeFiles/common_obj_static.dir/MQTTPersistenceDefault.c.o
[ 25%] Building C object src/CMakeFiles/common_obj_static.dir/SocketBuffer.c.o
[ 27%] Building C object src/CMakeFiles/common_ssl_obj_static.dir/MQTTTime.c.o
[ 29%] Building C object src/CMakeFiles/common_obj_static.dir/LinkedList.c.o
[ 31%] Building C object src/CMakeFiles/common_obj_static.dir/MQTTProperties.c.o
[ 32%] Building C object src/CMakeFiles/common_obj_static.dir/MQTTReasonCodes.c.o
[ 34%] Building C object src/CMakeFiles/common_obj_static.dir/Base64.c.o
[ 36%] Building C object src/CMakeFiles/common_obj_static.dir/SHA1.c.o
[ 37%] Building C object src/CMakeFiles/common_obj_static.dir/WebSocket.c.o
[ 39%] Building C object src/CMakeFiles/common_obj_static.dir/StackTrace.c.o
[ 41%] Building C object src/CMakeFiles/common_obj_static.dir/Heap.c.o
[ 41%] Built target common_obj_static

--- stderr
CMake Warning:
  Manually-specified variables were not used by the project:

    CMAKE_ASM_COMPILER
    CMAKE_ASM_FLAGS

In file included from /mnt/f/wsl/OpenWRT/OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/include/sys/time.h:23:0,
                 from /mnt/f/wsl/source/paho.mqtt.rust/paho-mqtt-sys/paho.mqtt.c/src/MQTTTime.h:28,
                 from /mnt/f/wsl/source/paho.mqtt.rust/paho-mqtt-sys/paho.mqtt.c/src/MQTTTime.c:17:
/usr/include/features.h:485:23: fatal error: gnu/stubs.h: No such file or directory
 #include <gnu/stubs.h>
                       ^
compilation terminated.
make[2]: *** [src/CMakeFiles/common_ssl_obj_static.dir/build.make:63: src/CMakeFiles/common_ssl_obj_static.dir/MQTTTime.c.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:327: src/CMakeFiles/common_ssl_obj_static.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:152: all] Error 2
thread 'main' panicked at '
command did not execute successfully, got: exit code: 2

build script failed, must exit now', /home/dell/.cargo/registry/src/crates.rustcc.com-a21e0f92747beca3/cmake-0.1.45/src/lib.rs:894:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
fpagliughi commented 3 years ago

Well, it doesn't seem to be able to compile the Paho C library due to the missing header file, <gnu/stubs.h>

It may be worth trying to build the C library separately to see if you can do so with your toolchain and, if not, see if the C lib folks can help us out.

From the build.rs in our -sys crate, we see that we're just using CMake to build the C lib, with these options (keeping in mind that ssl is true by default):

https://github.com/eclipse/paho.mqtt.rust/blob/54de65c12404ac24b9252847ee8f746ed56476ac/paho-mqtt-sys/build.rs#L234-L239

That converts to a CMake command like:

$ cmake -DPAHO_BUILD_SHARED=OFF -DPAHO_BUILD_STATIC=ON -DPAHO_ENABLE_TESTING=OFF \
    -DPAHO_HIGH_PERFORMANCE=ON -DPAHO_WITH_SSL=ON ..
qianchenzhumeng commented 3 years ago

Thanks. I found it was my carelessness, my STAGING_DIR was wrong. It should be /mnt/f/wsl/OpenWRT/OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2.