    module Propellor.Property.Qemu where

    import Propellor.Base
    import qualified Propellor.Property.Apt as Apt

    -- | Installs qemu user mode emulation binaries, built statically,
    -- which allow foreign binaries to run directly.
    foreignBinariesEmulated :: RevertableProperty Linux Linux
    foreignBinariesEmulated = (setup <!> cleanup)
    	`describe` "foreign binary emulation"
      where
    	setup = Apt.installed p `pickOS` unsupportedOS
    	cleanup = Apt.removed p `pickOS` unsupportedOS
    	p = ["qemu-user-static"]

    -- | Removes qemu user mode emulation binary for the host CPU.
    -- This binary is copied into a chroot by qemu-debootstrap, and is not
    -- part of any package.
    --
    -- Note that removing the binary will prevent using the chroot on the host
    -- system.
    --
    -- The FilePath is the path to the top of the chroot.
    removeHostEmulationBinary :: FilePath -> Property Linux
    removeHostEmulationBinary top = tightenTargets $
    	scriptProperty ["rm -f " ++ top ++ "/usr/bin/qemu-*-static"]
    		`assume` MadeChange

    -- | Check if the given System supports an Architecture.
    --
    -- For example, on Debian, X86_64 supports X86_32, and vice-versa.
    supportsArch :: System -> Architecture -> Bool
    supportsArch (System os a) b
    	| a == b = True
    	| otherwise = case os of
    		Debian _ _ -> debianlike
    		Buntish _ -> debianlike
    		-- don't know about other OS's
    		_ -> False
      where
    	debianlike =
    		let l =
    			[ (X86_64, X86_32)
    			, (ARMHF, ARMEL)
    			, (PPC, PPC64)
    			, (SPARC, SPARC64)
    			, (S390, S390X)
    			]
    		in elem (a, b) l || elem (b, a) l