Christian Ullrich
2018-Mar-04 17:29 UTC
"Cross" building for same architecture, different CPUTYPE
Hello, I'm trying to buildworld/buildkernel of stable/11 r330373 for an Intel Atom CPU (CPUTYPE=slm) on a (slightly faster, CPUTYPE=core-avx2) build machine. That works fine, but make installkernel on the Atom box fails with a SIGILL (signal 4) in the "install" command (sorry, no log or screenshot). As far as I can tell, this is because installkernel uses the install from ...obj.../tmp/legacy/usr/bin, which is built for the host. Disassembling the binary shows that it uses AVX opcodes. The "main" part of the build output correctly respects the CPUTYPE override. I suppose I'm doing something wrong here, but what? It must be possible to build for a different CPU of the same family, right? I even tried running a cross build (TARGET=amd64 TARGET_ARCH=amd64), but since the build host _is_ amd64, the Makefiles laughed at me and only did the normal build. The command that did not work was: MAKEOBJDIRPREFIX=/usr/obj/slm make CPUTYPE=slm buildworld buildkernel I have CPUTYPE?=core-avx2 in make.conf, but that should be irrelevant here. Thanks for any hints. -- Christian
Dimitry Andric
2018-Mar-04 17:43 UTC
"Cross" building for same architecture, different CPUTYPE
On 4 Mar 2018, at 18:29, Christian Ullrich <chris at chrullrich.net> wrote:> > I'm trying to buildworld/buildkernel of stable/11 r330373 for an Intel Atom CPU (CPUTYPE=slm) on a (slightly faster, CPUTYPE=core-avx2) build machine. That works fine, but make installkernel on the Atom box fails with a SIGILL (signal 4) in the "install" command (sorry, no log or screenshot). > > As far as I can tell, this is because installkernel uses the install from ...obj.../tmp/legacy/usr/bin, which is built for the host. Disassembling the binary shows that it uses AVX opcodes. The "main" part of the build output correctly respects the CPUTYPE override.How are you overriding? As far as I know, the bootstrap-tools are built using NO_CPU_CFLAGS, which disables any cpu-specific CFLAGS. However, this does not work in two cases: 1) If you assign CPUTYPE with = instead of ?= (in make.conf or src.conf) 2) If you set -march= flags in CFLAGS directly With 1), if you specify CPUTYPE= as a variable directly on the make command line, it will effectively disable NO_CPU_CFLAGS.> I suppose I'm doing something wrong here, but what? It must be possible to build for a different CPU of the same family, right? I even tried running a cross build (TARGET=amd64 TARGET_ARCH=amd64), but since the build host _is_ amd64, the Makefiles laughed at me and only did the normal build. > > The command that did not work was: > > MAKEOBJDIRPREFIX=/usr/obj/slm make CPUTYPE=slm buildworld buildkernel > > I have CPUTYPE?=core-avx2 in make.conf, but that should be irrelevant here.Actually, that *is* relevant for the stages after bootstrap-tools, build-tools and cross-tools. E.g. 4.x and later. Again, this depends on how exactly you are overriding CPUTYPE. -Dimitry -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 223 bytes Desc: Message signed with OpenPGP URL: <http://lists.freebsd.org/pipermail/freebsd-stable/attachments/20180304/43b1c508/attachment.sig>