d99kris / nchat

Terminal-based Telegram / WhatsApp client for Linux and macOS
MIT License
524 stars 40 forks source link

cross compile #176

Closed firmwarecostum closed 6 months ago

firmwarecostum commented 6 months ago

how to cross compile

telegram/Client.h:11:10: fatal error: td/telegram/td_api.h: No such file or directory
   11 | #include "td/telegram/td_api.h"
      |          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
firmwarecostum commented 6 months ago

@d99kris

d99kris commented 6 months ago

Hi @firmwarecostum - can you share what host platform and target platform you are using? Also what commands you use to cross-compile?

I haven't cross-compiled nchat myself, but I believe the code should be fairly portable (and possible to cross-compile).

firmwarecostum commented 6 months ago

hy @d99kris

I use openwrt

https://downloads.openwrt.org/releases/23.05.2/targets/armsr/armv8/

full log

make[2]: Entering directory '/home/open/wrt/package/nchat'
mkdir -p /home/open/wrt/dl
SHELL= flock /home/open/wrt/tmp/.nchat-4.13.tar.gz.flock -c '   /home/open/wrt/scripts/download.pl "/home/open/wrt/dl" "nchat-4.13.tar.gz" "skip" "" "https://codeload.github.com/d99kris/nchat/tar.gz/v4.13?"    '
+ curl -f --connect-timeout 20 --retry 5 --location https://codeload.github.com/d99kris/nchat/tar.gz/v4.13?/nchat-4.13.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 5824k    0 5824k    0     0  4825k      0 --:--:--  0:00:01 --:--:-- 4825k
touch /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/.prepared_b9908a1d38d6245c32e29feca12c0c42_6664517399ebbbc92a37c5bb081b5c53_check
. /home/open/wrt/include/shell.sh; /home/open/wrt/staging_dir/host/bin/libdeflate-gzip
-dc /home/open/wrt/dl/nchat-4.13.tar.gz | tar -C /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/.. -xf -
[ ! -d ./src/ ] || cp -fpR ./src/. /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13
touch /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/.prepared_b9908a1d38d6245c32e29feca12c0c42_6664517399ebbbc92a37c5bb081b5c53
rm -f /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/.configured_*
rm -f /home/open/wrt/staging_dir/target-aarch64_generic_musl/stamp/.nchat_installed
mkdir -p /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/build
(cd /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/build; CFLAGS="-Os
-pipe -mcpu=generic -fno-caller-saves -fno-plt -fhonour-copts -ffile-prefix-map=/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13=nchat-4.13 -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1 -Wl,-z,now -Wl,-z,relro " CXXFLAGS="-Os -pipe -mcpu=generic -fno-caller-saves -fno-plt -fhonour-copts -ffile-prefix-map=/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13=nchat-4.13 -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1 -Wl,-z,now -Wl,-z,relro " LDFLAGS="-L/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/usr/lib -L/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/lib -znow -zrelro " cmake -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_VERSION=1 -DCMAKE_SYSTEM_PROCESSOR=aarch64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG" -DCMAKE_CXX_FLAGS_RELEASE="-DNDEBUG" -DCMAKE_C_COMPILER_LAUNCHER="" -DCMAKE_C_COMPILER="/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/bin/aarch64-openwrt-linux-musl-gcc" -DCMAKE_CXX_COMPILER_LAUNCHER="" -DCMAKE_CXX_COMPILER="/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/bin/aarch64-openwrt-linux-musl-g++" -DCMAKE_ASM_COMPILER_LAUNCHER="" -DCMAKE_ASM_COMPILER="/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/bin/aarch64-openwrt-linux-musl-gcc" -DCMAKE_EXE_LINKER_FLAGS:STRING="-L/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/usr/lib -L/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/lib -znow -zrelro" -DCMAKE_MODULE_LINKER_FLAGS:STRING="-L/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/usr/lib -L/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/lib -znow -zrelro -Wl,-Bsymbolic-functions" -DCMAKE_SHARED_LINKER_FLAGS:STRING="-L/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/usr/lib -L/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/lib -znow -zrelro -Wl,-Bsymbolic-functions" -DCMAKE_AR="/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/bin/aarch64-openwrt-linux-musl-gcc-ar" -DCMAKE_NM="/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/bin/aarch64-openwrt-linux-musl-gcc-nm" -DCMAKE_RANLIB="/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/bin/aarch64-openwrt-linux-musl-gcc-ranlib" -DCMAKE_FIND_ROOT_PATH="/home/open/wrt/staging_dir/target-aarch64_generic_musl/usr;/home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl" -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=BOTH -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY -DCMAKE_STRIP=: -DCMAKE_INSTALL_PREFIX=/usr -DDL_LIBRARY=/home/open/wrt/staging_dir/target-aarch64_generic_musl -DCMAKE_PREFIX_PATH=/home/open/wrt/staging_dir/target-aarch64_generic_musl -DCMAKE_SKIP_RPATH=TRUE -DCMAKE_EXPORT_PACKAGE_REGISTRY=FALSE -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=TRUE -DCMAKE_FIND_USE_PACKAGE_REGISTRY=FALSE -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=TRUE -DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=FALSE -DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=TRUE -DCMAKE_GENERATOR="Ninja" /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13 )
-- The CXX compiler identification is GNU 12.3.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/bin/aarch64-openwrt-linux-musl-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Using build type 'Release'.
-- Dummy: ON
-- Telegram: ON
-- WhatsApp: ON
-- Dynamic Load: ON
-- Multi Protocol: ON
-- Found SQLite3: /home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/include (found version "3.41.2")
-- Performing Test HAVE_BUILTIN_ATOMIC
-- Performing Test HAVE_BUILTIN_ATOMIC - Success
-- Using built-in atomic.
-- The C compiler identification is GNU 12.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/bin/aarch64-openwrt-linux-musl-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Found ccache
-- Found OpenSSL: /home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/lib/libcrypto.so (found version "3.0.12")
-- Found OpenSSL: /home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/include /home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/lib/libssl.so;/home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/lib/libcrypto.so
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Performing Test HAVE_STD14
-- Performing Test HAVE_STD14 - Success
-- Performing Test HAVE_CXX_FLAG_WALL
-- Performing Test HAVE_CXX_FLAG_WALL - Success
-- Performing Test HAVE_CXX_FLAG_WEXTRA
-- Performing Test HAVE_CXX_FLAG_WEXTRA - Success
-- Performing Test HAVE_CXX_FLAG_WIMPLICIT_FALLTHROUGH_2
-- Performing Test HAVE_CXX_FLAG_WIMPLICIT_FALLTHROUGH_2 - Success
-- Performing Test HAVE_CXX_FLAG_WPOINTER_ARITH
-- Performing Test HAVE_CXX_FLAG_WPOINTER_ARITH - Success
-- Performing Test HAVE_CXX_FLAG_WCAST_QUAL
-- Performing Test HAVE_CXX_FLAG_WCAST_QUAL - Success
-- Performing Test HAVE_CXX_FLAG_WSIGN_COMPARE
-- Performing Test HAVE_CXX_FLAG_WSIGN_COMPARE - Success
-- Performing Test HAVE_CXX_FLAG_WDUPLICATED_BRANCHES
-- Performing Test HAVE_CXX_FLAG_WDUPLICATED_BRANCHES - Success
-- Performing Test HAVE_CXX_FLAG_WDUPLICATED_COND
-- Performing Test HAVE_CXX_FLAG_WDUPLICATED_COND - Success
-- Performing Test HAVE_CXX_FLAG_WALLOC_ZERO
-- Performing Test HAVE_CXX_FLAG_WALLOC_ZERO - Success
-- Performing Test HAVE_CXX_FLAG_WLOGICAL_OP
-- Performing Test HAVE_CXX_FLAG_WLOGICAL_OP - Success
-- Performing Test HAVE_CXX_FLAG_WTAUTOLOGICAL_COMPARE
-- Performing Test HAVE_CXX_FLAG_WTAUTOLOGICAL_COMPARE - Success
-- Performing Test HAVE_CXX_FLAG_WVLA
-- Performing Test HAVE_CXX_FLAG_WVLA - Success
-- Performing Test HAVE_CXX_FLAG_WNON_VIRTUAL_DTOR
-- Performing Test HAVE_CXX_FLAG_WNON_VIRTUAL_DTOR - Success
-- Performing Test HAVE_CXX_FLAG_WUNUSED_PARAMETER
-- Performing Test HAVE_CXX_FLAG_WUNUSED_PARAMETER - Success
-- Performing Test HAVE_CXX_FLAG_WCONVERSION
-- Performing Test HAVE_CXX_FLAG_WCONVERSION - Success
-- Performing Test HAVE_CXX_FLAG_WSIGN_CONVERSION
-- Performing Test HAVE_CXX_FLAG_WSIGN_CONVERSION - Success
-- Performing Test HAVE_CXX_FLAG_WCXX14_COMPAT_PEDANTIC
-- Performing Test HAVE_CXX_FLAG_WCXX14_COMPAT_PEDANTIC - Failed
-- Performing Test HAVE_CXX_FLAG_WDEPRECATED
-- Performing Test HAVE_CXX_FLAG_WDEPRECATED - Success
-- Performing Test HAVE_CXX_FLAG_WUNUSED_COMMAND_LINE_ARGUMENT
-- Performing Test HAVE_CXX_FLAG_WUNUSED_COMMAND_LINE_ARGUMENT - Failed
-- Performing Test HAVE_CXX_FLAG_QUNUSED_ARGUMENTS
-- Performing Test HAVE_CXX_FLAG_QUNUSED_ARGUMENTS - Failed
-- Performing Test HAVE_CXX_FLAG_WUNKNOWN_WARNING_OPTION
-- Performing Test HAVE_CXX_FLAG_WUNKNOWN_WARNING_OPTION - Failed
-- Performing Test HAVE_CXX_FLAG_WODR
-- Performing Test HAVE_CXX_FLAG_WODR - Success
-- Performing Test HAVE_CXX_FLAG_FLTO_ODR_TYPE_MERGING
-- Performing Test HAVE_CXX_FLAG_FLTO_ODR_TYPE_MERGING - Success
-- Performing Test HAVE_CXX_FLAG_WMAYBE_UNINITIALIZED
-- Performing Test HAVE_CXX_FLAG_WMAYBE_UNINITIALIZED - Success
-- Performing Test HAVE_CXX_FLAG_WREDUNDANT_MOVE
-- Performing Test HAVE_CXX_FLAG_WREDUNDANT_MOVE - Success
-- Performing Test HAVE_CXX_FLAG_WSTRINGOP_OVERFLOW
-- Performing Test HAVE_CXX_FLAG_WSTRINGOP_OVERFLOW - Success
-- Git state: GITDIR-NOTFOUND
-- Checking for one of the modules 'zlib'
-- Found ZLIB: /home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/lib/libz.so (found version "1.2.13")
-- Found ZLIB: /home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/include /home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/lib/libz.so
-- Performing Test COMPILER_HAS_HIDDEN_VISIBILITY
-- Performing Test COMPILER_HAS_HIDDEN_VISIBILITY - Success
-- Performing Test COMPILER_HAS_HIDDEN_INLINE_VISIBILITY
-- Performing Test COMPILER_HAS_HIDDEN_INLINE_VISIBILITY - Success
-- Performing Test COMPILER_HAS_DEPRECATED_ATTR
-- Performing Test COMPILER_HAS_DEPRECATED_ATTR - Success
-- Go version 1.21.5 (enable modcacherw).
-- Go golang.
-- Go libraries:
-- Looking for include file xcb/xcb.h
-- Looking for include file xcb/xcb.h - not found
-- Looking for cbreak in /home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/lib/libncursesw.so
-- Looking for cbreak in /home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/lib/libncursesw.so - found
-- Looking for nodelay in /home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/lib/libncursesw.so
-- Looking for nodelay in /home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/lib/libncursesw.so - found
-- Found Curses: /home/open/wrt/staging_dir/target-aarch64_generic_musl/usr/lib/libncursesw.so
-- Using fallback man dir: /usr/man
-- Configuring done (3.6s)
-- Generating done (0.1s)
CMake Warning:
  Manually-specified variables were not used by the project:
    CMAKE_ASM_COMPILER
    CMAKE_ASM_COMPILER_LAUNCHER
    CMAKE_EXPORT_NO_PACKAGE_REGISTRY
    CMAKE_EXPORT_PACKAGE_REGISTRY
    CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY
    CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY
    CMAKE_MODULE_LINKER_FLAGS
    DL_LIBRARY
