New progress update.

I got stage 1 and 2 to build together(!) in just 2 hours. As before,
stage 2 compiler seems to be copied.

I was unable to use the stage 1 compiler to link aarch64 binaries, I
got:

ld: error: relocation R_AARCH64_ABS64 cannot be used against local symbol; 
recompile with -fPIC

When I reran with -v3, I manually ran each command it showed, and it
failed at the link stage with:

ld.lld: error: can't create dynamic relocation R_AARCH64_ABS64 against local 
symbol in readonly segment; recompile object files with -fPIC or pass 
'-Wl,-z,notext' to allow text relocations in the output

I could see the commands contained -fno-PIC, but rerunning the commands
with -fPIC didn't work, so I added -Wl,-z,notext to them, and that
got rid of the errors, but when I tried to run the command on my
OpenBSD/arm64 VM, I got (whether run from $HOME or /usr/local/bin):

Trace/BPT trap (core dumped)

Running via lld, I get:

openbsd-arm64-host$ lldb /usr/local/bin/hello                                   
       
(lldb) target create "/usr/local/bin/hello"
Current executable set to '/usr/local/bin/hello' (aarch64).
(lldb) run
Process 65280 launched: '/usr/local/bin/hello' (aarch64)
Process 65280 stopped
* thread #1, stop reason = signal SIGTRAP
    frame #0: 0x00000007234d8040 hello`StgRun + 204
hello`StgRun:
->  0x7234d8040 <+204>: brk    #0x1
    0x7234d8044 <+208>: ret    

hello`__word_encodeDouble:
    0x7234d8048 <+0>:   bti    c
    0x7234d804c <+4>:   adrp   x15, 89

I haven't yet figured out what to try next.

Cheers,
Habib

