Rust - cross compile

 ( hg2ecz | 2018. augusztus 20., hétfő - 19:34 )

$ rustc -O teszt.rs  # adott vasra fordít (esetemben x86_64)
$ cargo build --release # adott vasra fordít (esetemben x86_64)

$ rustc --print target-list     # milyen targetekre képes fordítani ?

$ sudo apt install gcc-arm-linux-gnueabihf
$ rustup target add armv7-unknown-linux-gnueabihf

$ cat >> ~/.cargo/config <<EOF
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
EOF

$ cargo build --release --target=armv7-unknown-linux-gnueabihf
$ file target/armv7-unknown-linux-gnueabihf/release/teszt
target/armv7-unknown-linux-gnueabihf/release/teszt: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=8c314f3d9f2237c3267621021f52390244ca8e05, with debug_info, not stripped

$ cargo build --release
$ file target/release/teszt
target/release/teszt: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=ed7fa8d8418803bb7303e9f5f243fb451f9484c4, with debug_info, not stripped

Update:

Ha már szereztem a hozzászólások között levő Windows-os fordítási probléma miatt egy Windows-os géphez hozzáférést, egyúttal megnézem, tudok-e rá fordítani Linuxból?

$ sudo apt install gcc-mingw-w64
$ rustup target add x86_64-pc-windows-gnu
$ cat >> ~/.cargo/config <<EOF
[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"
EOF
$ cargo build --release --target=x86_64-pc-windows-gnu

$ file target/x86_64-pc-windows-gnu/release/teszt.exe 
target/x86_64-pc-windows-gnu/release/teszt.exe: PE32+ executable (console) x86-64, for MS Windows

És tényleg lefut Windows-on.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Egyszer akartam valamit lefordítani amit ebben a szar Rustban írtak, de egy téboly...
Rustot felraktam, de a kód nem fordul, mert valami crates kiegészítő kellet neki.
Oké, tegyük fel. Persze a bánat tudja hogy kell. Valamit aztán sikerűt találni ami elvileg feltenné, de az meg a VS Basic mitom én milyen komponensét hiányolja.
Na ezen a ponton azt mondtam, hogy a faszom rak fel 1 Gb cuccot azért, hogy egy 100 KByte-os kódot lefordítsak!

És akkor ráadásul egy 64 bites rendszeren kellet volna 32 bites rendszerre fordítanom, ami kitudja még milyen komplikációkat okozna...

cargo lerántja a crate-kat, amik a Cargo.toml [dependencies] részében vannak felsorolva.
Lásd: https://doc.rust-lang.org/cargo/guide/dependencies.html

Kezdetben én is rustc + Makefile módon álltam neki, az tényleg kínszenvedés. Rust-hoz cargo való, Makefile helyett Cargo.toml illetve ha nem elég, akkor további build.rs
Ez utóbbit akkor használtam legutóbb, amikor C-ben írt LIB-et akartam egyszerű módon "cargo build --release" paranccsal lefordíthatóvá tenni és az így kapott LIB-et egyúttal a Rust-ban írt progi alá illeszteni.

Valami olyasmivel próbálkoztam, de:

cargo install crates
Updating registry `https://github.com/rust-lang/crates.io-index`
Downloading crates v0.0.1
Installing crates v0.0.1
Compiling crates v0.0.1
error: linker `link.exe` not found
|
= note: The system cannot find the file specified. (os error 2)

note: the msvc targets depend on the msvc linker but `link.exe` was not found

note: please ensure that VS 2013 or VS 2015 was installed with the Visual C++ option

A "cargo install <crate>" mást csinál. Ez akkor használható, ha a crate nem LIB, hanem main()-t trartalmazó segédprogram. Például: cargo install ripgrep és utána a ~/.cargo/bin/-ben ott a segédprogram:

$ ~/.cargo/bin/rg --help
ripgrep 0.9.0
...

Ami téged érint, egy rövid példán bemutatom, aholis dátumot írunk ki "time" nevű crate segítségével:

$ cat Cargo.toml 
[package]
name = "teszt"
version = "0.1.0"
authors = ["Zsolt"]

[dependencies]
time = "0.1.*"


$ cat src/main.rs 
extern crate time;

fn main() {
    let lt = time::now();
    println!("hónap-nap: {:02}-{:02}", lt.tm_mon+1, lt.tm_mday);
}

És ezt simán a cargo build paranccsal le tudod fordítani. A szükséges crate-t (time) a [dependencies] alapján fordításkor automatikusan lerántja. Próbáld ki.

Na ezt írtam feljebb, hogy a Visual C++ valamijét hiányolja:

cargo build
Updating registry `https://github.com/rust-lang/crates.io-index`
Compiling winapi v0.3.5
Compiling libc v0.2.43
error: linker `link.exe` not found
|
= note: The system cannot find the file specified. (os error 2)

note: the msvc targets depend on the msvc linker but `link.exe` was not found

note: please ensure that VS 2013 or VS 2015 was installed with the Visual C++ option

error: aborting due to previous error

error: Could not compile `winapi`.

Ami egyébként fent van, csak most a franc tudja mit kellene még feltenni, hogy teljes legyen.
És ezért nem éri meg egy 100 Kbbyt-os progiért szarozni látod!
A te idő kiíratód sem működik csak úgy mint ha egy mezei C# forrást kellene fordítani.

Furi, nálam nincs fent Visual C++ és hasonló extrák, csak a Rust fordítója, amit innen telepítettem: https://www.rust-lang.org/en-US/install.html
Ezzel szépen fordul. Igaz, Linuxon ... de ha lesz Windows a közelemben, akkor kíváncsiságból ott is megnézem.

Windowsra telepítésnél már egyből ezzel indul a dolog:

Rust requires the Microsoft C++ build tools for Visual Studio 2013 or later,
but they don't seem to be installed.

The easiest way to acquire the build tools is by installing Microsoft Visual
C++ Build Tools 2017 which provides just the Visual C++ build tools:

https://aka.ms/buildtools

Alternately, you can install Visual Studio 2015 or Visual Studio 2013 and
during install select the "C++ tools":

https://www.visualstudio.com/downloads/

Install the C++ build tools before proceeding.

If you will be targeting the GNU ABI or otherwise know what you are doing then
it is fine to continue installation without the build tools, but otherwise,
install the C++ build tools before proceeding.

Continue? (Y/n)

Annó réges-régen szakítottam a Windows világával. A fentiek láttán még nem jött el a pillanat, hogy visszatérjek.
Viszont kipróbáltam és itt a megoldás: mindössze annyi, hogy nincs útvonalba téve a Visual C++-ban a link.exe

http://hg2ecz.ham.hu/forumkep/rust-windows.gif

Csak bizonyiteknak masoltam be, hogy valoban kell neki a Visual C++ winen. Nekem semmi problemam vele, de azert koszi!

Abszolút nincs link.exe file a gépemen.
Nézegettem a Visual C++ build tools installert, de akárhogy faragom, 1.60 Gb-ot akar feltenni!

Itt tart ma program fejlesztés!

Én a minap írtam assemblyben egy ugrálós játékot ami elfért 240 byte-ban!
Ehhez képest egy mai nyomorult program fordításához gigabyte-ok kellenek.

Röhej az egész komolyan!

Hát, ha nagyon nem adja magát, akkor VirtualBox és egy minimális Debian (netinst) vagy Ubuntu.
ftp://ftp.fsn.hu/pub/CDROM-Images/
Itt egy minimális Debian, ahol az alapon kívül "apt install curl gcc" kellett, továbbá a Rust honlapon található curl-os szkript userként való lefuttatása. Innentől a Cargo.toml és src/main.rs felrakása után már lefuttatható az alábbi:

http://hg2ecz.ham.hu/forumkep/rust-linux.gif

Megjegyzem, a Rust honlapon levő curl-os szkript Raspberry-n és a többi linuxos SBC-n is lefuttatható. Azokon is ugyanígy feltelepül a rust és cargo. Egyedül a curl és a gcc megléte a lényeg, ami ha hiányzik, a csomagkezelőből (apt, yum, ...) könnyen felrakható.

Az rendben, hogy Linuxon nem kell neki sok minden, de hogy Winre Gb-okat kell feltenni, az röhej.
Oké, biztos lehetne valami kiherélt Visual C++-t feltenni, ami pár Mb, de azért nem éri meg foglalkozni vele, hogy fél évente lefordítsak valamit, mert még csak nem is saját kód fordításához kellene.
Mondjuk nem fogom megúszni, mert kell majd a 32 bites bináris, WinXP-re, de most legkorábban is csak jövőre.. Addig ráérek egy Visual C++-t faragi alá :D

Hát ezen már csak röhögni tudok!
Feltettem a Rustot WSL-be is.
Azóta ha elindítom a WSL-t, ez fogad:

Error: 0x800704c8
Press any key to continue...

Aztán be is zárja a WSL-t.

Szal oké, maradok a C#-nál és az assemblynél és hasonló értelmes nyelveknél.

De mi a tökömnek tetted fel WSL-be?
Visual Studio Community letölt, C++ build tools telepít, Rust telepít, cargo build (vagy rustc akarmi.rs) --> örül

Szerk.: Ja hogy neked nem exe kell...sorry. :(

De, exe kell! Csak ki akartam próbálni WSL alatt mennyire szívás, de ezek szerint ott is az :D

Noh, a lényeg, amit szeretnék:
Van egy progi amiből csak 64 bites bináris (exe) tölthető le, de publikus a forráskód is, ami Rust-ban van írva.
Én ezt a progit Windows XP-n szeretném futtatni, tehát 32 bitre kellene fordítanom (64 bites Windows 10 alatt)

De nemhogy 32 bitre, de még simán lefordítani sem tudom.
Mindegy, hétvégére kellet volna, most már nem sürgős. Majd eltökölök a VSC-vel.
Csak kiba zavaró, hogy ezer millió könyvtárat, kiegészítőt meg a tökömtudja mit le kell tölteni, hogy egy egyszerű progi fordítható legyen.