-- Build files have been written to: /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/build
touch /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/.configured_68b329da9893e34099c7d8ad5cb9c940
rm -f /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/.built
touch /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/.built_check
MAKEFLAGS="" /home/open/wrt/staging_dir/host/bin/ninja  -j1 -C /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/build
ninja: Entering directory `/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/build'
[44/428] Building CXX object lib/tgchat/CMakeFiles/tgchat.dir/src/tgchat.cpp.o
FAILED: lib/tgchat/CMakeFiles/tgchat.dir/src/tgchat.cpp.o
/home/open/wrt/staging_dir/host/bin/ccache /home/open/wrt/staging_dir/toolchain-aarch64_generic_gcc-12.3.0_musl/bin/aarch64-openwrt-linux-musl-g++ -Dtgchat_EXPORTS -I/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/lib/tgchat/../../ext/apathy -I/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/lib/tgchat/../common/src -I/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/lib/tgchat/../ncutil/src -I/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/lib/tgchat/ext/td -I/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/lib/tgchat/ext/td/td/generate/auto -I/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/lib/tgchat/ext/td/tdactor -I/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/lib/tgchat/ext/td/tdutils -I/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/build/lib/tgchat/ext/td/tdutils -I/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/lib/tgchat/ext/td/tdnet -I/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/lib/tgchat/ext/td/tddb -Os -pipe -mcpu=generic -fno-caller-saves -fno-plt -fhonour-copts -ffile-prefix-map=/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13=nchat-4.13 -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1 -Wl,-z,now -Wl,-z,relro -DNDEBUG -std=gnu++14 -fPIC -Wall -Wextra -Wpedantic -Wshadow -Wpointer-arith                        -Wcast-qual -Wno-missing-braces -Wswitch-default                        -Wunreachable-code -Wundef -Wuninitialized
             -Wcast-align -MD -MT lib/tgchat/CMakeFiles/tgchat.dir/src/tgchat.cpp.o -MF lib/tgchat/CMakeFiles/tgchat.dir/src/tgchat.cpp.o.d -o lib/tgchat/CMakeFiles/tgchat.dir/src/tgchat.cpp.o -c /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/lib/tgchat/src/tgchat.cpp
In file included from /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/lib/tgchat/src/tgchat.cpp:20:
/home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/lib/tgchat/ext/td/td/telegram/Client.h:11:10: fatal error: td/telegram/td_api.h: No such file or directory
   11 | #include "td/telegram/td_api.h"
      |          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
ninja: build stopped: subcommand failed.
make[2]: *** [Makefile:43: /home/open/wrt/build_dir/target-aarch64_generic_musl/nchat-4.13/.built] Error 1
make[2]: Leaving directory '/home/open/wrt/package/nchat'
time: package/nchat/compile#3.30#1.63#5.80
    ERROR: package/nchat failed to build.
make[1]: *** [package/Makefile:128: package/nchat/compile] Error 1
make[1]: Leaving directory '/home/open/wrt'
make: *** [/home/open/wrt/include/toplevel.mk:225: package/nchat/compile] Error 2
open@localhost:~/wrt$
d99kris commented 6 months ago

Thanks for sharing the details! Seems it's not entirely straight-forward to cross-compile after all. One issue is that tdlib (Telegram) needs some native/host code generation before building for target platform. Also whatsmeow (WhatsApp) being implemented in Go, might require some special CMakeLists.txt changes.

I think I'll need to leave cross compilation out of scope for the nchat project, so I'll close this bug.

If you still want to take a stab at building it, I imagine it might be possible to do something along these lines:

cd ~/nchat
cd lib/tgchat/ext/td
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . --target prepare_cross_compiling
cd ~/nchat
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=$HOME/MyToolchain.cmake -DCMAKE_C_COMPILER_FORCED=1 -DCMAKE_CXX_COMPILER_FORCED=1 ..
make

I haven't tested it though, so it might not work.