cabal-version: 3.0 name: rts version: 1.0.2 license: BSD-3-Clause maintainer: glasgow-haskell-users@haskell.org build-type: Simple flag libm default: @CabalHaveLibm@ flag librt default: @CabalHaveLibrt@ flag libdl default: @CabalHaveLibdl@ flag use-system-libffi default: @CabalUseSystemLibFFI@ flag libffi-adjustors default: @CabalLibffiAdjustors@ flag need-pthread default: @CabalNeedLibpthread@ flag libbfd default: @CabalHaveLibbfd@ flag mingwex default: @CabalMingwex@ flag libdw default: @CabalHaveLibdw@ flag libnuma default: @CabalHaveLibNuma@ flag 64bit default: @Cabal64bit@ flag leading-underscore default: @CabalLeadingUnderscore@ flag smp default: True flag find-ptr default: False -- Some cabal flags used to control the flavours we want to produce -- for libHSrts in hadrian. By default, we just produce vanilla and -- threaded. The flags "compose": if you enable debug and profiling, -- you will produce vanilla, _thr, _debug, _p but also _thr_p, -- _thr_debug_p and so on. flag profiling default: False flag debug default: False flag logging default: False flag dynamic default: False flag thread-sanitizer description: Enable checking for data races using the ThreadSanitizer (TSAN) mechanism supported by GCC and Clang. See Note [ThreadSanitizer] in @includes/rts/TSANUtils.h@. default: False library -- rts is a wired in package and -- expects the unit-id to be -- set without version ghc-options: -this-unit-id rts -- If we are using an in-tree libffi then we must declare it as a bundled -- library to ensure that Cabal installs it. if !flag(use-system-libffi) if os(windows) extra-bundled-libraries: Cffi-6 else extra-bundled-libraries: Cffi -- The make build system does something special in config.mk.in -- for generating profiled, debugged, etc builds of those -- libraries, but we need to be transparent for hadrian which -- gets information about the rts "package" through Cabal and -- this cabal file. We therefore declare several -- flavours to be available when passing the suitable (combination of) -- flag(s) when configuring the RTS from hadrian, using Cabal. extra-library-flavours: _thr if flag(profiling) extra-library-flavours: _p _thr_p if flag(debug) extra-library-flavours: _debug_p _thr_debug_p if flag(debug) extra-library-flavours: _debug _thr_debug if flag(dynamic) extra-dynamic-library-flavours: _debug _thr_debug if flag(logging) extra-library-flavours: _l _thr_l if flag(dynamic) extra-dynamic-library-flavours: _l _thr_l if flag(dynamic) extra-dynamic-library-flavours: _thr if flag(thread-sanitizer) cc-options: -fsanitize=thread ld-options: -fsanitize=thread extra-libraries: tsan exposed: True exposed-modules: if flag(libm) -- for ldexp() extra-libraries: m if flag(librt) extra-libraries: rt if flag(libdl) extra-libraries: dl if flag(use-system-libffi) extra-libraries: ffi if os(windows) extra-libraries: -- for the linker wsock32 gdi32 winmm -- for crash dump dbghelp -- for process information psapi -- TODO: Hadrian will use this cabal file, so drop WINVER from Hadrian's configs. -- Minimum supported Windows version. -- These numbers can be found at: -- https://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspx -- If we're compiling on windows, enforce that we only support Windows 7+ -- Adding this here means it doesn't have to be done in individual .c files -- and also centralizes the versioning. cpp-options: -D_WIN32_WINNT=0x06010000 cc-options: -D_WIN32_WINNT=0x06010000 if flag(need-pthread) -- for pthread_getthreadid_np, pthread_create, ... extra-libraries: pthread if flag(libbfd) -- for debugging extra-libraries: bfd iberty if flag(mingwex) extra-libraries: mingwex if flag(libdw) -- for backtraces extra-libraries: elf dw if flag(libnuma) extra-libraries: numa if !flag(smp) cpp-options: -DNOSMP include-dirs: build ../includes includes includes/dist-derivedconstants/header @FFIIncludeDir@ @LibdwIncludeDir@ includes: Stg.h install-includes: Cmm.h HsFFI.h MachDeps.h Rts.h RtsAPI.h Stg.h ghcautoconf.h ghcconfig.h ghcplatform.h ghcversion.h -- ^ from ../includes DerivedConstants.h ffi.h ffitarget.h -- ^ generated rts/Adjustor.h rts/ExecPage.h rts/BlockSignals.h rts/Bytecodes.h rts/Config.h rts/Constants.h rts/EventLogFormat.h rts/EventLogWriter.h rts/FileLock.h rts/Flags.h rts/ForeignExports.h rts/GetTime.h rts/Globals.h rts/Hpc.h rts/IOManager.h rts/Libdw.h rts/LibdwPool.h rts/Linker.h rts/Main.h rts/Messages.h rts/NonMoving.h rts/OSThreads.h rts/Parallel.h rts/PrimFloat.h rts/Profiling.h rts/Signals.h rts/SpinLock.h rts/StableName.h rts/StablePtr.h rts/StaticPtrTable.h rts/TTY.h rts/Threads.h rts/Ticky.h rts/Time.h rts/Timer.h rts/TSANUtils.h rts/Types.h rts/Utils.h rts/prof/CCS.h rts/prof/LDV.h rts/storage/Block.h rts/storage/ClosureMacros.h rts/storage/ClosureTypes.h rts/storage/Closures.h rts/storage/FunTypes.h rts/storage/Heap.h rts/storage/GC.h rts/storage/InfoTables.h rts/storage/MBlock.h rts/storage/TSO.h stg/DLL.h stg/MachRegs.h stg/MachRegsForHost.h stg/MiscClosures.h stg/Prim.h stg/Regs.h stg/SMP.h stg/Ticky.h stg/Types.h if flag(64bit) if flag(leading-underscore) ld-options: "-Wl,-u,_hs_atomic_add64" "-Wl,-u,_hs_atomic_sub64" "-Wl,-u,_hs_atomic_and64" "-Wl,-u,_hs_atomic_nand64" "-Wl,-u,_hs_atomic_or64" "-Wl,-u,_hs_atomic_xor64" "-Wl,-u,_hs_cmpxchg64" "-Wl,-u,_hs_atomicread64" "-Wl,-u,_hs_atomicwrite64" else ld-options: "-Wl,-u,hs_atomic_add64" "-Wl,-u,hs_atomic_sub64" "-Wl,-u,hs_atomic_and64" "-Wl,-u,hs_atomic_nand64" "-Wl,-u,hs_atomic_or64" "-Wl,-u,hs_atomic_xor64" "-Wl,-u,hs_cmpxchg64" "-Wl,-u,hs_atomicread64" "-Wl,-u,hs_atomicwrite64" if flag(leading-underscore) ld-options: "-Wl,-u,_base_GHCziTopHandler_runIO_closure" "-Wl,-u,_base_GHCziTopHandler_runNonIO_closure" "-Wl,-u,_ghczmprim_GHCziTuple_Z0T_closure" "-Wl,-u,_ghczmprim_GHCziTypes_True_closure" "-Wl,-u,_ghczmprim_GHCziTypes_False_closure" "-Wl,-u,_base_GHCziPack_unpackCString_closure" "-Wl,-u,_base_GHCziWeak_runFinalizzerBatch_closure" "-Wl,-u,_base_GHCziIOziException_stackOverflow_closure" "-Wl,-u,_base_GHCziIOziException_heapOverflow_closure" "-Wl,-u,_base_GHCziIOziException_allocationLimitExceeded_closure" "-Wl,-u,_base_GHCziIOziException_blockedIndefinitelyOnMVar_closure" "-Wl,-u,_base_GHCziIOziException_blockedIndefinitelyOnSTM_closure" "-Wl,-u,_base_GHCziIOziException_cannotCompactFunction_closure" "-Wl,-u,_base_GHCziIOziException_cannotCompactPinned_closure" "-Wl,-u,_base_GHCziIOziException_cannotCompactMutable_closure" "-Wl,-u,_base_GHCziIOPort_doubleReadException_closure" "-Wl,-u,_base_ControlziExceptionziBase_nonTermination_closure" "-Wl,-u,_base_ControlziExceptionziBase_nestedAtomically_closure" "-Wl,-u,_base_GHCziEventziThread_blockedOnBadFD_closure" "-Wl,-u,_base_GHCziConcziSync_runSparks_closure" "-Wl,-u,_base_GHCziConcziIO_ensureIOManagerIsRunning_closure" "-Wl,-u,_base_GHCziConcziIO_interruptIOManager_closure" "-Wl,-u,_base_GHCziConcziIO_ioManagerCapabilitiesChanged_closure" "-Wl,-u,_base_GHCziConcziSignal_runHandlersPtr_closure" "-Wl,-u,_base_GHCziTopHandler_flushStdHandles_closure" "-Wl,-u,_base_GHCziTopHandler_runMainIO_closure" "-Wl,-u,_ghczmprim_GHCziTypes_Czh_con_info" "-Wl,-u,_ghczmprim_GHCziTypes_Izh_con_info" "-Wl,-u,_ghczmprim_GHCziTypes_Fzh_con_info" "-Wl,-u,_ghczmprim_GHCziTypes_Dzh_con_info" "-Wl,-u,_ghczmprim_GHCziTypes_Wzh_con_info" "-Wl,-u,_base_GHCziPtr_Ptr_con_info" "-Wl,-u,_base_GHCziPtr_FunPtr_con_info" "-Wl,-u,_base_GHCziInt_I8zh_con_info" "-Wl,-u,_base_GHCziInt_I16zh_con_info" "-Wl,-u,_base_GHCziInt_I32zh_con_info" "-Wl,-u,_base_GHCziInt_I64zh_con_info" "-Wl,-u,_base_GHCziWord_W8zh_con_info" "-Wl,-u,_base_GHCziWord_W16zh_con_info" "-Wl,-u,_base_GHCziWord_W32zh_con_info" "-Wl,-u,_base_GHCziWord_W64zh_con_info" "-Wl,-u,_base_GHCziStable_StablePtr_con_info" "-Wl,-u,_hs_atomic_add8" "-Wl,-u,_hs_atomic_add16" "-Wl,-u,_hs_atomic_add32" "-Wl,-u,_hs_atomic_sub8" "-Wl,-u,_hs_atomic_sub16" "-Wl,-u,_hs_atomic_sub32" "-Wl,-u,_hs_atomic_and8" "-Wl,-u,_hs_atomic_and16" "-Wl,-u,_hs_atomic_and32" "-Wl,-u,_hs_atomic_nand8" "-Wl,-u,_hs_atomic_nand16" "-Wl,-u,_hs_atomic_nand32" "-Wl,-u,_hs_atomic_or8" "-Wl,-u,_hs_atomic_or16" "-Wl,-u,_hs_atomic_or32" "-Wl,-u,_hs_atomic_xor8" "-Wl,-u,_hs_atomic_xor16" "-Wl,-u,_hs_atomic_xor32" "-Wl,-u,_hs_cmpxchg8" "-Wl,-u,_hs_cmpxchg16" "-Wl,-u,_hs_cmpxchg32" "-Wl,-u,_hs_xchg8" "-Wl,-u,_hs_xchg16" "-Wl,-u,_hs_xchg32" "-Wl,-u,_hs_xchg64" "-Wl,-u,_hs_atomicread8" "-Wl,-u,_hs_atomicread16" "-Wl,-u,_hs_atomicread32" "-Wl,-u,_hs_atomicwrite8" "-Wl,-u,_hs_atomicwrite16" "-Wl,-u,_hs_atomicwrite32" if flag(find-ptr) -- This symbol is useful in gdb, but not referred to anywhere, -- so we need to force it to be included in the binary. ld-options: "-Wl,-u,_findPtr" else ld-options: "-Wl,-u,base_GHCziTopHandler_runIO_closure" "-Wl,-u,base_GHCziTopHandler_runNonIO_closure" "-Wl,-u,ghczmprim_GHCziTuple_Z0T_closure" "-Wl,-u,ghczmprim_GHCziTypes_True_closure" "-Wl,-u,ghczmprim_GHCziTypes_False_closure" "-Wl,-u,base_GHCziPack_unpackCString_closure" "-Wl,-u,base_GHCziWeak_runFinalizzerBatch_closure" "-Wl,-u,base_GHCziIOziException_stackOverflow_closure" "-Wl,-u,base_GHCziIOziException_heapOverflow_closure" "-Wl,-u,base_GHCziIOziException_allocationLimitExceeded_closure" "-Wl,-u,base_GHCziIOziException_blockedIndefinitelyOnMVar_closure" "-Wl,-u,base_GHCziIOziException_blockedIndefinitelyOnSTM_closure" "-Wl,-u,base_GHCziIOziException_cannotCompactFunction_closure" "-Wl,-u,base_GHCziIOziException_cannotCompactPinned_closure" "-Wl,-u,base_GHCziIOziException_cannotCompactMutable_closure" "-Wl,-u,base_GHCziIOPort_doubleReadException_closure" "-Wl,-u,base_ControlziExceptionziBase_nonTermination_closure" "-Wl,-u,base_ControlziExceptionziBase_nestedAtomically_closure" "-Wl,-u,base_GHCziEventziThread_blockedOnBadFD_closure" "-Wl,-u,base_GHCziConcziSync_runSparks_closure" "-Wl,-u,base_GHCziConcziIO_ensureIOManagerIsRunning_closure" "-Wl,-u,base_GHCziConcziIO_interruptIOManager_closure" "-Wl,-u,base_GHCziConcziIO_ioManagerCapabilitiesChanged_closure" "-Wl,-u,base_GHCziConcziSignal_runHandlersPtr_closure" "-Wl,-u,base_GHCziTopHandler_flushStdHandles_closure" "-Wl,-u,base_GHCziTopHandler_runMainIO_closure" "-Wl,-u,ghczmprim_GHCziTypes_Czh_con_info" "-Wl,-u,ghczmprim_GHCziTypes_Izh_con_info" "-Wl,-u,ghczmprim_GHCziTypes_Fzh_con_info" "-Wl,-u,ghczmprim_GHCziTypes_Dzh_con_info" "-Wl,-u,ghczmprim_GHCziTypes_Wzh_con_info" "-Wl,-u,base_GHCziPtr_Ptr_con_info" "-Wl,-u,base_GHCziPtr_FunPtr_con_info" "-Wl,-u,base_GHCziInt_I8zh_con_info" "-Wl,-u,base_GHCziInt_I16zh_con_info" "-Wl,-u,base_GHCziInt_I32zh_con_info" "-Wl,-u,base_GHCziInt_I64zh_con_info" "-Wl,-u,base_GHCziWord_W8zh_con_info" "-Wl,-u,base_GHCziWord_W16zh_con_info" "-Wl,-u,base_GHCziWord_W32zh_con_info" "-Wl,-u,base_GHCziWord_W64zh_con_info" "-Wl,-u,base_GHCziStable_StablePtr_con_info" "-Wl,-u,hs_atomic_add8" "-Wl,-u,hs_atomic_add16" "-Wl,-u,hs_atomic_add32" "-Wl,-u,hs_atomic_sub8" "-Wl,-u,hs_atomic_sub16" "-Wl,-u,hs_atomic_sub32" "-Wl,-u,hs_atomic_and8" "-Wl,-u,hs_atomic_and16" "-Wl,-u,hs_atomic_and32" "-Wl,-u,hs_atomic_nand8" "-Wl,-u,hs_atomic_nand16" "-Wl,-u,hs_atomic_nand32" "-Wl,-u,hs_atomic_or8" "-Wl,-u,hs_atomic_or16" "-Wl,-u,hs_atomic_or32" "-Wl,-u,hs_atomic_xor8" "-Wl,-u,hs_atomic_xor16" "-Wl,-u,hs_atomic_xor32" "-Wl,-u,hs_cmpxchg8" "-Wl,-u,hs_cmpxchg16" "-Wl,-u,hs_cmpxchg32" "-Wl,-u,hs_xchg8" "-Wl,-u,hs_xchg16" "-Wl,-u,hs_xchg32" "-Wl,-u,hs_xchg64" "-Wl,-u,hs_atomicread8" "-Wl,-u,hs_atomicread16" "-Wl,-u,hs_atomicread32" "-Wl,-u,hs_atomicwrite8" "-Wl,-u,hs_atomicwrite16" "-Wl,-u,hs_atomicwrite32" if flag(find-ptr) -- This symbol is useful in gdb, but not referred to anywhere, -- so we need to force it to be included in the binary. ld-options: "-Wl,-u,findPtr" -- This symbol is useful in gdb, but not referred to anywhere, -- so we need to force it to be included in the binary. "-Wl,-u,findPtr" if os(windows) if flag(leading-underscore) ld-options: "-Wl,-u,_base_GHCziEventziWindows_processRemoteCompletion_closure" else ld-options: "-Wl,-u,base_GHCziEventziWindows_processRemoteCompletion_closure" if os(osx) ld-options: "-Wl,-search_paths_first" -- See Note [fd_set_overflow] "-Wl,-U,___darwin_check_fd_set_overflow" if !arch(x86_64) && !arch(aarch64) ld-options: -read_only_relocs warning cmm-sources: Apply.cmm Compact.cmm Exception.cmm HeapStackCheck.cmm PrimOps.cmm StgMiscClosures.cmm StgStartup.cmm StgStdThunks.cmm Updates.cmm -- AutoApply is generated AutoApply.cmm -- Adjustor stuff if flag(libffi-adjustors) c-sources: adjustor/LibffiAdjustor.c else -- Use GHC's native adjustors if arch(i386) asm-sources: AdjustorAsm.S c-sources: adjustor/Nativei386.c if arch(x86_64) c-sources: adjustor/NativeAmd64.c if arch(ppc) || arch(ppc64) asm-sources: AdjustorAsm.S c-sources: adjustor/NativePowerPC.c if arch(ia64) c-sources: adjustor/NativeIA64.c if arch(sparc) c-sources: adjustor/NativeSparc.c -- Use assembler STG entrypoint on archictures where it is used if arch(ppc) || arch(ppc64) || arch(s390x) || arch(riscv64) asm-sources: StgCRunAsm.S c-sources: Adjustor.c ExecPage.c Arena.c Capability.c CheckUnload.c ClosureFlags.c Disassembler.c FileLock.c ForeignExports.c Globals.c Hash.c Heap.c Hpc.c HsFFI.c Inlines.c Interpreter.c LdvProfile.c Libdw.c LibdwPool.c Linker.c Messages.c OldARMAtomic.c PathUtils.c Pool.c Printer.c ProfHeap.c ProfilerReport.c ProfilerReportJson.c Profiling.c Proftimer.c RaiseAsync.c RetainerProfile.c RetainerSet.c RtsAPI.c RtsDllMain.c RtsFlags.c RtsMain.c RtsMessages.c RtsStartup.c RtsSymbolInfo.c RtsSymbols.c RtsUtils.c STM.c Schedule.c Sparks.c SpinLock.c StableName.c StablePtr.c StaticPtrTable.c Stats.c StgCRun.c StgPrimFloat.c Task.c ThreadLabels.c ThreadPaused.c Threads.c Ticky.c Timer.c TopHandler.c Trace.c TraverseHeap.c WSDeque.c Weak.c eventlog/EventLog.c eventlog/EventLogWriter.c hooks/FlagDefaults.c hooks/LongGCSync.c hooks/MallocFail.c hooks/OnExit.c hooks/OutOfHeap.c hooks/StackOverflow.c linker/CacheFlush.c linker/Elf.c linker/LoadArchive.c linker/M32Alloc.c linker/MachO.c linker/macho/plt.c linker/macho/plt_aarch64.c linker/PEi386.c linker/SymbolExtras.c linker/elf_got.c linker/elf_plt.c linker/elf_plt_aarch64.c linker/elf_plt_arm.c linker/elf_reloc.c linker/elf_reloc_aarch64.c linker/elf_util.c sm/BlockAlloc.c sm/CNF.c sm/Compact.c sm/Evac.c sm/Evac_thr.c sm/GC.c sm/GCAux.c sm/GCUtils.c sm/MBlock.c sm/MarkWeak.c sm/NonMoving.c sm/NonMovingCensus.c sm/NonMovingMark.c sm/NonMovingScav.c sm/NonMovingShortcut.c sm/NonMovingSweep.c sm/Sanity.c sm/Scav.c sm/Scav_thr.c sm/Storage.c sm/Sweep.c fs.c -- I wish we had wildcards..., this would be: -- *.c hooks/**/*.c sm/**/*.c eventlog/**/*.c linker/**/*.c extra-source-files: -- This file needs to be in the package but shouldn't be compiled on its own. xxhash.c if os(windows) c-sources: win32/AsyncMIO.c win32/AsyncWinIO.c win32/AwaitEvent.c win32/ConsoleHandler.c win32/GetEnv.c win32/GetTime.c win32/IOManager.c win32/OSMem.c win32/OSThreads.c win32/ThrIOManager.c win32/Ticker.c win32/WorkQueue.c win32/veh_excn.c -- win32/**/*.c else c-sources: posix/GetEnv.c posix/GetTime.c posix/Itimer.c posix/OSMem.c posix/OSThreads.c posix/Select.c posix/Signals.c posix/TTY.c -- posix/*.c -- we do not want itimer -- Note [fd_set_overflow] -- ~~~~~~~~~~~~~~~~~~~~~~ -- In this note is the very sad tale of __darwin_fd_set_overflow. -- The 8.10.5 release was broken because it was built in an environment -- where the libraries were provided by XCode 12.*, these libraries introduced -- a reference to __darwin_fd_set_overflow via the FD_SET macro which is used in -- Select.c. Unfortunately, this symbol is not available with XCode 11.* which -- led to a linker error when trying to link anything. This is almost certainly -- a bug in XCode but we still have to work around it. -- Undefined symbols for architecture x86_64: -- "___darwin_check_fd_set_overflow", referenced from: -- _awaitEvent in libHSrts.a(Select.o) -- ld: symbol(s) not found for architecture x86_64 -- One way to fix this is to upgrade your version of xcode, but this would -- force the upgrade on users prematurely. Fortunately it also seems safe to pass -- the linker option "-Wl,-U,___darwin_check_fd_set_overflow" because the usage of -- the symbol is guarded by a guard to check if it's defined. -- __header_always_inline int -- __darwin_check_fd_set(int _a, const void *_b) -- { -- if ((uintptr_t)&__darwin_check_fd_set_overflow != (uintptr_t) 0) { --#if defined(_DARWIN_UNLIMITED_SELECT) || defined(_DARWIN_C_SOURCE) -- return __darwin_check_fd_set_overflow(_a, _b, 1); --#else -- return __darwin_check_fd_set_overflow(_a, _b, 0); --#endif -- } else { -- return 1; -- } --} -- Across the internet there are many other reports of this issue -- See: https://github.com/mono/mono/issues/19393 -- , https://github.com/sitsofe/fio/commit/b6a1e63a1ff607692a3caf3c2db2c3d575ba2320 -- The issue was originally reported in #19950