diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,5 @@
+#!/usr/bin/env runhaskell
+
+> import Distribution.Simple
+> main = defaultMain
+
diff --git a/avr-shake.cabal b/avr-shake.cabal
new file mode 100644
--- /dev/null
+++ b/avr-shake.cabal
@@ -0,0 +1,26 @@
+name:                   avr-shake
+version:                0.0.0.1
+stability:              experimental
+
+cabal-version:          >= 1.6
+build-type:             Simple
+
+author:                 James Cook <mokus@deepbondi.net>
+maintainer:             James Cook <mokus@deepbondi.net>
+license:                PublicDomain
+homepage:               https://github.com/mokus0/avr-shake
+
+category:               Development
+synopsis:               AVR Crosspack actions for shake build systems.
+description:            AVR Crosspack actions for shake build systems.
+
+source-repository head
+  type: git
+  location: git://github.com/mokus0/avr-shake.git
+
+Library
+  ghc-options:          -fwarn-unused-imports -fwarn-unused-binds
+  hs-source-dirs:       src
+  exposed-modules:      Development.Shake.AVR
+  build-depends:        base >= 3 && <5,
+                        shake == 0.10.*
diff --git a/src/Development/Shake/AVR.hs b/src/Development/Shake/AVR.hs
new file mode 100644
--- /dev/null
+++ b/src/Development/Shake/AVR.hs
@@ -0,0 +1,42 @@
+module Development.Shake.AVR
+    ( avr_gcc,      avr_gcc'
+    , avr_ld,       avr_ld'
+    , avr_objcopy,  avr_objcopy'
+    , avr_objdump,  avr_objdump'
+    , avrdude,      avrdude'
+    ) where
+
+import Development.Shake
+import Development.Shake.Command
+
+gccDeps cc cFlags src = do
+    Stdout cppOut <- command [Traced ""] cc (cFlags ++ ["-M", "-MG", "-E", src])
+    return (filter (/= "\\") (drop 2 (words cppOut)))
+
+avr_gcc = avr_gcc' "avr-gcc"
+avr_gcc' cc cFlags src out = do
+    need [src]
+    need =<< gccDeps cc cFlags src
+    system' cc (cFlags ++ ["-c", src, "-o", out])
+
+avr_ld = avr_ld' "avr-ld"
+avr_ld' ld ldFlags objs out = do
+    need objs
+    system' ld (ldFlags ++ ["-o", out] ++ objs)
+
+avr_objcopy = avr_objcopy' "avr-objcopy"
+avr_objcopy' objcopy fmt flags src out = do
+    need [src]
+    system' objcopy (flags ++ ["-O", fmt, src, out])
+
+avr_objdump = avr_objdump' "avr-objdump"
+avr_objdump' objdump src out = do
+    need [src]
+    Stdout lss <- command [] objdump ["-h", "-S", src]
+    writeFileChanged out lss
+
+avrdude = avrdude' "avrdude"
+avrdude' avrdudeBin flags hex usbPort = do
+    alwaysRerun
+    need [usbPort, hex]
+    system' avrdudeBin (flags ++ ["-P", usbPort, "-Uflash:w:" ++ hex])
