    {-# LANGUAGE DeriveGeneric #-}
    module Distribution.Simple.Build.Macros.Z (render, Z(..), ZPackage (..), ZTool (..)) where
    import Distribution.ZinzaPrelude
    data Z
        = Z {Z -> [ZPackage]
    zPackages :: ([ZPackage]),
             Z -> [ZTool]
    zTools :: ([ZTool]),
             Z -> String
    zPackageKey :: String,
             Z -> String
    zComponentId :: String,
             Z -> Version
    zPackageVersion :: Version,
             Z -> String -> Bool
    zNotNull :: (String -> Bool),
             Z -> PackageName -> String
    zManglePkgName :: (PackageName -> String),
             Z -> String -> String
    zMangleStr :: (String -> String)}
        deriving (forall x. Z -> Rep Z x) -> (forall x. Rep Z x -> Z) -> Generic Z
    forall x. Rep Z x -> Z
    forall x. Z -> Rep Z x
    forall a.
    (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
    $cfrom :: forall x. Z -> Rep Z x
    from :: forall x. Z -> Rep Z x
    $cto :: forall x. Rep Z x -> Z
    to :: forall x. Rep Z x -> Z
    Generic
    data ZPackage
        = ZPackage {ZPackage -> PackageName
    zpkgName :: PackageName,
                    ZPackage -> Version
    zpkgVersion :: Version,
                    ZPackage -> String
    zpkgX :: String,
                    ZPackage -> String
    zpkgY :: String,
                    ZPackage -> String
    zpkgZ :: String}
        deriving (forall x. ZPackage -> Rep ZPackage x)
    -> (forall x. Rep ZPackage x -> ZPackage) -> Generic ZPackage
    forall x. Rep ZPackage x -> ZPackage
    forall x. ZPackage -> Rep ZPackage x
    forall a.
    (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
    $cfrom :: forall x. ZPackage -> Rep ZPackage x
    from :: forall x. ZPackage -> Rep ZPackage x
    $cto :: forall x. Rep ZPackage x -> ZPackage
    to :: forall x. Rep ZPackage x -> ZPackage
    Generic
    data ZTool
        = ZTool {ZTool -> String
    ztoolName :: String,
                 ZTool -> Version
    ztoolVersion :: Version,
                 ZTool -> String
    ztoolX :: String,
                 ZTool -> String
    ztoolY :: String,
                 ZTool -> String
    ztoolZ :: String}
        deriving (forall x. ZTool -> Rep ZTool x)
    -> (forall x. Rep ZTool x -> ZTool) -> Generic ZTool
    forall x. Rep ZTool x -> ZTool
    forall x. ZTool -> Rep ZTool x
    forall a.
    (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
    $cfrom :: forall x. ZTool -> Rep ZTool x
    from :: forall x. ZTool -> Rep ZTool x
    $cto :: forall x. Rep ZTool x -> ZTool
    to :: forall x. Rep ZTool x -> ZTool
    Generic
    render :: Z -> String
    render :: Z -> String
    render Z
    z_root = Writer () -> String
    forall a. Writer a -> String
    execWriter (Writer () -> String) -> Writer () -> String
    forall a b. (a -> b) -> a -> b
    $ do
      String -> Writer ()
    tell String
    "/* DO NOT EDIT: This file is automatically generated by Cabal */\n"
      String -> Writer ()
    tell String
    "\n"
      [ZPackage] -> (ZPackage -> Writer ()) -> Writer ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    t a -> (a -> m b) -> m ()
    forM_ (Z -> [ZPackage]
    zPackages Z
    z_root) ((ZPackage -> Writer ()) -> Writer ())
    -> (ZPackage -> Writer ()) -> Writer ()
    forall a b. (a -> b) -> a -> b
    $ \ZPackage
    z_var0_pkg -> do
        String -> Writer ()
    tell String
    "/* package "
        String -> Writer ()
    tell (PackageName -> String
    forall a. Pretty a => a -> String
    prettyShow (ZPackage -> PackageName
    zpkgName ZPackage
    z_var0_pkg))
        String -> Writer ()
    tell String
    "-"
        String -> Writer ()
    tell (Version -> String
    forall a. Pretty a => a -> String
    prettyShow (ZPackage -> Version
    zpkgVersion ZPackage
    z_var0_pkg))
        String -> Writer ()
    tell String
    " */\n"
        String -> Writer ()
    tell String
    "#ifndef VERSION_"
        String -> Writer ()
    tell (Z -> PackageName -> String
    zManglePkgName Z
    z_root (ZPackage -> PackageName
    zpkgName ZPackage
    z_var0_pkg))
        String -> Writer ()
    tell String
    "\n"
        String -> Writer ()
    tell String
    "#define VERSION_"
        String -> Writer ()
    tell (Z -> PackageName -> String
    zManglePkgName Z
    z_root (ZPackage -> PackageName
    zpkgName ZPackage
    z_var0_pkg))
        String -> Writer ()
    tell String
    " \""
        String -> Writer ()
    tell (Version -> String
    forall a. Pretty a => a -> String
    prettyShow (ZPackage -> Version
    zpkgVersion ZPackage
    z_var0_pkg))
        String -> Writer ()
    tell String
    "\"\n"
        String -> Writer ()
    tell String
    "#endif /* VERSION_"
        String -> Writer ()
    tell (Z -> PackageName -> String
    zManglePkgName Z
    z_root (ZPackage -> PackageName
    zpkgName ZPackage
    z_var0_pkg))
        String -> Writer ()
    tell String
    " */\n"
        String -> Writer ()
    tell String
    "#ifndef MIN_VERSION_"
        String -> Writer ()
    tell (Z -> PackageName -> String
    zManglePkgName Z
    z_root (ZPackage -> PackageName
    zpkgName ZPackage
    z_var0_pkg))
        String -> Writer ()
    tell String
    "\n"
        String -> Writer ()
    tell String
    "#define MIN_VERSION_"
        String -> Writer ()
    tell (Z -> PackageName -> String
    zManglePkgName Z
    z_root (ZPackage -> PackageName
    zpkgName ZPackage
    z_var0_pkg))
        String -> Writer ()
    tell String
    "(major1,major2,minor) (\\\n"
        String -> Writer ()
    tell String
    "  (major1) <  "
        String -> Writer ()
    tell (ZPackage -> String
    zpkgX ZPackage
    z_var0_pkg)
        String -> Writer ()
    tell String
    " || \\\n"
        String -> Writer ()
    tell String
    "  (major1) == "
        String -> Writer ()
    tell (ZPackage -> String
    zpkgX ZPackage
    z_var0_pkg)
        String -> Writer ()
    tell String
    " && (major2) <  "
        String -> Writer ()
    tell (ZPackage -> String
    zpkgY ZPackage
    z_var0_pkg)
        String -> Writer ()
    tell String
    " || \\\n"
        String -> Writer ()
    tell String
    "  (major1) == "
        String -> Writer ()
    tell (ZPackage -> String
    zpkgX ZPackage
    z_var0_pkg)
        String -> Writer ()
    tell String
    " && (major2) == "
        String -> Writer ()
    tell (ZPackage -> String
    zpkgY ZPackage
    z_var0_pkg)
        String -> Writer ()
    tell String
    " && (minor) <= "
        String -> Writer ()
    tell (ZPackage -> String
    zpkgZ ZPackage
    z_var0_pkg)
        String -> Writer ()
    tell String
    ")\n"
        String -> Writer ()
    tell String
    "#endif /* MIN_VERSION_"
        String -> Writer ()
    tell (Z -> PackageName -> String
    zManglePkgName Z
    z_root (ZPackage -> PackageName
    zpkgName ZPackage
    z_var0_pkg))
        String -> Writer ()
    tell String
    " */\n"
      String -> Writer ()
    tell String
    "\n"
      [ZTool] -> (ZTool -> Writer ()) -> Writer ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    t a -> (a -> m b) -> m ()
    forM_ (Z -> [ZTool]
    zTools Z
    z_root) ((ZTool -> Writer ()) -> Writer ())
    -> (ZTool -> Writer ()) -> Writer ()
    forall a b. (a -> b) -> a -> b
    $ \ZTool
    z_var1_tool -> do
        String -> Writer ()
    tell String
    "/* tool "
        String -> Writer ()
    tell (ZTool -> String
    ztoolName ZTool
    z_var1_tool)
        String -> Writer ()
    tell String
    "-"
        String -> Writer ()
    tell (Version -> String
    forall a. Pretty a => a -> String
    prettyShow (ZTool -> Version
    ztoolVersion ZTool
    z_var1_tool))
        String -> Writer ()
    tell String
    " */\n"
        String -> Writer ()
    tell String
    "#ifndef TOOL_VERSION_"
        String -> Writer ()
    tell (Z -> String -> String
    zMangleStr Z
    z_root (ZTool -> String
    ztoolName ZTool
    z_var1_tool))
        String -> Writer ()
    tell String
    "\n"
        String -> Writer ()
    tell String
    "#define TOOL_VERSION_"
        String -> Writer ()
    tell (Z -> String -> String
    zMangleStr Z
    z_root (ZTool -> String
    ztoolName ZTool
    z_var1_tool))
        String -> Writer ()
    tell String
    " \""
        String -> Writer ()
    tell (Version -> String
    forall a. Pretty a => a -> String
    prettyShow (ZTool -> Version
    ztoolVersion ZTool
    z_var1_tool))
        String -> Writer ()
    tell String
    "\"\n"
        String -> Writer ()
    tell String
    "#endif /* TOOL_VERSION_"
        String -> Writer ()
    tell (Z -> String -> String
    zMangleStr Z
    z_root (ZTool -> String
    ztoolName ZTool
    z_var1_tool))
        String -> Writer ()
    tell String
    " */\n"
        String -> Writer ()
    tell String
    "#ifndef MIN_TOOL_VERSION_"
        String -> Writer ()
    tell (Z -> String -> String
    zMangleStr Z
    z_root (ZTool -> String
    ztoolName ZTool
    z_var1_tool))
        String -> Writer ()
    tell String
    "\n"
        String -> Writer ()
    tell String
    "#define MIN_TOOL_VERSION_"
        String -> Writer ()
    tell (Z -> String -> String
    zMangleStr Z
    z_root (ZTool -> String
    ztoolName ZTool
    z_var1_tool))
        String -> Writer ()
    tell String
    "(major1,major2,minor) (\\\n"
        String -> Writer ()
    tell String
    "  (major1) <  "
        String -> Writer ()
    tell (ZTool -> String
    ztoolX ZTool
    z_var1_tool)
        String -> Writer ()
    tell String
    " || \\\n"
        String -> Writer ()
    tell String
    "  (major1) == "
        String -> Writer ()
    tell (ZTool -> String
    ztoolX ZTool
    z_var1_tool)
        String -> Writer ()
    tell String
    " && (major2) <  "
        String -> Writer ()
    tell (ZTool -> String
    ztoolY ZTool
    z_var1_tool)
        String -> Writer ()
    tell String
    " || \\\n"
        String -> Writer ()
    tell String
    "  (major1) == "
        String -> Writer ()
    tell (ZTool -> String
    ztoolX ZTool
    z_var1_tool)
        String -> Writer ()
    tell String
    " && (major2) == "
        String -> Writer ()
    tell (ZTool -> String
    ztoolY ZTool
    z_var1_tool)
        String -> Writer ()
    tell String
    " && (minor) <= "
        String -> Writer ()
    tell (ZTool -> String
    ztoolZ ZTool
    z_var1_tool)
        String -> Writer ()
    tell String
    ")\n"
        String -> Writer ()
    tell String
    "#endif /* MIN_TOOL_VERSION_"
        String -> Writer ()
    tell (Z -> String -> String
    zMangleStr Z
    z_root (ZTool -> String
    ztoolName ZTool
    z_var1_tool))
        String -> Writer ()
    tell String
    " */\n"
      String -> Writer ()
    tell String
    "\n"
      if (Z -> String -> Bool
    zNotNull Z
    z_root (Z -> String
    zPackageKey Z
    z_root))
      then do
        String -> Writer ()
    tell String
    "#ifndef CURRENT_PACKAGE_KEY\n"
        String -> Writer ()
    tell String
    "#define CURRENT_PACKAGE_KEY \""
        String -> Writer ()
    tell (Z -> String
    zPackageKey Z
    z_root)
        String -> Writer ()
    tell String
    "\"\n"
        String -> Writer ()
    tell String
    "#endif /* CURRENT_packageKey */\n"
        () -> Writer ()
    forall a. a -> Writer a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
      else do
        () -> Writer ()
    forall a. a -> Writer a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
      if (Z -> String -> Bool
    zNotNull Z
    z_root (Z -> String
    zComponentId Z
    z_root))
      then do
        String -> Writer ()
    tell String
    "#ifndef CURRENT_COMPONENT_ID\n"
        String -> Writer ()
    tell String
    "#define CURRENT_COMPONENT_ID \""
        String -> Writer ()
    tell (Z -> String
    zComponentId Z
    z_root)
        String -> Writer ()
    tell String
    "\"\n"
        String -> Writer ()
    tell String
    "#endif /* CURRENT_COMPONENT_ID */\n"
        () -> Writer ()
    forall a. a -> Writer a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
      else do
        () -> Writer ()
    forall a. a -> Writer a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
      String -> Writer ()
    tell String
    "#ifndef CURRENT_PACKAGE_VERSION\n"
      String -> Writer ()
    tell String
    "#define CURRENT_PACKAGE_VERSION \""
      String -> Writer ()
    tell (Version -> String
    forall a. Pretty a => a -> String
    prettyShow (Z -> Version
    zPackageVersion Z
    z_root))
      String -> Writer ()
    tell String
    "\"\n"
      String -> Writer ()
    tell String
    "#endif /* CURRENT_PACKAGE_VERSION */\n"