Skip to content

Hadrian isn't "flavour change"-proof

Summary

Changing from a flavour to another while using the same build root should just rebuild everything needed, that's affected by the flavour change, but instead falls over while taking care of stage 2 GHC's dynamic libHSrts library files.

Steps to reproduce

$ hadrian/build.sh -j --flavour=quickest
$ hadrian/build.sh -j

Expected behaviour

The first command succeeds and builds a complete stage 2 quickest-flavoured GHC. The second command succeeds and builds a complete stage default-flavoured GHC.

Actual behaviour

The first command succeeds, but the second one fails.

$ hadrian/build.sh -j
[...]
| Run Ghc CompileCWithGhc Stage1: rts/Linker.c => _build/stage1/rts/build/c/Linker.thr_l_dyn_o
| Run Ghc LinkHs Stage1: _build/stage1/rts/build/c/Adjustor.thr_debug_dyn_o (and 115 more) => _build/stage1/rts/build/libHSrts-1.0_thr_debug-ghc8.9.0.20190506.so
Warning: -rtsopts and -with-rtsopts have no effect with -shared.
    Call hs_init_ghc() from your main() function to set these options.
| Run Ghc CompileCWithGhc Stage1: rts/RtsSymbols.c => _build/stage1/rts/build/c/RtsSymbols.thr_l_dyn_o
| Run Ghc CompileCWithGhc Stage1: rts/RtsSymbols.c => _build/stage1/rts/build/c/RtsSymbols.thr_dyn_o
/nix/store/0y7jmqnj48ikjh37n3dl9kqw9hnn68nq-binutils-2.31.1/bin/ld: cannot find -lffi
collect2: error: ld returned 1 exit status
`cc' failed in phase `Linker'. (Exit code: 1)
| Run Ar Pack Stage1: _build/stage1/rts/build/c/Adjustor.debug_p_o (and 113 more) => _build/stage1/rts/build/libHSrts-1.0_debug_p.a
Error when running Shake build system:
  at action, called at src/Rules.hs:69:19 in main:Rules
  at need, called at src/Rules.hs:91:5 in main:Rules
* Depends on: _build/stage1/bin/hp2ps
  at need, called at src/Utilities.hs:71:18 in main:Utilities
