Re: Cross compiling user applications for armv7
Mark Millard <[email protected]>
| Newsgroups | gmane.os.freebsd.devel.arm |
|---|---|
| Message-ID | <[email protected]> |
[Adding a note and fixing a bad edit.] On Sep 13, 2025, at 13:31, Mark Millard <[email protected]> wrote: > On Sep 13, 2025, at 09:45, Michał Kruszewski <[email protected]> wrote: > >> Ok, let's start from the beginning because I feel a little bit lost. >> The buildenv concept is ok when you have no dependencies. >> However, I have. >> >> I see 3 potential options. >> 1. Use arm64 as an intermediate platform. >> This is unacceptable approach for me. >> 2. Setup poudriere for armv7 manually. >> I tried for 2 days and simply failed. >> 3. Setup qemu, and install dependencies and build custom code inside VM. >> >> Solutions 2 and 3 are acceptable for me. >> I guess 2 is better than 3, as it should be more performant. >> However, I have no idea how to implement idea 2 or 3 in practice. >> >> I also don't understand why setting up poudriere for armv7 is so hard. >> What is missing by default that I can't do it with a single command? >> Why the things that are missing are so hard to recreate manually? >> >> Regards, >> Michał Kruszewski >> >> >> Sent with Proton Mail secure email. >> >> On Saturday, September 13th, 2025 at 6:09 PM, Warner Losh <[email protected]> wrote: >>> >>> >>> On Sat, Sep 13, 2025 at 9:50 AM Michał Kruszewski <[email protected]> wrote: >>> It is more about how hard it is to setup an environment for cross compiling your own kernel modules or applications for armv7. >>> I don't really care whether I use Buildroot way of doing things or FreeBSD way. > . . . > > Ahh. Okay. I read too much into some of your > wording. > > I do not know what all you need to build. That > may prove critical for you. > > My boot context for amd64 is main 16 at this point, > so the below is based on that. I'm using pkgbase > via poudriere here, pkgbase only exists for FreeBSD > 14+ . > > Here is what I just tried for poudriere on amd64. But, > in the end, it got hung up at the end of my test bulk > run with a bunch of: > > /usr/local/bin/qemu-arm-static /.p/pkg-static repo -o /tmp/packages /packages{qemu-arm-static} > > all stuck in STATE uwait, with the system 99.9% to > 100% idle. The last status message was: > > Packing files for repository: 0% > > It stayed that way for over 40 minutes before > I ^C'd the run. > > You might have better results with a 14.3-RELEASE or > some such. I do not have an appropriate context > set up for that experiment. main 16 as a context > does not seem appropriate. > > > What I recoded as I tried, showing steps used . . . > > There is: > > emulators/qemu-user-static-devel > and: > emulators/qemu-user-static > > But: > > https://portsfallout.com/fallout?port=qemu-user-static&maintainer=&env=&category=&flavor= > > shows emulators/qemu-user-static-devel fails to build on > main (16 and older 15). (That matched my build attempt, > as my boot context is main based. My detailed failure > got: "ld: error: undefined symbol: __realpathat". ) > > I was going to try it because, for emulators/qemu-user-static , > > https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=221185 > > reported at 2017-08-02 19:14 UTC is still is active and has a > 2024-12-09 16:01:45 UTC report confirming the still-then-true > status of the inability to build lang/rust . (Comments > 6, 13, 23 mention armv7 status. But aarch64 is at issue > as well.) > > So I've built: emulators/qemu-user-static > > You may be able to use official port-package > installation. Such does not exist for amd64 > main 16 yet, so I'm doing my own builds. > > So my steps below are based on use of that > emulators/qemu-user-static : > > Get to the point that you can do the likes of: > > # pkg install qemu-user-static > pkg: Warning: Major OS version upgrade detected. Running "pkg bootstrap -f" recommended > Updating FreeBSD-base repository catalogue... > Fetching data.pkg: 100% 53 KiB 54.1kB/s 00:01 > Processing entries: 100% > FreeBSD-base repository update completed. 470 packages processed. > Updating main-amd64-default repository catalogue... > Fetching meta.conf: 100% 179 B 0.2kB/s 00:01 > Fetching data.pkg: 100% 189 KiB 193.3kB/s 00:01 > Processing entries: 100% > main-amd64-default repository update completed. 561 packages processed. > All repositories are up to date. > Checking integrity... done (0 conflicting) > The following 1 package(s) will be affected (of 0 checked): > > New packages to be INSTALLED: > qemu-user-static: 3.1.0_15 [main-amd64-default] > > Number of packages to be installed: 1 > > The process will require 74 MiB more space. > > Proceed with this action? [y/N]: y > [1/1] Installing qemu-user-static-3.1.0_15... > [1/1] Extracting qemu-user-static-3.1.0_15: 100% Note: As I remember, running binmiscctlwas required as it sets things up the first time. Thus the below was more than informational, despite my not reporting that at the time. > # binmiscctl list > . . . > name: armv7 > interpreter: /usr/local/bin/qemu-arm-static > flags: ENABLED USE_MASK > magic size: 20 > magic offset: 0 > magic: 0x7f 0x45 0x4c 0x46 0x01 0x01 0x01 0x00 0x00 0x00 0x00 0x00 > 0x00 0x00 0x00 0x00 0x02 0x00 0x28 0x00 > mask: 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x00 0xff 0xff 0xff 0xff > 0xff 0xff 0xff 0xff 0xfe 0xff 0xff 0xff > . . . > > Note: Some details of the below command are specific to targeting > main 16 for armv7. > > # poudriere jail -c -jmain-armv7-qemu -aarmv7 -U https://pkg.freebsd.org -mpkgbase=base_latest -v 16 > [00:00:00] Cross-building ports for armv7 on amd64 requires QEMU > [00:00:00] Creating main-armv7-qemu fs at /usr/local/poudriere/jails/main-armv7-qemu... done > . . . > [00:01:34] Recording filesystem state for clean... done > [00:01:34] Jail main-armv7-qemu 16.0-CURRENT armv7 is ready to be used > > main 16 does not yet have a populated FreeBSD-ports* so I've been > editing the likes of (here): > > /usr/local/poudriere/jails/main-armv7-qemu/etc/pkg/FreeBSD.conf > > to indicate "enabled: no" for FreeBSD-ports and FreeBSD-ports*-kmods. > > Note: I picked to build poudriere-devel below only because it > is simple/small. > > # poudriere bulk -jmain-armv7-qemu ports-mgmt/poudriere-devel > [00:00:00] Cross-building ports for armv7 on amd64 requires QEMU > [00:00:00] Creating the reference jail... done > [00:00:01] Mounting system devices for main-armv7-qemu-default > [00:00:01] Converting package repository to new format > [00:00:01] Stashing existing package repository > [00:00:01] Mounting ports from: /usr/ports > [00:00:01] Mounting packages from: /usr/local/poudriere/data/packages/main-armv7-qemu-default > [00:00:01] Mounting distfiles from: /usr/ports/distfiles > [00:00:01] Copying /var/db/ports from: /usr/local/etc/poudriere.d/options > [00:00:01] Raising MAX_EXECUTION_TIME and NOHANG_TIME for QEMU from QEMU_ values > [00:00:01] Copying latest version of the emulator from: /usr/local/bin/qemu-arm-static > [00:00:01] Appending to make.conf: /usr/local/etc/poudriere.d/default-make.conf > [00:00:01] Warning: DEVELOPER=yes ignored from make.conf. Use 'bulk -t' or 'testport' for testing instead. > /etc/resolv.conf -> /usr/local/poudriere/data/.m/main-armv7-qemu-default/ref/etc/resolv.conf > [00:00:01] Starting jail main-armv7-qemu-default > Updating /var/run/os-release done. > [00:00:02] Will build as root:wheel (0:0) > [00:00:19] Ports supports: FLAVORS SUBPACKAGES SELECTED_OPTIONS > [00:00:19] Inspecting /usr/local/poudriere/data/.m/main-armv7-qemu-default/ref//usr/ports for modifications to git checkout... yes > [00:00:19] Ports top-level git hash: 7e86a0d71167 (dirty) > [00:00:19] Acquiring build logs lock for main-armv7-qemu-default... done > [00:00:19] Logs: /usr/local/poudriere/data/logs/bulk/main-armv7-qemu-default/2025-09-13_12h09m03s > [00:00:19] Loading MOVED for /usr/local/poudriere/data/.m/main-armv7-qemu-default/ref/usr/ports > [00:00:20] Gathering ports metadata > [00:00:20] Calculating ports order and dependencies > [00:00:20] Sanity checking the repository > [00:00:20] Trimming IGNORED and blacklisted ports > [00:00:20] pkg bootstrap missing: unable to inspect existing packages, cleaning all packages... done > [00:00:20] Deleting stale symlinks... done > [00:00:20] Deleting empty directories... done > [00:00:20] Unqueueing existing packages > [00:00:20] Unqueueing orphaned build dependencies > [00:00:20] Sanity checking build queue > [00:00:20] [main-armv7-qemu-default] [2025-09-13_12h09m03s] [pkgqueue_sanity_check] Time: 00:00:01 > Queued: 5 Inspected: 0 Ignored: 0 Built: 0 Failed: 0 Skipped: 0 Fetched: 0 Remaining: 5 > [00:00:20] Recording filesystem state for prepkg... done > [00:00:20] Processing PRIORITY_BOOST > [00:00:20] Building 5 packages using up to 5 builders > [00:00:20] Hit CTRL+t at any time to see build progress and stats > [00:00:20] [01] [00:00:00] Builder starting > [00:00:20] [01] [00:00:00] Builder started > [00:00:20] [01] [00:00:00] Building ports-mgmt/pkg | pkg-2.3.1 > [00:10:07] [01] [00:09:47] Finished ports-mgmt/pkg | pkg-2.3.1: Success > . . . > [00:12:08] Stopping 5 builders > [00:12:08] Creating pkg repository > pkg-static: Both ABI_FILE and OSVERSION are set, ABI_FILE overrides OSVERSION > pkg-static: Warning: Major OS version upgrade detected. Running "pkg bootstrap -f" recommended > Creating repository in /tmp/packages: 100% > Packing files for repository: 0% > > > At this point it hung up as described earlier: STATE uwait > for a bunch of: > > /usr/local/bin/qemu-arm-static /.p/pkg-static repo -o /tmp/packages /packages{qemu-arm-static} > > > NOTE: main 16 can not yet "pkg bootstrap -f" as there > is no upstream FreeBSD-ports distributed yet. > > > Note: My history with use of amd64 for cross builds targeting armv7 The above "cross builds" should not be there: Note: My history with use of amd64 for targeting armv7 > and aarch64 and powerpc* families cross builds via > poudriere-devel is many, many years old now, starting back in > 2017 and going through mid-May of 2020, at which point my > interactions with Kyle Evans on the subject stopped as I was > no longer contributing. The above sort of result does not > seem surprising based on that old experience for armv7 and > aarch64. My views are most definitely "based on [my] > experience", but other than the above attempt today are > based on very old information, for sure. > === Mark Millard marklmi at yahoo.com