git.iko.soy/typeable/cabal2nix
on ef4ec09 help sign in
typeable/cabal2nix/src/hackage2nix.hs
371 lines 8.8 kB history raw
1-- Run: cabal build -j hackage2nix && dist/build/hackage2nix/hackage2nix >~/.nix-defexpr/pkgs/development/haskell-modules/hackage-packages.nix
3module Main ( main ) where
5import Cabal2Nix.Generate
6-- import Cabal2Nix.Name
7import Cabal2Nix.Package
8import Cabal2Nix.Hackage ( readHashedHackage, Hackage )
9import Control.Monad
10import Control.Monad.Par.Combinator
11import Control.Monad.Par.IO
12import Control.Monad.Trans
13import Data.Map ( Map )
14import qualified Data.Map as Map
15import Data.Monoid
16import Data.Set ( Set )
17import qualified Data.Set as Set
18import Distribution.NixOS.Derivation.Cabal
19import Distribution.NixOS.PrettyPrinting hiding ( (<>) )
20import Distribution.PackageDescription hiding ( buildDepends, extraLibs, buildTools )
21import Distribution.Text
23main :: IO ()
24main = readHashedHackage >>= runParIO . generatePackageSet
26nixAttr :: String -> Version -> String
27nixAttr name _ = name -- ++ "_" ++ [ if c == '.' then '_' else c | c <- display ver ]
29generatePackageSet :: Hackage -> ParIO ()
30generatePackageSet db = do
31 pkgs <- parMapM generatePackage (Map.toList db)
32 liftIO $ putStrLn "/* hackage-packages.nix is an auto-generated file -- DO NOT EDIT! */"
33 liftIO $ putStrLn ""
34 liftIO $ putStrLn "{ pkgs, stdenv, callPackage }:"
35 liftIO $ putStrLn ""
36 liftIO $ putStrLn "self: {"
37 liftIO $ putStrLn ""
38 forM_ pkgs $ \(name, version, drv) -> do
39 let selectHackageNames :: Set String -> Set String
40 selectHackageNames = Set.intersection (Map.keysSet db)
42 selectMissingHackageNames :: Set String -> Set String
43 selectMissingHackageNames = flip Set.difference (Map.keysSet db)
45 conflicts :: Set String
46 conflicts = Set.difference (selectHackageNames $ Set.fromList (extraLibs drv ++ pkgConfDeps drv)) missing
48 conflictOverrides :: Doc
49 conflictOverrides | Set.null conflicts = empty
50 | otherwise = text " inherit (pkgs) " <> hsep (map text (Set.toAscList conflicts)) <> text "; "
52 missing :: Set String
53 missing = Set.union (Set.intersection missingSystemLibraries (Set.fromList (extraLibs drv ++ pkgConfDeps drv ++ buildTools drv)))
54 (selectMissingHackageNames (Set.fromList (buildDepends drv ++ testDepends drv)))
56 missingOverrides :: Doc
57 missingOverrides | Set.null missing = empty
58 | otherwise = fcat [ text (' ':dep++" = null;") | dep <- Set.toAscList missing ] <> space
60 overrides :: Doc
61 overrides = conflictOverrides $+$ missingOverrides
63 let drv' = if Set.null missing then drv else drv { metaSection = (metaSection drv) { broken = True } }
64 -- when (name /= toNixName' name) $
65 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
66 -- liftIO $ print $ nest 2 $ (string (toNixName' name) <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
67 -- when (name /= toNixName' name) $
68 -- liftIO $ print $ nest 2 $ (string name <+> equals <+> text ("self." ++ show (nixAttr name version))) <> semi
69 liftIO $ print $ nest 2 $ hang (string (nixAttr name version) <+> equals <+> text "callPackage") 2 (parens (disp drv')) <+> (braces overrides <> semi)
70 liftIO $ putStrLn ""
71 liftIO $ putStrLn "}"
73generatePackage :: (String, Map Version GenericPackageDescription) -> ParIO (String,Version,Derivation)
74generatePackage (name, versions) = do
75 let latestVersion = Set.findMax (Map.keysSet versions)
76 pkgDescription = (Map.!) versions latestVersion
77 srcSpec <- liftIO $ sourceFromHackage Nothing (name ++ "-" ++ display latestVersion)
78 let drv' = (cabal2nix pkgDescription) { src = srcSpec }
79 Just cabalFileHash = lookup "x-cabal-file-hash" (customFieldsPD (packageDescription pkgDescription))
80 drv = drv' { editedCabalFile = if revision drv' == 0 then "" else cabalFileHash }
81 return (name, latestVersion, drv)
83-- TODO: We should obtain the list of valid attributes in Nixpkgs at
84-- runtime instead of hard-coding a list of invalid attributes here.
85--
86-- TODO: This list is way overspecified; there are many packages in here
87-- that are referred to in the buildDepends or testDepends section, i.e.
88-- packages that we expect to be available from Hackage (but that
89-- aren't).
91missingSystemLibraries :: Set String
92missingSystemLibraries = Set.fromList
93 [ "accelerate-llvm"
94 , "accelerate-llvm-multidev"
95 , "accelerate-llvm-native"
96 , "accelerate-llvm-ptx"
97 , "advapi32"
98 , "Advapi32"
99 , "aether"
100 , "alut"
101 , "antlr3c"
102 , "appindicator"
103 , "appindicator3"
104 , "applicative"
105 , "apr-1"
106 , "apr-util-1"
107 , "arbb_dev"
108 , "b2"
109 , "bfd"
110 , "blkid"
111 , "bluetooth"
112 , "camwire_1394"
113 , "canlib"
114 , "casadi_control"
115 , "casadi_core"
116 , "casadi_ipopt_interface"
117 , "casadi_snopt_interface"
118 , "cblas"
119 , "CEGUIBase"
120 , "CEGUIOgreRenderer"
121 , "cgen-hs"
122 , "clntsh"
123 , "cmph"
124 , "codec2"
125 , "comctl32"
126 , "comdlg32"
127 , "com_err"
128 , "crypto"
129 , "csfml-audio"
130 , "csfml-graphics"
131 , "csfml-network"
132 , "csfml-system"
133 , "csfml-window"
134 , "csound64"
135 , "cudd"
136 , "curses"
137 , "cusparse"
138 , "cwiid"
139 , "d3d9"
140 , "d3dx9"
141 , "dbxml"
142 , "dc1394"
143 , "dc1394_control"
144 , "debian-mirror"
145 , "dns_sd"
146 , "doublefann"
147 , "dsound"
148 , "dttools"
149 , "easy-data"
150 , "EGL"
151 , "eibclient"
152 , "eng"
153 , "epd"
154 , "eskit"
155 , "esound"
156 , "ev"
157 , "event"
158 , "f77blas"
159 , "fann"
160 , "fftw3"
161 , "fftw3f"
162 , "fltk"
163 , "fltk_images"
164 , "fmodex"
165 , "fmodex64"
166 , "freenect_sync"
167 , "friso"
168 , "ftd2xx"
169 , "g"
170 , "gcc_s"
171 , "gcrypt"
172 , "gdi32"
173 , "gdk_x11"
174 , "gecodeint"
175 , "gecodekernel"
176 , "gecodesearch"
177 , "gecodeset"
178 , "gecodesupport"
179 , "GeoIP"
180 , "ghcjs-base"
181 , "GLESv2"
182 , "gnome_keyring"
183 , "gnome-vfs"
184 , "gnome_vfs_module"
185 , "gnomeVfsModule"
186 , "gomp"
187 , "GraphicsMagick"
188 , "grgen"
189 , "groonga"
190 , "gstreamer-audio"
191 , "gstreamer-base"
192 , "gstreamer-controller"
193 , "gstreamer-dataprotocol"
194 , "gstreamer-net"
195 , "gstreamer-plugins-base"
196 , "gtkC"
197 , "gtksourceview"
198 , "gtk_x11"
199 , "haste-lib"
200 , "hasteLib"
201 , "help"
202 , "hg3dcegui040"
203 , "hg3denet040"
204 , "hg3dogre040"
205 , "hg3dsdl2040"
206 , "hg3dsfml040"
207 , "HGamer3DCAudio015"
208 , "HGamer3DOIS015"
209 , "hsql-oracle"
210 , "hsql-sqlite"
211 , "HTam"
212 , "hyperestraier"
213 , "hyperleveldb"
214 , "ImageMagick"
215 , "Imlib2"
216 , "imm32"
217 , "instance-control"
218 , "integer"
219 , "integer-simple"
220 , "intel_aes"
221 , "Judy"
222 , "jvm"
223 , "K8055D"
224 , "kernel32"
225 , "kics"
226 , "language-css-attoparsec"
227 , "lapack"
228 , "lapacke"
229 , "lber"
230 , "lbfgsb"
231 , "ldap"
232 , "leksah-dummy"
233 , "leksah-main"
234 , "leksah-plugin-pane"
235 , "LEXER"
236 , "libaosd"
237 , "libavcodec"
238 , "libavformat"
239 , "libavutil"
240 , "libc"
241 , "libdpkg"
242 , "libglade"
243 , "libkmod"
244 , "libnm-glib"
245 , "librrd"
246 , "libsoup_gnome"
247 , "libswscale"
248 , "libudev"
249 , "libxfconf-0"
250 , "libxine"
251 , "llvm-config"
252 , "MagickCore"
253 , "MagickWand"
254 , "mozembed"
255 , "mpdec"
256 , "mpi"
257 , "msimg32"
258 , "mx"
259 , "mysqlclient"
260 , "mysqlConfig"
261 , "netsnmp"
262 , "newrelic-collector-client"
263 , "newrelic-common"
264 , "newrelic-transaction"
265 , "nm-glib"
266 , "notify"
267 , "nsl"
268 , "nvidia_x11"
269 , "nvvm"
270 , "objc"
271 , "odbc"
272 , "ogg"
273 , "OGRE"
274 , "OgreMain"
275 , "OgrePaging"
276 , "OgreProperty"
277 , "OgreRTShaderSystem"
278 , "OgreTerrain"
279 , "OIS"
280 , "ole32"
281 , "oleaut32"
282 , "opcodes"
283 , "opencc"
284 , "opencv_calib3d"
285 , "opencv_contrib"
286 , "opencv_core"
287 , "opencv_features2d"
288 , "opencv_flann"
289 , "opencv_gpu"
290 , "opencv_highgui"
291 , "opencv_imgproc"
292 , "opencv_legacy"
293 , "opencv_ml"
294 , "opencv_objdetect"
295 , "opencv_video"
296 , "OpenNI2"
297 , "ovr"
298 , "papi"
299 , "pfs"
300 , "pHash"
301 , "plplotd-gnome2"
302 , "popplerGlib"
303 , "qdbm"
304 , "Qt5Core"
305 , "Qt5Gui"
306 , "Qt5Qml"
307 , "Qt5Quick"
308 , "Qt5Widgets"
309 , "QtCore"
310 , "QtWebKit"
311 , "QuadProgpp"
312 , "quickcheck-lio-instances"
313 , "rados"
314 , "raptor"
315 , "raw1394"
316 , "rdkafka"
317 , "resolv"
318 , "riak-bump"
319 , "rocksdb"
320 , "rt"
321 , "scsynth"
322 , "SDL2_ttf"
323 , "sedna"
324 , "sfml-network"
325 , "sfml-system"
326 , "sfml-window"
327 , "shell32"
328 , "shfolder"
329 , "sipc"
330 , "sixense"
331 , "sixense_x64"
332 , "sqlplus"
333 , "ssh2"
334 , "stats-web"
335 , "string-templates"
336 , "swipl"
337 , "Synt"
338 , "systemd-daemon"
339 , "systemGraphviz"
340 , "tag_c"
341 , "taglib_c"
342 , "terralib4c"
343 , "theora"
344 , "tiff"
345 , "translib"
346 , "UniqueLogicNP"
347 , "user32"
348 , "util"
349 , "virt"
350 , "wayland-client"
351 , "wayland-cursor"
352 , "wayland-egl"
353 , "wayland-server"
354 , "winmm"
355 , "winspool"
356 , "wmflite"
357 , "ws2_32"
358 , "www-minus"
359 , "xau"
360 , "Xdamage"
361 , "xenctrl"
362 , "xerces-c"
363 , "Xfixes"
364 , "Xinerama"
365 , "xmmsclient"
366 , "xmmsclient-glib"
367 , "xqilla"
368 , "zephyr"
369 , "zeromq"
370 , "zookeeper_mt"
371 ]