> On 10 Nov 2024, at 18:26, ⁨حبيب محمد الأمين محمد الهـاد⁩ 
> <⁨ha.ala...@gmail.com⁩> wrote:
> 
> Okay, I kept putting this off because I wanted to upgrade to 7.6 on
> a real machine I have and set up the prerequisites there instead of
> rerunning a fresh build on a VM (or even a warm build), in case I have
> to keep doing so, because the VM is slooow (and I was ill).
> 
> (The reason I initially did this on a VM is because I don't like
> juggling between two machines, and the WiFi dongle on that machine is
> really flakey, probably due to overheating, so SSH constantly drops out,
> and I have to go and remove it and put it back in, it's just an annoying
> machine to work with.)
> 
> Anyway, I've now set up the same prerequisites on that machine and am
> currently running Hadrian to build the stage 2 compiler with all the
> right arguments (including the nobtcfi thing, but more importantly
> no-execute-only; I don't know if nobtcfi is necessary, but if I get
> this working, someone else can bother trying to reproduce and remove
> any unnecessary arguments or other dirty hacky parts of my build
> instructions). I have to wait for it to build stage 1 first, but since
> I'm requesting stage 2, it should just build the two stages one after
> the other.
> 
> Cheers,
> Habib
> 
>> On 4 Nov 2024, at 20:54, Habib Alamin <ha.ala...@gmail.com> wrote:
>> 
>> Yeah, maybe. I don’t recall if that copy line is defined in a flavour.
>> 
>> Apologies, I completely forgot about this when I got back to my laptop.
>> I’ll work on it tomorrow hopefully.
>> 
>> That said, I've been ill lately and I got much worse today, so it might
>> be a few days before I can seriously look at this again.
>> 
>> Sent from my iPhone
>> 
>>> On 4 Nov 2024, at 2:53 pm, Greg Steuck <g...@nest.cx> wrote:
>>> 
>>> 
>>> Quick pointer about xonly: https://www.openbsd.org/papers/csw2023.pdf
>>> 
>>> I doubt flavors will help much other than affect how long you wait.
>>> 
>>> 
>>> On Mon, Nov 4, 2024, 04:15 Habib Alamin <ha.ala...@gmail.com 
>>> <mailto:ha.ala...@gmail.com>> wrote:
>>>> I did run it with v3, I think, but didn’t glean much, but then I’m no 
>>>> expert on compilation and linking and the like.
>>>> 
>>>> That said, when I tried to compile via LLVM to get around the default 
>>>> codegen, it lacked an aarch64-unknown-openbsd “data layout” (but curiously 
>>>> had an aarch64-unknown-netbsd). I think I added it now, but I kinda burnt 
>>>> out, and that one day break turned into a few days. I suppose I have to 
>>>> recompile stage 1 to use the new data layout (which I think I did in the 
>>>> background the other day, with the old build directory just moved aside).
>>>> 
>>>> Ah, I was looking at the amd64 port and wondering what part could be 
>>>> relevant. Is the --no-execute-only related to W^X feature on OpenBSD?
>>>> 
>>>> I think you may be on to something. Im a little busy at the moment, but 
>>>> I’ll update in a couple hours.
>>>> 
>>>> This doesn’t explain why a copy of the stage 1 binary gets copied to the 
>>>> stage 2 bin folder (I diffed it after I sent my previous email, they’re 
>>>> identical, despite, as mentioned, all the object files being aarch64).
>>>> 
>>>> Removing that line causes the stage 2 build to not even start from what I 
>>>> recall, and I tried building stage 3, and it’s the same thing.
>>>> 
>>>> But hopefully, this’ll solve the segfault and put me on a better path. I 
>>>> wonder if choosing a flavour other than quickest might also result in an 
>>>> aarch64 stage 2 GHC binary?
>>>> 
>>>> Sent from my iPhone
>>>> 
>>>>> On 2 Nov 2024, at 11:22 pm, Greg Steuck <g...@nest.cx 
>>>>> <mailto:g...@nest.cx>> wrote:
>>>>> 
>>>>> 
>>>>> You seem to have made it pretty far through the build if you already have 
>>>>> a functional cross-compiler. Maybe you'll get a clue where things go off 
>>>>> the rails in your hello-world if you run that cross ghc with enough -v's 
>>>>> to see what happens?
>>>>> 
>>>>> While it's possible that OpenBSD arm64 is special in ways that include 
>>>>> more than just the combination of arm64 on other platforms and OpenBSD on 
>>>>> x86, it's not very likely. Still these two are important setting in 
>>>>> lang/ghc:
>>>>> * USE_NOEXECONLY
>>>>> * USE_NOBTCFI
>>>>> 
>>>>> Both are in set in the x86 port and are also specified with 
>>>>> GHC_CC_OPTS = -Wl,--no-execute-only -Qunused-arguments -Wl,-z,nobtcfi
>>>>> CONFIGURE_ENV += CONF_GCC_LINKER_OPTS_STAGE0="${GHC_CC_OPTS}" \
>>>>> CONF_GCC_LINKER_OPTS_STAGE1="${GHC_CC_OPTS}" \
>>>>> CONF_GCC_LINKER_OPTS_STAGE2="${GHC_CC_OPTS}" \
>>>>> CONF_CC_OPTS_STAGE2="${GHC_CC_OPTS}"
>>>>> 
>>>>> If I were to guess, this instruction could be an indication that x-only 
>>>>> is in the way, try to print its value and see how this memory is mapped.
>>>>> ->  0xa2c3a0 <+24>: ldur   w15, [x17, #-0x8]
>>>>> 
>>>>> If you are lucky, -Wl,--no-execute-only is all you need to produce a 
>>>>> working binary.
>>>>> 
>>>>> configure has a flagto take care of the x-only problem 
>>>>> --disable-tables-next-to-code. I don't set it in the port because ghc 
>>>>> test suite has some tests that are broken in this mode.
>>>>> 
>>>>> 
>>>>> ‪On Thu, Oct 31, 2024 at 6:12 AM ‫حبيب محمد الأمين محمد الهـاد‬‎ 
>>>>> <ha.ala...@gmail.com <mailto:ha.ala...@gmail.com>> wrote:‬
>>>>>> All the object files in the stage 2 build directory are aarch64, except
>>>>>> the GHC binary itself; now, I don't know why this happens, but this line
>>>>>> seems a little weird in hadrian/src/Rules/Program.hs:
>>>>>> 
>>>>>> -- For cross compiler, copy @stage0/bin/<pgm>@ to @stage1/bin/@.
>>>>>> 
>>>>>> Anyway, with the hello world program I mentioned I built using stage 1,
>>>>>> I ran it with LLDB in the OpenBSD/arm64 machine, and it segfaults here:
>>>>>> 
>>>>>> (lldb) run
>>>>>> Process 66875 launched: '/home/habib/hello' (aarch64)
>>>>>> Process 66875 stopped
>>>>>> * thread #1, stop reason = signal SIGSEGV
>>>>>>     frame #0: 0x0000000000a2c3a0 hello`stg_enter_info + 24
>>>>>> hello`stg_enter_info:
>>>>>> ->  0xa2c3a0 <+24>: ldur   w15, [x17, #-0x8]
>>>>>>     0xa2c3a4 <+28>: sxtw   x15, w15
>>>>>>     0xa2c3a8 <+32>: mov    x14, #0x1a
>>>>>>     0xa2c3ac <+36>: cmp    x15, x14
>>>>>> (lldb)
>>>>>> 
>>>>>> I saw an old ticket for macOS where it errors on the line before the
>>>>>> ldur (which you can't see here), because it accesses the reserved x18
>>>>>> register, so I thought maybe something similar is going on with OpenBSD
>>>>>> where,
>>>>>> 
>>>>>> due to GHC not yet having tested or even specifically designed for, the
>>>>>> OpenBSD/arm64 compilation target, maybe there's some OpenBSD-specific
>>>>>> thing that hasn't been accounted for that the OpenBSD devs know about.
>>>>>> 
>>>>>> If an OpenBSD dev wants to look at it, I can send the binary or an
>>>>>> assembly dump of it as an attachment, however you want. I can then let
>>>>>> the GHC developers know where their aarch64 output is wrong for OpenBSD.
>>>>>> 
>>>>>> I'll try using the LLVM backend to compile the hello world program,
>>>>>> since that obviously supports OpenBSD/arm64, so I don't see it
>>>>>> outputting incorrect assembly for a hello world program for that target.
>>>>>> 
>>>>>> I might or might not keep working on this today, but I'll try and get
>>>>>> back in with another progress update tomorrow evening.
>>>>>> 
>>>>>> Cheers,
>>>>>> Habib
>>>>>> 
>>>>>>> On 30 Oct 2024, at 12:53, ⁨حبيب محمد الأمين محمد الهـاد⁩ 
>>>>>>> <⁨ha.ala...@gmail.com <mailto:ha.ala...@gmail.com>⁩> wrote:
>>>>>>> 
>>>>>>> Progress update: stage 2 compiler built, kind of, this morning after 7
>>>>>>> hours overnight. It turns out it built an amd64 binary.
>>>>>>> 
>>>>>>> Note: use --with-intree-gmp. Also, it by default doesn't find
>>>>>>> libiconv, not even the version installed in the amd64 system;
>>>>>>> anyway, I just pointed it to the one in the aarch64 sysroot using
>>>>>>> --with-libiconv-{includes,libraries}, and that worked (so I don't even
>>>>>>> understand how it built an amd64 binary).
>>>>>>> 
>>>>>>> Okay, but the build system built the libraries for stage 1 as a
>>>>>>> dependency of this so that the stage 1 compiler could actually run, so
>>>>>>> I was able to manually compile a hello world program with it this time
>>>>>>> without a missing Prelude — passing in --target= to -opta, -optc,
>>>>>>> -optl, and --sysroot to one of them as well — and I saw that it was an
>>>>>>> aarch64 binary.
>>>>>>> 
>>>>>>> I'm sure I'm passing the same arguments to the build of the stage 2
>>>>>>> compiler, but knowing the build system, I'm sure there's some place
>>>>>>> where it's getting missed. Still, it can't be a mixture of aarch64 and
>>>>>>> amd64, so I need to figure out what's going on, because a lot of stuff
>>>>>>> was complaining about not finding the sysroot and I'd fix that, or the
>>>>>>> assembler wasn't understanding the instructions, so I specified to the
>>>>>>> assembler that it's aarch64, and that fixed it, etc.
>>>>>>> 
>>>>>>> Anyway, when I scp'd that hello world binary to the OpenBSD/arm64 system
>>>>>>> I took the sysroot from and ran it, it segfaulted.
>>>>>>> 
>>>>>>> Cheers,
>>>>>>> Habib
>>>>>>> 
>>>>>>>> On 29 Oct 2024, at 18:29, ⁨حبيب محمد الأمين محمد الهـاد⁩ 
>>>>>>>> <⁨ha.ala...@gmail.com <mailto:ha.ala...@gmail.com>⁩> wrote:
>>>>>>>> 
>>>>>>>> Just a correction to my previous message. I meant sigevent, not
>>>>>>>> timer_create; the timer_* stuff was just warnings, what's really 
>>>>>>>> missing
>>>>>>>> is struct sigevent, which seems to usually be defined in signal.h,
>>>>>>>> including in FreeBSD.
>>>>>>>> 
>>>>>>>> And it's not just header checking, the configure script actually checks
>>>>>>>> that a program with timer_create can compile and link, and it reports
>>>>>>>> yes (correctly), but can't run the test that it actually works (with
>>>>>>>> sigevent and everything plumbed in) when cross-compiling;
>>>>>>>> 
>>>>>>>> “checking for a working timer_create”, emphasis on “working”
>>>>>>>> doesn't show up in the config.log but does in the configure script 
>>>>>>>> where
>>>>>>>> it writes a test program with sigevent, and the configure script makes
>>>>>>>> it obvious that it can't run this test when cross-compiling.
>>>>>>>> 
>>>>>>>> It optimistically assumes that timer_create works with sigevent and
>>>>>>>> all that when cross-compiling… which it doesn't. So I guess GHC's
>>>>>>>> configure script needs to learn so it knows this when cross-compiling 
>>>>>>>> on
>>>>>>>> OpenBSD. I'll hack it for now to see if the build otherwise works.
>>>>>>>> 
>>>>>>>> Cheers,
>>>>>>>> Habib
>>>>>>>> 
>>>>>>>>> On 29 Oct 2024, at 14:49, ⁨حبيب محمد الأمين محمد الهـاد⁩ 
>>>>>>>>> <⁨ha.ala...@gmail.com <mailto:ha.ala...@gmail.com>⁩> wrote:
>>>>>>>>> 
>>>>>>>>> Thanks Greg. Yeah, I saw you mention that in the GitLab and attempted 
>>>>>>>>> it, but could not make heads or tails.
>>>>>>>>> 
>>>>>>>>> Anyway, my current obstacle is a lack of timer_create in OpenBSD. 
>>>>>>>>> There's fallback code, but the configure isn't recognising the 
>>>>>>>>> feature lack (maybe it's only checking the headers signal.h and 
>>>>>>>>> time.h which both exist, haven't dug in yet).
>>>>>>>>> 
>>>>>>>>> Cheers,
>>>>>>>>> Habib
>>>>>>>>> 
>>>>>>>>>> On 28 Oct 2024, at 18:36, Greg Steuck <g...@nest.cx 
>>>>>>>>>> <mailto:g...@nest.cx>> wrote:
>>>>>>>>>> 
>>>>>>>>>> Habib, I just wanted to tell you that I am following your progress, 
>>>>>>>>>> just don't have time yet to reproduce nor much insight to share. 
>>>>>>>>>> Thank you for digging into this, I know it's a hard slog.
>>>>>>>>>> 
>>>>>>>>>> One thing that occurred to me some time ago was to try comparing the 
>>>>>>>>>> runs upstream does in their working cross-environment to what we 
>>>>>>>>>> attempt. Their setup is heavily factored, so we can't easily extract 
>>>>>>>>>> the relevant command lines. Looking at their logs might be 
>>>>>>>>>> illuminating, also running the same environment under linux might 
>>>>>>>>>> help. None of it is easy or fun.
>>>>>>>>>> 
>>>>>>>>>> ‪On Sat, Oct 26, 2024 at 10:52 PM ‫حبيب محمد الأمين محمد الهـاد‬‎ 
>>>>>>>>>> <ha.ala...@gmail.com <mailto:ha.ala...@gmail.com>> wrote:‬
>>>>>>>>>>> Progress report:
>>>>>>>>>>> 
>>>>>>>>>>>   - I managed to build the C parts of rts through Hadrian. It proved
>>>>>>>>>>>     impossible to pass multiple options via LDFLAGS, as Hadrian 
>>>>>>>>>>> doesn't
>>>>>>>>>>>     allow spaces in arguments passed to tools. I fixed this with a
>>>>>>>>>>>     bin/clang-with-sysroot-env shim.
>>>>>>>>>>>   - There are some (C) libraries built without a Cabal file, like
>>>>>>>>>>>     libffi, and there seems to be no way to pass arguments through
>>>>>>>>>>>     Hadrian to control these builds.
>>>>>>>>>>>     - Using $CONF_GCC_LINKER_OPTS_STAGE{0,1,2} seems to work and 
>>>>>>>>>>> passes
>>>>>>>>>>>       through arguments with spaces to both rts and libffi; I had 
>>>>>>>>>>> tried
>>>>>>>>>>>       $CONF_LD_LINKER_OPTS_STAGE{0,1,2} before, but the compiler 
>>>>>>>>>>> binary
>>>>>>>>>>>       is called as a linker, so only the former arguments to 
>>>>>>>>>>> configure
>>>>>>>>>>>       work to control flags to the linker (even for Clang). Anyway,
>>>>>>>>>>>       I still seem to require the shim, despite it seeming to pass
>>>>>>>>>>>       arguments to rts, but whatever, it gets me past the libffi 
>>>>>>>>>>> build.
>>>>>>>>>>>   - To get any further than that, to compile libffi, I had to edit 
>>>>>>>>>>> the
>>>>>>>>>>>     Hadrian code directly (it's part of the GHC source tree).
>>>>>>>>>>> 
>>>>>>>>>>> I'm now working on getting the Haskell parts of rts to compile
>>>>>>>>>>> without “invalid instruction mnemonic” errors; so far,
>>>>>>>>>>> with some more arguments via Hadrian to GHC of the form
>>>>>>>>>>> -optl--host=aarch64-unknown-openbsd (and similar), I can get it to
>>>>>>>>>>> compile a little bit instead of blowing up with the errors straight
>>>>>>>>>>> away, but it does eventually spit out the same errors, just further
>>>>>>>>>>> along in the build.
>>>>>>>>>>> 
>>>>>>>>>>> Cheers,
>>>>>>>>>>> Habib
>>>>>>>>>>> 
>>>>>>>>>>>> On 25 Oct 2024, at 15:48, ⁨حبيب محمد الأمين محمد الهـاد⁩ 
>>>>>>>>>>>> <⁨ha.ala...@gmail.com <mailto:ha.ala...@gmail.com>⁩> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> For some reason, pretty much all the options aren't getting passed
>>>>>>>>>>>> through to cabal configure. These are the log messages for what
>>>>>>>>>>>> arguments get passed to cabal configure and ultimately to 
>>>>>>>>>>>> configure (rts
>>>>>>>>>>>> is the part of the build that fails with the missing libpthread 
>>>>>>>>>>>> and libm
>>>>>>>>>>>> I mentioned in my previous message):
>>>>>>>>>>>> 
>>>>>>>>>>>> # | Package 'rts' configuration flags: configure --distdir 
>>>>>>>>>>>> /home/habib/ghc-9.10.1/_build/stage1/rts 
>>>>>>>>>>>> --disable-executable-stripping --disable-library-stripping 
>>>>>>>>>>>> --disable-executable-stripping --disable-library-stripping 
>>>>>>>>>>>> --cabal-file rts/rts.cabal --ipid rts-1.0.2 --prefix ${pkgroot}/.. 
>>>>>>>>>>>> --htmldir ${pkgroot}/../../doc/html/libraries/rts-1.0.2 
>>>>>>>>>>>> --with-ghc=/home/habib/ghc-9.10.1/_build/stage0/bin/aarch64-unknown-openbsd-ghc
>>>>>>>>>>>>  
>>>>>>>>>>>> --with-ghc-pkg=/home/habib/ghc-9.10.1/_build/stage0/bin/aarch64-unknown-openbsd-ghc-pkg
>>>>>>>>>>>>  --with-gcc=clang --with-ar=/usr/local/bin/llvm-ar-13 
>>>>>>>>>>>> --ghc-option=-no-global-package-db 
>>>>>>>>>>>> --ghc-option=-package-db=/home/habib/ghc-9.10.1/_build/stage1/inplace/package.conf.d
>>>>>>>>>>>>  
>>>>>>>>>>>> --ghc-pkg-option=--global-package-db=/home/habib/ghc-9.10.1/_build/stage1/inplace/package.conf.d
>>>>>>>>>>>>  --enable-library-vanilla --disable-library-profiling 
>>>>>>>>>>>> --disable-library-for-ghci --disable-shared --with-ld=clang 
>>>>>>>>>>>> --with-alex=/usr/local/bin/alex --with-happy=/usr/local/bin/happy 
>>>>>>>>>>>> --configure-option=CFLAGS=-Qunused-arguments -iquote 
>>>>>>>>>>>> /home/habib/ghc-9.10.1/rts -Qunused-arguments 
>>>>>>>>>>>> --configure-option=LDFLAGS=--target=aarch64-unknown-openbsd 
>>>>>>>>>>>> --configure-option=--host=aarch64-unknown-openbsd 
>>>>>>>>>>>> --configure-option=--with-cc=clang 
>>>>>>>>>>>> --ghc-option=-ghcversion-file=rts/include/ghcversion.h 
>>>>>>>>>>>> --ghc-option=-ghcversion-file=rts/include/ghcversion.h 
>>>>>>>>>>>> --configure-option=LDFLAGS= --configure-option=CPPFLAGS= 
>>>>>>>>>>>> --extra-lib-dirs=/home/habib/ghc-9.10.1/aarch64-sysroot/usr/lib 
>>>>>>>>>>>> --extra-lib-dirs=/usr/lib 
>>>>>>>>>>>> --extra-include-dirs=/home/habib/ghc-9.10.1/aarch64-sysroot/usr/include
>>>>>>>>>>>>  --extra-include-dirs=/usr/include --ghc-option= --ghc-option= 
>>>>>>>>>>>> --ghc-option= --ghc-option= --ghc-option= -v3 --flags=-profiling 
>>>>>>>>>>>> -debug -dynamic threaded libm -librt -libdl -use-system-libffi 
>>>>>>>>>>>> libffi-adjustors need-pthread -libbfd -need-atomic -libdw -libnuma 
>>>>>>>>>>>> -libzstd -static-libzstd -leading-underscore -unregisterised 
>>>>>>>>>>>> tables-next-to-code -find-ptr -v2
>>>>>>>>>>>> […]
>>>>>>>>>>>> Running: /bin/sh //home/habib/ghc-9.10.1/rts/configure 
>>>>>>>>>>>> '--with-compiler=ghc' '--prefix=${pkgroot}/..' 
>>>>>>>>>>>> 'CFLAGS=-Qunused-arguments -iquote /home/habib/ghc-9.10.1/rts 
>>>>>>>>>>>> -Qunused-arguments' 'LDFLAGS=--target=aarch64-unknown-openbsd' 
>>>>>>>>>>>> '--host=aarch64-unknown-openbsd' '--with-cc=clang' 'LDFLAGS=' 
>>>>>>>>>>>> 'CPPFLAGS=' 'CC=/usr/local/llvm13/bin/clang' 
>>>>>>>>>>>> '--host=aarch64-openbsd'
>>>>>>>>>>>> 
>>>>>>>>>>>> This is from running (on one line):
>>>>>>>>>>>> 
>>>>>>>>>>>> hadrian/build \
>>>>>>>>>>>>   --docs=none \
>>>>>>>>>>>>   --flavour=quickest \
>>>>>>>>>>>>   "stage0.*.cabal.configure.opts += --configure-option=LDFLAGS= 
>>>>>>>>>>>> --configure-option=--target=aarch64-unknown-openbsd" \
>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += 
>>>>>>>>>>>> --configure-option=LDFLAGS=\"-syslibroot=$SYSROOT -L/usr/lib 
>>>>>>>>>>>> -L$SYSROOT/usr/lib\"" \
>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += 
>>>>>>>>>>>> --configure-option=CPPFLAGS=\"-isysroot=$SYSROOT -I/usr/include 
>>>>>>>>>>>> -I$SYSROOT/usr/include\"" \
>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += 
>>>>>>>>>>>> --extra-lib-dirs=$SYSROOT/usr/lib" \
>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += --extra-lib-dirs=/usr/lib" \
>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += 
>>>>>>>>>>>> --extra-include-dirs=$SYSROOT/usr/include" \
>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += 
>>>>>>>>>>>> --extra-include-dirs=/usr/include" \
>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += --ghc-option=\"-optl 
>>>>>>>>>>>> -L$SYSROOT/usr/lib\"" \
>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += --ghc-option=\"-optl 
>>>>>>>>>>>> -L/usr/lib\"" \
>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += --ghc-option=\"-optl -lpthread 
>>>>>>>>>>>> -lm\"" \
>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += --ghc-option=\"-optc 
>>>>>>>>>>>> -I$SYSROOT/usr/include\"" \
>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += --ghc-option=\"-optc 
>>>>>>>>>>>> -I/usr/include\"" \
>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += -v3" \
>>>>>>>>>>>>   "stage1.*.ghc.hs.opts += \"-optl -L$SYSROOT/usr/lib\"" \
>>>>>>>>>>>>   "stage1.*.ghc.hs.opts += \"-optl -L/usr/lib\"" \
>>>>>>>>>>>>   "stage1.*.ghc.hs.opts += \"-optl -lpthread -lm\"" \
>>>>>>>>>>>>   "stage1.*.ghc.hs.opts += \"-optc -I$SYSROOT/usr/include\"" \
>>>>>>>>>>>>   "stage1.*.ghc.hs.opts += \"-optc -I/usr/include\"" \
>>>>>>>>>>>>   "stage1.*.ghc.c.opts += -I$SYSROOT/usr/include -I/usr/include" \
>>>>>>>>>>>>   "stage1.*.ghc.link.opts += -L$SYSROOT/usr/lib -L/usr/lib 
>>>>>>>>>>>> -lpthread -lm" \
>>>>>>>>>>>>   "stage1.*.cc.c.opts += -L$SYSROOT/usr/lib -L/usr/lib -lpthread 
>>>>>>>>>>>> -lm" \
>>>>>>>>>>>>   -VVVVVVVVVV --freeze1 \
>>>>>>>>>>>>   stage2:exe:ghc-bin
>>>>>>>>>>>> 
>>>>>>>>>>>> It seems like pretty much none of the arguments are getting passed
>>>>>>>>>>>> through (unlike with the stage0 compilation, where I verified that 
>>>>>>>>>>>> the
>>>>>>>>>>>> flags I was giving to Hadrian were getting passed through).
>>>>>>>>>>>> 
>>>>>>>>>>>> I'm gonna create a ticket on GHC's Gitlab.
>>>>>>>>>>>> 
>>>>>>>>>>>> Cheers,
>>>>>>>>>>>> Habib
>>>>>>>>>>>> 
>>>>>>>>>>>>> On 25 Oct 2024, at 13:20, ⁨حبيب محمد الأمين محمد الهـاد⁩ 
>>>>>>>>>>>>> <⁨ha.ala...@gmail.com <mailto:ha.ala...@gmail.com>⁩> wrote:
>>>>>>>>>>>>> 
>>>>>>>>>>>>> What follows are my notes on where I'm at so far, how I got here, 
>>>>>>>>>>>>> what
>>>>>>>>>>>>> my next steps are, and some rambling and infodump that may be 
>>>>>>>>>>>>> useful.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I managed to build the stage 1 compiler Wednesday. It seems to 
>>>>>>>>>>>>> run as
>>>>>>>>>>>>> expected, though I can't test actual compilation and whether it 
>>>>>>>>>>>>> can
>>>>>>>>>>>>> successfully output AArch64 binaries, as it (correctly) gives an 
>>>>>>>>>>>>> error
>>>>>>>>>>>>> about the lack of Prelude.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I spent yesterday trying to build the stage 2 compiler using the 
>>>>>>>>>>>>> stage
>>>>>>>>>>>>> 1 compiler. By default, the configure tests fail at C compiler 
>>>>>>>>>>>>> cannot
>>>>>>>>>>>>> create executables, and the logs show this:
>>>>>>>>>>>>> 
>>>>>>>>>>>>> configure:2773: /usr/local/llvm13/bin/clang -Qunused-arguments 
>>>>>>>>>>>>> -iquote /home/habib/ghc-9.10.1/rts -Qunused-arguments  
>>>>>>>>>>>>> --target=aarch64-unknown-openbsd conftest.c  >&5
>>>>>>>>>>>>> ld: error: /tmp/conftest-0430b9.o is incompatible with 
>>>>>>>>>>>>> /usr/lib/crt0.o
>>>>>>>>>>>>> libraries: m, pthread”.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> However, by setting `-syslibroot` and `-isysroot` (indirectly and 
>>>>>>>>>>>>> with
>>>>>>>>>>>>> difficulty via Hadrian) to a folder containing the `/usr/lib` and
>>>>>>>>>>>>> `/usr/include` directories from an OpenBSD/arm64 installation, as 
>>>>>>>>>>>>> well
>>>>>>>>>>>>> as including the , I managed to fix that error (so I know it's 
>>>>>>>>>>>>> having an
>>>>>>>>>>>>> effect), but then I get an error like this:
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Error: hadrian: Missing dependencies on foreign libraries:
>>>>>>>>>>>>> * Missing (or bad) C libraries: m, pthread
>>>>>>>>>>>>> […]
>>>>>>>>>>>>> If the libraries are already installed but in a non-standard
>>>>>>>>>>>>> location then you can use the flags --extra-include-dirs=
>>>>>>>>>>>>> and --extra-lib-dirs= to specify where they are.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> (I then added those flags as well, but no dice.)
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Well, the sysroot definitely contains a `libpthread.so.27.1` (and 
>>>>>>>>>>>>> a
>>>>>>>>>>>>> libm.so.*); does it need to be symlinked without the version as 
>>>>>>>>>>>>> well?
>>>>>>>>>>>>> Perhaps my tar of it from an OpenBSD/arm64 installation didn't 
>>>>>>>>>>>>> properly
>>>>>>>>>>>>> capture the symlinks on the original installation?
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Anyway, I won't be able to work on this much today, but I'm gonna 
>>>>>>>>>>>>> try
>>>>>>>>>>>>> increasing the verbosity of configure as the error message above 
>>>>>>>>>>>>> (I've
>>>>>>>>>>>>> elided this part) suggests, though I've already increased 
>>>>>>>>>>>>> Hadrian's
>>>>>>>>>>>>> verbosity as far as I can, not sure if it forwards that to the 
>>>>>>>>>>>>> tools it
>>>>>>>>>>>>> runs. I'm also gonna try and check that I shouldn't have a 
>>>>>>>>>>>>> libpthread.so
>>>>>>>>>>>>> symlink without the version suffix, and try and pass in the 
>>>>>>>>>>>>> sysroot
>>>>>>>>>>>>> and/or include and lib directories through GHC's -optl and -optc 
>>>>>>>>>>>>> flags.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I searched for a while yesterday if there were any known issues 
>>>>>>>>>>>>> with
>>>>>>>>>>>>> building GHC on OpenBSD failing due to pthreads, but nothing 
>>>>>>>>>>>>> fruitful.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Sorry I couldn't trim this message further, I'm in a bit of a 
>>>>>>>>>>>>> rush. I
>>>>>>>>>>>>> just wanted to leave this here with some notes in case one of you 
>>>>>>>>>>>>> knows
>>>>>>>>>>>>> something about building GHC on OpenBSD w/ pthreads, or in 
>>>>>>>>>>>>> general the
>>>>>>>>>>>>> interaction between GHC, OpenBSD, and pthreads. Or to hopefully 
>>>>>>>>>>>>> stop you
>>>>>>>>>>>>> wasting your time if you're still stuck on the stage 1 compiler 
>>>>>>>>>>>>> (sorry,
>>>>>>>>>>>>> I meant to send the initial version of this message on Wednesday, 
>>>>>>>>>>>>> but
>>>>>>>>>>>>> some things prevented me).
>>>>>>>>>>>>> 
>>>>>>>>>>>>> BTW, before I forget, steps to get a seemingly-working stage 1 
>>>>>>>>>>>>> compiler
>>>>>>>>>>>>> (it seems to run fine, but I can't test compilation as it fails to
>>>>>>>>>>>>> find the Prelude module; AFAICT, there's a complicated interplay 
>>>>>>>>>>>>> here
>>>>>>>>>>>>> between the libraries/package dbs for each stage of the compiler, 
>>>>>>>>>>>>> and
>>>>>>>>>>>>> the compilers themselves, but suffice to say that I'm gonna take 
>>>>>>>>>>>>> the
>>>>>>>>>>>>> building of the stage 2 compiler as the confirmation that stage 1 
>>>>>>>>>>>>> can
>>>>>>>>>>>>> successfully compile AArch64 binaries):
>>>>>>>>>>>>> 
>>>>>>>>>>>>> export PATH="/usr/local/llvm13/bin:$PATH"
>>>>>>>>>>>>> # I don't recall why this is needed, but I'm fairly sure it is
>>>>>>>>>>>>> export LD_LIBRARY_PATH=/usr/local/llvm13/lib
>>>>>>>>>>>>> export SYSROOT="$PWD/aarch64-sysroot" # populate this yourself
>>>>>>>>>>>>> 
>>>>>>>>>>>>> cabal update
>>>>>>>>>>>>> 
>>>>>>>>>>>>> # This isn't necessary for stage 1 to build, but I have a hunch 
>>>>>>>>>>>>> it was
>>>>>>>>>>>>> # holding me back from building stage 2 (which I still haven't). 
>>>>>>>>>>>>> The
>>>>>>>>>>>>> # configure script picks up clang-13 and all that, but not these 
>>>>>>>>>>>>> tools,
>>>>>>>>>>>>> # and I rebuilt on a freshly extracted source tree with these 
>>>>>>>>>>>>> exports,
>>>>>>>>>>>>> # and it still worked to build stage 1 (though it crapped out 
>>>>>>>>>>>>> halfway
>>>>>>>>>>>>> # through; I don't recall the error message, but I remember 
>>>>>>>>>>>>> thinking it
>>>>>>>>>>>>> # seemed transient, so I just restarted it and it seemed to 
>>>>>>>>>>>>> resume from
>>>>>>>>>>>>> # the same file, and I got a running stage 1 build that still 
>>>>>>>>>>>>> fails to
>>>>>>>>>>>>> # find Prelude)
>>>>>>>>>>>>> export \
>>>>>>>>>>>>>   AR=/usr/local/bin/llvm-ar-13 \
>>>>>>>>>>>>>   RANLIB=/usr/local/bin/llvm-ranlib-13 \
>>>>>>>>>>>>>   LD=/usr/local/bin/ld.lld-13 \
>>>>>>>>>>>>>   OBJDUMP=/usr/local/bin/llvm-objdump-13 \
>>>>>>>>>>>>>   NM=/usr/local/bin/llvm-nm-13
>>>>>>>>>>>>> 
>>>>>>>>>>>>> ./configure --target=aarch64-unknown-openbsd
>>>>>>>>>>>>> 
>>>>>>>>>>>>> # I wipe out the LDFLAGS because it erroneously had a flag
>>>>>>>>>>>>> # `--host=aarch64-unknown-openbsd`, which it gets from the target;
>>>>>>>>>>>>> # there's some discussion in Greg's link about how that's wrong, 
>>>>>>>>>>>>> and
>>>>>>>>>>>>> # questioning why it does that, so I just wiped that flag; it 
>>>>>>>>>>>>> added
>>>>>>>>>>>>> # `--target` as well, but that gets added through other means, 
>>>>>>>>>>>>> too, and
>>>>>>>>>>>>> # I even add it myself as you can see, though not sure how needed 
>>>>>>>>>>>>> it is.
>>>>>>>>>>>>> hadrian/build \
>>>>>>>>>>>>>   --docs=none \
>>>>>>>>>>>>>   --flavour=quickest \
>>>>>>>>>>>>>   "stage0.*.cabal.configure.opts += \
>>>>>>>>>>>>>   --configure-option=LDFLAGS= \
>>>>>>>>>>>>>   --configure-option=--target=aarch64-unknown-openbsd" \
>>>>>>>>>>>>>   stage1:exe:ghc-bin
>>>>>>>>>>>>> 
>>>>>>>>>>>>> # I'm trying this monster command now to build stage 2, I've tried
>>>>>>>>>>>>> # most of the different flags in there with different variations, 
>>>>>>>>>>>>> but
>>>>>>>>>>>>> # not all together, and some I haven't. breaking it up into lines 
>>>>>>>>>>>>> and
>>>>>>>>>>>>> # paragraphs, but I paste all of these commands on one line. I've 
>>>>>>>>>>>>> frozen
>>>>>>>>>>>>> # the stage 1 compiler just in case something I do rebuilds it 
>>>>>>>>>>>>> (it takes
>>>>>>>>>>>>> # 4 hours on my 4 core, 8gb amd64 QEMU machine being emulated on 
>>>>>>>>>>>>> an M1
>>>>>>>>>>>>> # Pro).
>>>>>>>>>>>>> hadrian/build \
>>>>>>>>>>>>>   --docs=none \
>>>>>>>>>>>>>   --flavour=quickest \
>>>>>>>>>>>>> 
>>>>>>>>>>>>>   "stage0.*.cabal.configure.opts += \
>>>>>>>>>>>>>   --configure-option=LDFLAGS= \
>>>>>>>>>>>>>   --configure-option=--target=aarch64-unknown-openbsd" \
>>>>>>>>>>>>> 
>>>>>>>>>>>>>   "stage1.*.cabal.configure.opts += \
>>>>>>>>>>>>>   --configure-option=LDFLAGS=\"-syslibroot=$SYSROOT -L/usr/lib 
>>>>>>>>>>>>> -L$SYSROOT/usr/lib\" \
>>>>>>>>>>>>>   --configure-option=CPPFLAGS=\"-isysroot=$SYSROOT -I/usr/include 
>>>>>>>>>>>>> -I$SYSROOT/usr/include\" \
>>>>>>>>>>>>> 
>>>>>>>>>>>>>   --configure-option=--extra-lib-dirs=$SYSROOT/usr/lib\" \
>>>>>>>>>>>>>   --configure-option=--extra-lib-dirs=/usr/lib\" \
>>>>>>>>>>>>>   --configure-option=--extra-include-dirs=$SYSROOT/usr/include\" \
>>>>>>>>>>>>>   --configure-option=--extra-include-dirs=/usr/include\" \
>>>>>>>>>>>>> 
>>>>>>>>>>>>>   --configure-option=--ghc-option=\"-optl -L$SYSROOT/usr/lib\"
>>>>>>>>>>>>>   --configure-option=--ghc-option=\"-optl -L/usr/lib\"
>>>>>>>>>>>>>   --configure-option=--ghc-option=\"-optl -lpthread\"
>>>>>>>>>>>>>   --configure-option=--ghc-option=\"-optc 
>>>>>>>>>>>>> -I$SYSROOT/usr/include\" \
>>>>>>>>>>>>>   --configure-option=--ghc-option=\"-optc -I/usr/include\" \
>>>>>>>>>>>>> 
>>>>>>>>>>>>>   --configure-option=-v3" \
>>>>>>>>>>>>> 
>>>>>>>>>>>>>   "stage1.*.ghc.c.opts += -I$SYSROOT/usr/include -I/usr/include" \
>>>>>>>>>>>>>   "stage1.*.ghc.link.opts += -L$SYSROOT/usr/lib -L/usr/lib 
>>>>>>>>>>>>> -lpthread" \
>>>>>>>>>>>>>   "stage1.*.cc.c.opts += -L$SYSROOT/usr/lib -L/usr/lib -lpthread" 
>>>>>>>>>>>>> \
>>>>>>>>>>>>>   -VVVVVVVVVV --freeze1 \
>>>>>>>>>>>>>   stage2:exe:ghc-bin
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I only put them all together like that so you can see the 
>>>>>>>>>>>>> different
>>>>>>>>>>>>> contortions I'm testing out to get options passed to the compiler
>>>>>>>>>>>>> and linker. sysroot should mean that -I/usr/lib should be treated 
>>>>>>>>>>>>> as
>>>>>>>>>>>>> $SYSROOT/usr/lib, but I'm not sure if it is or not, all I had to 
>>>>>>>>>>>>> go
>>>>>>>>>>>>> on were configure logs, no compiler logs (hopefully -v3 should 
>>>>>>>>>>>>> change
>>>>>>>>>>>>> that). I'm dumping all this on you guys in a disorganised fashion
>>>>>>>>>>>>> because I can't work on this much today, so I hope my messy notes 
>>>>>>>>>>>>> and
>>>>>>>>>>>>> rambling will be useful.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> (One last note I forgot to add; testing this with GHC 9.8.3 may 
>>>>>>>>>>>>> prove
>>>>>>>>>>>>> easier to test whether the stage 1 compiler can successfully 
>>>>>>>>>>>>> output
>>>>>>>>>>>>> binary files, as the Cabal version from ports would be compatible 
>>>>>>>>>>>>> with
>>>>>>>>>>>>> it, and so one can more easily populate the package db to get 
>>>>>>>>>>>>> Prelude?)
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>> Habib
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> On 21 Oct 2024, at 04:01, ⁨حبيب محمد الأمين محمد الهـاد⁩ 
>>>>>>>>>>>>>> <⁨ha.ala...@gmail.com <mailto:ha.ala...@gmail.com>⁩> wrote:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> I just finished a PR to get GHCup to build and run on OpenBSD 
>>>>>>>>>>>>>> (though
>>>>>>>>>>>>>> not necessarily support it w/ working build manifests and 
>>>>>>>>>>>>>> bindists yet),
>>>>>>>>>>>>>> so it'll be great to see GHC in ports on OpenBSD/arm64.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> I'll hopefully start working on it this week. Lydia, feel free 
>>>>>>>>>>>>>> to share
>>>>>>>>>>>>>> any notes w/ myself and Greg if you make any progress or are 
>>>>>>>>>>>>>> banging
>>>>>>>>>>>>>> your head against a specific error.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>> Habib
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> On 19 Oct 2024, at 06:54, Greg Steuck <gne...@openbsd.org 
>>>>>>>>>>>>>>> <mailto:gne...@openbsd.org>> wrote:
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Lydia Sobot <chilledfr...@disroot.org 
>>>>>>>>>>>>>>> <mailto:chilledfr...@disroot.org>> writes:
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Perfect. How far in are you?
>>>>>>>>>>>>>>>> Not very, still figuring out how exactly the pieces fit in 
>>>>>>>>>>>>>>>> together
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> FWIW, I made some effort in this area and it didn't go 
>>>>>>>>>>>>>>> particularly
>>>>>>>>>>>>>>> smoothly. Some info in 
>>>>>>>>>>>>>>> https://gitlab.haskell.org/ghc/ghc/-/issues/24431
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> -- 
>>>>>>>>>> nest.cx <http://nest.cx/> is Gmail hosted, use PGP: 
>>>>>>>>>> https://pgp.key-server.io/0x0B1542BD8DF5A1B0
>>>>>>>>>> Fingerprint: 5E2B 2D0E 1E03 2046 BEC3  4D50 0B15 42BD 8DF5 A1B0
>>>>>>>>> 
>>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>>>> -- 
>>>>> nest.cx <http://nest.cx/> is Gmail hosted, use PGP: 
>>>>> https://pgp.key-server.io/0x0B1542BD8DF5A1B0
>>>>> Fingerprint: 5E2B 2D0E 1E03 2046 BEC3  4D50 0B15 42BD 8DF5 A1B0
> 

Reply via email to