
On Fri, Jan 1, 2010 at 4:09 PM, Tom Hawkins
I have a large tarball I want to link into an executable as a ByteString. What is the best way to do this? I can convert the tarball into a haskell file, but I'm afraid ghc would take a long time to compile it. Is there any way to link constant data directly with ghc? If not, what's the most efficient way to code large ByteStrings for fast compilation?
In the limit, you can convert it to an assembly file. Something like this, though I've done very little checking indeed of the syntax. Consider this to be pseudocode. foo.s ==== .global bytestring, bytestring_end .label bytestring .db 0x0c 0xdf 0xwhatever .label bytestring_end foo.hs === import Foreign import Data.ByteString.Internal foreign import ptr bytestring :: Ptr Word8 foreign import ptr bytestring_end :: Ptr Word8 yourString :: ByteString yourString = unsafePerformIO $ do fptr <- newForeignPtr_ bytestring return $ fromForeignPtr (fptr, bytestring_end `minusPtr` bytestring, 0) -- ^ If I got the foreignPtr parameter order right Unfortunately Data.ByteString.Internal, though still exported, is no longer haddocked; this makes it hard to check the parameters. You should go look up the 6.10.1 version's documentation, which is still correct. -- Svein Ove Aas