6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

haskell-stackを使ってxmonadをビルドする(外部モジュールが使えたりする)

Last updated at Posted at 2017-01-03

旧タイトル: xmonad.hsでモジュール分割をする

 この記事はxmonad用に書かれていますが、xmonadやyiエディタのような、そもそもmainを自前で書くhaskell-stack対応のHaskellプロジェクトなら、同じ方法で解決できます。

目的

~/.xmonad
|- xmonad.hs
|- XMonadConfig
   |- Types.hs

 こんな感じのディレクトリ構成とし、~/XMonadConfig/Types.hs(XMonadConfig.Typesモジュール)はxmonad.hsからimportされているとして、xmonad.hsをコンパイルする。

問題

 xmonad.hsはxmonadの設定ファイルですが、通常通りxmonad --recompileをするとxmonadコマンド越しでのxmonad.hsのコンパイルになってしまうので、上記のXMonadConfig.Typesモジュールはxmonadコマンドに読み込まれず、コンパイルエラーになります。

解決方法

 xmonad.hsをhaskell-stackプロジェクトにし、プロジェクトのビルド結果でxmonad-configという実行可能バイナリがインストールされるようになります。

解決

xmonad-configプロジェクトの作成

$ cd /tmp
$ stack new xmonad-config simple
$ mv ~/.xmonad/xmonad.hs xmonad-config && rm -rf ~/.xmonad
$ mv xmonad-config ~/.xmonad
$ cd ~/.xmonad

xmonad-config.cabalを書き換える

$ ls xmonad-config.cabal
xmonad-config.cabal
$ vim xmonad-config.cabal

xmonad-configの内容

xmonad-config.cabal
name:                xmonad-config
version:             0.1.0.0
synopsis:            Simple project template from stack
description:         Please see README.md
homepage:            https://google.co.jp
license:             BSD3
license-file:        LICENSE
author:              your_name
maintainer:          your_mail_address@example.co.jp
copyright:           your_name
category:            Simple
build-type:          Simple
cabal-version:       >=1.10

executable xmonad-config
  hs-source-dirs:      .
  main-is:             xmonad.hs
  default-language:    Haskell2010
  other-modules:       XMonadConfig.Types
  build-depends:       base >= 4.7 && < 5
                     , xmonad

ここで、xmonad-contribxmonad-extrasを使いたい場合は、build-dependsに追加しておきます。

 XMonadConfig/{Actions,Types}.hsを作成します。

$ mkdir XMonadConfig
$ vim XMonadConfig/Types.hs
~/.xmonad/XMonadConfig/Types.hs
module XMonadConfig.Types
  ( Workspaces
  ) where

-- | The another expression of XMonad.Config.XConfig.workspaces
type Workspaces = [String]

xmonad-configのインストール (プロジェクトのビルド)

  • ※ 下記コードはイメージです
$ cat xmonad.hs
import XMonadConfig.Types (Workspaces)
import XMonad

main :: IO ()
main = do
  xmonad $ desktopConfig
    { terminal           = "termite"
    , modMask            = superMask
    , workspaces         = myWorkspaces
    }

myWorkspaces :: Workspaces
myWorkspaces = map show [1..4]

$ stack install
Copying from /home/user_name/.xmonad/.stack-work/install/x86_64-linux/lts-7.14/8.0.1/bin/xmonad-config to /home/user_name/.local/bin/xmonad-config

Copied executables to /home/user_name/.local/bin/:
- xmonad-config

適用

 xmonad-configが生成されましたので、目的自体は達成です。
.xinitrcあたりに、xmonadの代わりとしてxmonad-configを書いておきましょう。

exec ~/.local/bin/xmonad-config

xmonad --recompileについて

 このissueに、stackを使ってxmonad --recompileをする方法が書かれています。
以下の手順で、有効にすることができます。

1. ~/.xmonad/buildを作成する

sh
#!/bin/bash
cd ~/.xmonad
stack build

2. stackに依存パッケージの位置を伝える

ローカルに落とす場合

 この手順は…要はstackが直接、依存パッケージを参照できればいいので、stack.yamlにgithubリモートリポジトリのURIを教えてあげればいいのかもしれないけど、どうなんでしょう。


  • $ git submodule add https://github.com/xmonad/xmonad or

  • $ git submodule add https://github.com/xmonad/xmonad-contrib など(xmonad-configをgitで管理していない場合など、cloneしてもいい)

  • stack.yamlを編集する

    • stack solver --update-configがよしなにやってくれるはず

僕の環境では、以下のようになりました!

yaml
flags:
  xmonad-extras:
    with_hint: false
    with_mpd: false
  xmonad-contrib:
    use_xft: false
extra-package-dbs: []
packages:
- '.'
- xmonad/
- xmonad-contrib/
- xmonad-extras/
extra-deps:
- X11-1.8
- alsa-core-0.5.0.1
- alsa-mixer-0.2.0.3
- xmonad-0.13
resolver: lts-7.14

 これでxmonad-config --recompileを行った際にstack buildを行ってくれるようになります。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?