hruby 0.2.5 → 0.2.6
raw patch · 3 files changed
+71/−63 lines, 3 filessetup-changed
Files
- Foreign/Ruby/Bindings.hsc +0/−5
- Setup.hs +70/−57
- hruby.cabal +1/−1
Foreign/Ruby/Bindings.hsc view
@@ -111,11 +111,6 @@ foreign import ccall "rb_id2name" rb_id2name :: RID -> IO CString foreign import ccall "rb_string_value_ptr" c_rb_string_value_ptr :: Ptr RValue -> IO CString foreign import ccall "&rb_cObject" rb_cObject :: Ptr RValue-#ifdef RUBY2-foreign import ccall "rb_errinfo" rb_errinfo :: IO RValue-#else-foreign import ccall "&ruby_errinfo" ruby_errinfo :: Ptr RValue-#endif foreign import ccall "rb_iv_set" c_rb_iv_set :: RValue -> CString -> RValue -> IO RValue foreign import ccall "rb_define_class" c_rb_define_class :: CString -> RValue -> IO RValue foreign import ccall "rb_define_method" c_rb_define_method :: RValue -> CString -> FunPtr a -> Int -> IO ()
Setup.hs view
@@ -4,26 +4,62 @@ import Distribution.Simple.LocalBuildInfo import Distribution.Simple.Utils import Distribution.PackageDescription+ import System.Environment+import System.Process+import System.Exit++import Control.Applicative+ import Data.List (partition,stripPrefix,foldl') import Data.Maybe (mapMaybe) -getBuildInfo :: LocalBuildInfo -> BuildInfo-getBuildInfo l = case library (localPkgDescr l) of- Just x -> libBuildInfo x- Nothing -> error "Could not find the buildinfo!" -setBuildInfo :: LocalBuildInfo -> BuildInfo -> LocalBuildInfo-setBuildInfo l b = l { localPkgDescr = lpd' }- where- lpd = localPkgDescr l- Just li = library lpd- li' = li { libBuildInfo = b }- lpd' = lpd { library = Just li' }+type RubyVersion = (Int, Int, Int)+data RubyInfo = RubyInfo { rbVersion :: RubyVersion+ , rbInstallName :: String+ , rbIncludes :: [String]+ , rbLib :: String+ , rbLibName :: String+ } deriving (Eq, Show, Read) -validflags :: [String]-validflags = ["ruby18", "ruby19", "ruby20", "ruby21"]+evalRuby :: String -- expression to evaluate+ -> IO (Maybe String) -- stdout, if successfull+evalRuby exp = do+ (exitCode, out, err) <- readProcessWithExitCode "ruby" ["-e", exp] ""+ return $ if exitCode == ExitSuccess+ then Just out+ else Nothing +getRubyInfo :: IO (Maybe RubyInfo)+getRubyInfo = do+ version <- evalRuby "print '('+RUBY_VERSION.gsub('.', ',')+')'" >>= (return . fmap read)+ case version of+ Nothing -> return Nothing+ Just v@(1,8,_) -> return $ Just $ RubyInfo v+ "/usr/lib/ruby/1.8"+ ["/usr/lib/ruby/1.8/x86_64-linux"]+ "/usr/lib"+ "ruby1.8"+ Just v -> do+ installName <- evalRuby "print RbConfig::CONFIG['RUBY_INSTALL_NAME']"+ headerDir <- evalRuby "print RbConfig::CONFIG['rubyhdrdir']"+ archDir <- evalRuby "print RbConfig::CONFIG['rubyhdrdir'] + File::Separator + RbConfig::CONFIG['arch']"+ libDir <- evalRuby "print RbConfig::CONFIG['libdir']"+ libName <- evalRuby "print RbConfig::CONFIG['LIBRUBY_SO'].sub(/^lib/,'').sub(/\\.(so|dll|dylib)([.0-9]+)?$/,'')"+ return $ RubyInfo <$> pure v+ <*> installName+ <*> sequence [headerDir, archDir]+ <*> libDir+ <*> libName++defsFor :: RubyInfo -> [String]+defsFor info =+ case rbVersion info of+ (1, _, _) -> []+ (2, 0, _) -> ["-DRUBY2"]+ (2, _, _) -> ["-DRUBY2", "-DRUBY21"]+ can'tFindRuby :: String can'tFindRuby = unlines $ [ "Could not find the ruby library. Ensure that it is present on your system (on Debian/Ubuntu, make sure you installed the ruby1.8-dev package)." , "If you know it to be installed, please install hruby in the following way (example for nix):"@@ -35,55 +71,33 @@ , " --rubyversion : Mandatory for ruby 2.0 and 2.1, should have the values 20 or 21." ] -type InstallInfo = (String, [String], [String])--inc18,inc19,inc20,inc21 :: [String]-inc21 = ["/usr/include/ruby-2.1.0", "/usr/include/x86_64-linux-gnu/ruby-2.1.0", "/usr/include/ruby-2.1.0/x86_64-linux"]-inc20 = ["/usr/include/ruby-2.0.0", "/usr/include/x86_64-linux-gnu/ruby-2.0.0", "/usr/include/ruby-2.0.0/x86_64-linux"]-inc19 = ["/usr/lib/ruby/1.9/x86_64-linux"]-inc18 = ["/usr/lib/ruby/1.8/x86_64-linux"]--r18,r19,r20,r21 :: InstallInfo-r21 = ("ruby2.1", inc21, ["-DRUBY2","-DRUBY21"])-r20 = ("ruby2.0", inc20, ["-DRUBY2"])-r19 = ("ruby1.9", inc19, [])-r18 = ("ruby1.8", inc18, [])+getBuildInfo :: LocalBuildInfo -> BuildInfo+getBuildInfo l = case library (localPkgDescr l) of+ Just x -> libBuildInfo x+ Nothing -> error "Could not find the buildinfo!" -defaultLib :: InstallInfo -> InstallInfo-defaultLib (_,i,c) = ("ruby",i,c)+setBuildInfo :: LocalBuildInfo -> BuildInfo -> LocalBuildInfo+setBuildInfo l b = l { localPkgDescr = lpd' }+ where+ lpd = localPkgDescr l+ Just li = library lpd+ li' = li { libBuildInfo = b }+ lpd' = lpd { library = Just li' } myConfHook :: LocalBuildInfo -> IO LocalBuildInfo myConfHook h = do- -- hunt for libraries- let rubies = ["ruby2.1", "ruby2.0", "ruby1.9", "ruby1.8", "ruby"]- pathes = ["/usr/lib", "/usr/local/lib"]- f <- findFirstFile (\(p,r) -> p ++ "/lib" ++ r ++ ".so") [(p,r) | p <- pathes, r <- rubies]- let rubystring = maybe "" snd f- lg s = notice normal ("Auto detected " ++ s)- case fmap snd f of- Just "ruby2.1" -> hookWith r21 h- Just "ruby2.0" -> hookWith r20 h- Just "ruby1.9" -> hookWith r19 h- Just "ruby1.8" -> hookWith r18 h- Just "ruby" -> do- is21 <- findFirstFile id inc21- is20 <- findFirstFile id inc20- is19 <- findFirstFile id inc19- is18 <- findFirstFile id inc18- case filter ((/= Nothing) . fst) [(is21,r21), (is20,r20), (is19,r19), (is18,r18)] of- ((_,(n,inc,flgs)):_) -> hookWith ("ruby",inc,flgs) h- _ -> warn normal can'tFindRuby >> return h- Just x -> die $ "Did find this (this should not happen): " ++ x+ mrubyInfo <- getRubyInfo+ case mrubyInfo of+ Just (info) ->+ let buildinfos = getBuildInfo h+ bi = buildinfos { extraLibs = rbLibName info : extraLibs buildinfos+ , extraLibDirs = rbLib info : extraLibDirs buildinfos+ , includeDirs = includeDirs buildinfos ++ rbIncludes info+ , ccOptions = ccOptions buildinfos ++ defsFor info+ }+ in putStrLn ("Detected ruby: " ++ show info) >> return (setBuildInfo h bi) _ -> warn normal can'tFindRuby >> return h -hookWith (e,i,c) h =- let buildinfos = getBuildInfo h- bi = buildinfos { extraLibs = e : extraLibs buildinfos- , includeDirs = includeDirs buildinfos ++ i- , ccOptions = ccOptions buildinfos ++ c- }- in putStrLn ("Detected parameters: " ++ show (e,i,c)) >> return (setBuildInfo h bi)- parseFlags :: [String] -> LocalBuildInfo -> IO LocalBuildInfo parseFlags flags h = return $ setBuildInfo h $ foldl' parseFlags' bbi flags where@@ -103,4 +117,3 @@ then myConfHook else parseFlags (concatMap words flags) defaultMainWithHooks $ simpleUserHooks { confHook = (\a b -> configure a b >>= hook) }-
hruby.cabal view
@@ -2,7 +2,7 @@ -- see http://haskell.org/cabal/users-guide/ name: hruby-version: 0.2.5+version: 0.2.6 synopsis: Embed Ruby in your Haskell program. description: Warning: this is completely experimental. Everything you need should be in "Foreign.Ruby". license: BSD3