* Depends on: _build/stage1/rts/build/libHSrts-1.0_thr_debug-ghc8.9.0.20190506.so
* Raised the exception:
user error (Development.Shake.cmd, system command failed
Command line: _build/stage0/bin/ghc -Wall -hisuf thr_debug_dyn_hi -osuf thr_debug_dyn_o -hcsuf thr_debug_dyn_hc -fPIC -dynamic -optc-DTHREADED_RTS -optc-DDEBUG -hide-all-packages -no-user-package-db '-package-db _build/stage1/lib/package.conf.d' '-this-unit-id rts-1.0' -i -i_build/stage1/rts/build -i_build/stage1/rts/build/autogen -irts/. -Iincludes -I_build/generated -I_build/stage1/rts/build -I/nix/store/y4xqavb0x22l72whp70vy76vcvf2wmz6-ghc-build-environment/include -I_build/stage1/rts/build/build -I_build/stage1/rts/build/../includes -I_build/stage1/rts/build/includes -I_build/stage1/rts/build/includes/dist-derivedconstants/header -Irts/build -Irts/../includes -Irts/includes -Irts/includes/dist-derivedconstants/header -I_build/generated -optc-I_build/generated -optP-include -optP_build/stage1/rts/build/autogen/cabal_macros.h -ghcversion-file=_build/generated/ghcversion.h -outputdir _build/stage1/rts/build -dynamic -shared -dynload deploy -optl-Wl,-rpath,$ORIGIN -optl-Wl,-zorigin -no-auto-link-packages -rtsopts -lm -lrt -ldl -lpthread -lnuma -L_build/stage1/rts/build -lffi -Wnoncanonical-monad-instances -optc-Werror=unused-but-set-variable -optc-Wno-error=inline _build/stage1/rts/build/c/Adjustor.thr_debug_dyn_o _build/stage1/rts/build/c/Arena.thr_debug_dyn_o _build/stage1/rts/build/c/Capability.thr_debug_dyn_o _build/stage1/rts/build/c/CheckUnload.thr_debug_dyn_o _build/stage1/rts/build/c/ClosureFlags.thr_debug_dyn_o _build/stage1/rts/build/c/Disassembler.thr_debug_dyn_o _build/stage1/rts/build/c/FileLock.thr_debug_dyn_o _build/stage1/rts/build/c/Globals.thr_debug_dyn_o _build/stage1/rts/build/c/Hash.thr_debug_dyn_o _build/stage1/rts/build/c/Heap.thr_debug_dyn_o _build/stage1/rts/build/c/Hpc.thr_debug_dyn_o _build/stage1/rts/build/c/HsFFI.thr_debug_dyn_o _build/stage1/rts/build/c/Inlines.thr_debug_dyn_o _build/stage1/rts/build/c/Interpreter.thr_debug_dyn_o _build/stage1/rts/build/c/LdvProfile.thr_debug_dyn_o _build/stage1/rts/build/c/Libdw.thr_debug_dyn_o _build/stage1/rts/build/c/LibdwPool.thr_debug_dyn_o _build/stage1/rts/build/c/Linker.thr_debug_dyn_o _build/stage1/rts/build/c/Messages.thr_debug_dyn_o _build/stage1/rts/build/c/OldARMAtomic.thr_debug_dyn_o _build/stage1/rts/build/c/PathUtils.thr_debug_dyn_o _build/stage1/rts/build/c/Pool.thr_debug_dyn_o _build/stage1/rts/build/c/Printer.thr_debug_dyn_o _build/stage1/rts/build/c/ProfHeap.thr_debug_dyn_o _build/stage1/rts/build/c/ProfilerReport.thr_debug_dyn_o _build/stage1/rts/build/c/ProfilerReportJson.thr_debug_dyn_o _build/stage1/rts/build/c/Profiling.thr_debug_dyn_o _build/stage1/rts/build/c/Proftimer.thr_debug_dyn_o _build/stage1/rts/build/c/RaiseAsync.thr_debug_dyn_o _build/stage1/rts/build/c/RetainerProfile.thr_debug_dyn_o _build/stage1/rts/build/c/RetainerSet.thr_debug_dyn_o _build/stage1/rts/build/c/RtsAPI.thr_debug_dyn_o _build/stage1/rts/build/c/RtsDllMain.thr_debug_dyn_o _build/stage1/rts/build/c/RtsFlags.thr_debug_dyn_o _build/stage1/rts/build/c/RtsMain.thr_debug_dyn_o _build/stage1/rts/build/c/RtsMessages.thr_debug_dyn_o _build/stage1/rts/build/c/RtsStartup.thr_debug_dyn_o _build/stage1/rts/build/c/RtsSymbolInfo.thr_debug_dyn_o _build/stage1/rts/build/c/RtsSymbols.thr_debug_dyn_o _build/stage1/rts/build/c/RtsUtils.thr_debug_dyn_o _build/stage1/rts/build/c/STM.thr_debug_dyn_o _build/stage1/rts/build/c/Schedule.thr_debug_dyn_o _build/stage1/rts/build/c/Sparks.thr_debug_dyn_o _build/stage1/rts/build/c/StableName.thr_debug_dyn_o _build/stage1/rts/build/c/StablePtr.thr_debug_dyn_o _build/stage1/rts/build/c/StaticPtrTable.thr_debug_dyn_o _build/stage1/rts/build/c/Stats.thr_debug_dyn_o _build/stage1/rts/build/c/StgCRun.thr_debug_dyn_o _build/stage1/rts/build/c/StgPrimFloat.thr_debug_dyn_o _build/stage1/rts/build/c/Task.thr_debug_dyn_o _build/stage1/rts/build/c/ThreadLabels.thr_debug_dyn_o _build/stage1/rts/build/c/ThreadPaused.thr_debug_dyn_o _build/stage1/rts/build/c/Threads.thr_debug_dyn_o _build/stage1/rts/build/c/Ticky.thr_debug_dyn_o _build/stage1/rts/build/c/Timer.thr_debug_dyn_o _build/stage1/rts/build/c/TopHandler.thr_debug_dyn_o _build/stage1/rts/build/c/Trace.thr_debug_dyn_o _build/stage1/rts/build/c/WSDeque.thr_debug_dyn_o _build/stage1/rts/build/c/Weak.thr_debug_dyn_o _build/stage1/rts/build/c/eventlog/EventLog.thr_debug_dyn_o _build/stage1/rts/build/c/eventlog/EventLogWriter.thr_debug_dyn_o _build/stage1/rts/build/c/hooks/FlagDefaults.thr_debug_dyn_o _build/stage1/rts/build/c/hooks/LongGCSync.thr_debug_dyn_o _build/stage1/rts/build/c/hooks/MallocFail.thr_debug_dyn_o _build/stage1/rts/build/c/hooks/OnExit.thr_debug_dyn_o _build/stage1/rts/build/c/hooks/OutOfHeap.thr_debug_dyn_o _build/stage1/rts/build/c/hooks/StackOverflow.thr_debug_dyn_o _build/stage1/rts/build/c/linker/CacheFlush.thr_debug_dyn_o _build/stage1/rts/build/c/linker/Elf.thr_debug_dyn_o _build/stage1/rts/build/c/linker/LoadArchive.thr_debug_dyn_o _build/stage1/rts/build/c/linker/M32Alloc.thr_debug_dyn_o _build/stage1/rts/build/c/linker/MachO.thr_debug_dyn_o _build/stage1/rts/build/c/linker/PEi386.thr_debug_dyn_o _build/stage1/rts/build/c/linker/SymbolExtras.thr_debug_dyn_o _build/stage1/rts/build/c/linker/elf_got.thr_debug_dyn_o _build/stage1/rts/build/c/linker/elf_plt.thr_debug_dyn_o _build/stage1/rts/build/c/linker/elf_plt_aarch64.thr_debug_dyn_o _build/stage1/rts/build/c/linker/elf_plt_arm.thr_debug_dyn_o _build/stage1/rts/build/c/linker/elf_reloc.thr_debug_dyn_o _build/stage1/rts/build/c/linker/elf_reloc_aarch64.thr_debug_dyn_o _build/stage1/rts/build/c/linker/elf_util.thr_debug_dyn_o _build/stage1/rts/build/c/sm/BlockAlloc.thr_debug_dyn_o _build/stage1/rts/build/c/sm/CNF.thr_debug_dyn_o _build/stage1/rts/build/c/sm/Compact.thr_debug_dyn_o _build/stage1/rts/build/c/sm/Evac.thr_debug_dyn_o _build/stage1/rts/build/c/sm/Evac_thr.thr_debug_dyn_o _build/stage1/rts/build/c/sm/GC.thr_debug_dyn_o _build/stage1/rts/build/c/sm/GCAux.thr_debug_dyn_o _build/stage1/rts/build/c/sm/GCUtils.thr_debug_dyn_o _build/stage1/rts/build/c/sm/MBlock.thr_debug_dyn_o _build/stage1/rts/build/c/sm/MarkWeak.thr_debug_dyn_o _build/stage1/rts/build/c/sm/Sanity.thr_debug_dyn_o _build/stage1/rts/build/c/sm/Scav.thr_debug_dyn_o _build/stage1/rts/build/c/sm/Scav_thr.thr_debug_dyn_o _build/stage1/rts/build/c/sm/Storage.thr_debug_dyn_o _build/stage1/rts/build/c/sm/Sweep.thr_debug_dyn_o _build/stage1/rts/build/c/xxhash.thr_debug_dyn_o _build/stage1/rts/build/c/fs.thr_debug_dyn_o _build/stage1/rts/build/c/posix/GetEnv.thr_debug_dyn_o _build/stage1/rts/build/c/posix/GetTime.thr_debug_dyn_o _build/stage1/rts/build/c/posix/Itimer.thr_debug_dyn_o _build/stage1/rts/build/c/posix/OSMem.thr_debug_dyn_o _build/stage1/rts/build/c/posix/OSThreads.thr_debug_dyn_o _build/stage1/rts/build/c/posix/Select.thr_debug_dyn_o _build/stage1/rts/build/c/posix/Signals.thr_debug_dyn_o _build/stage1/rts/build/c/posix/TTY.thr_debug_dyn_o _build/stage1/rts/build/cmm/Apply.thr_debug_dyn_o _build/stage1/rts/build/cmm/Compact.thr_debug_dyn_o _build/stage1/rts/build/cmm/Exception.thr_debug_dyn_o _build/stage1/rts/build/cmm/HeapStackCheck.thr_debug_dyn_o _build/stage1/rts/build/cmm/PrimOps.thr_debug_dyn_o _build/stage1/rts/build/cmm/StgMiscClosures.thr_debug_dyn_o _build/stage1/rts/build/cmm/StgStartup.thr_debug_dyn_o _build/stage1/rts/build/cmm/StgStdThunks.thr_debug_dyn_o _build/stage1/rts/build/cmm/Updates.thr_debug_dyn_o _build/stage1/rts/build/cmm/AutoApply.thr_debug_dyn_o -o _build/stage1/rts/build/libHSrts-1.0_thr_debug-ghc8.9.0.20190506.so -O2 -H32m -this-unit-id rts -XHaskell98 -ghcversion-file=/home/alp/ghc/_build/generated/ghcversion.h -Irts -Wno-deprecated-flags -Wcpp-undef
Exit code: 1
Stderr:
Warning: -rtsopts and -with-rtsopts have no effect with -shared.
    Call hs_init_ghc() from your main() function to set these options.
/nix/store/0y7jmqnj48ikjh37n3dl9kqw9hnn68nq-binutils-2.31.1/bin/ld: cannot find -lffi
collect2: error: ld returned 1 exit status
`cc' failed in phase `Linker'. (Exit code: 1)

Environment

  • GHC version used: 8.4.4 as the boot compiler

Optional:

  • Operating System: (NixOS) Linux, OS X
  • System Architecture: x86_64

Notes

  • @int-index reported a similar failure (copying a dynamic library fails because it already exists, in his case) when executing a workflow like "building, rebasing and building again". His error:

    | Creating file link: _build/stage1/lib/x86_64-osx-ghc-8.9.0.20190503/libHSrts-ghc8.9.0.20190503.dylib -> libHSrts-1.0-ghc8.9.0.20190503.dylib
    Error when running Shake build system:
      at action, called at src/Rules.hs:69:19 in main:Rules
      at need, called at src/Rules.hs:91:5 in main:Rules
    * Depends on: _build/stage1/lib/package.conf.d/rts-1.0.conf
      at need, called at src/Rules/Rts.hs:31:9 in main:Rules.Rts
    * Depends on: _build/stage1/lib/x86_64-osx-ghc-8.9.0.20190503/libHSrts-ghc8.9.0.20190503.dylib
    * Raised the exception:
    _build/stage1/lib/x86_64-osx-ghc-8.9.0.20190503/libHSrts-ghc8.9.0.20190503.dylib: createFileLink:createSymbolicLink: already exists (File exists)
  • It looks like !888 (merged) by @DavidEichmann touches Hadrian code related to those dynamic RTS libraries, so perhaps it will work around the error above and fail later or who knows, succeed!

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information