首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMonad崩溃:如何使用堆栈和自定义构建脚本进行适当的构建?

XMonad崩溃:如何使用堆栈和自定义构建脚本进行适当的构建?
EN

Stack Overflow用户
提问于 2022-11-21 19:49:29
回答 1查看 121关注 0票数 4

OS: 6.0.9

我正在尝试使用Stack构建一个自定义版本的XMonad,以及我编写的一个构建脚本,这个脚本非常基于这是这里的

build.sh

代码语言:javascript
复制
#!/bin/sh
SRC_DIR=$HOME/.config/xmonad
EXE_DIR=$HOME/.local/bin
EXE_NAME=xmonad
######################
unset STACK_YAML
cd $SRC_DIR
stack build 2>.log
ln -f -T $(stack exec -- which $EXE_NAME) $EXE_DIR/$EXE_NAME 2>.log
rm ./src/$EXE_NAME.hi ./src/$EXE_NAME.o 2>/dev/null

上面的stack build调用未能编译一个以前编译得很好的模块,这个模块名为Prompt.Man (不要被XMonad.Prompt.Man混淆,我没有编写),而且我根本不理解GHC错误;当我尝试查看文件--错误引用(XMonad/Actions/OnScreen.dyn_hi)时,它是一个二进制文件。

.log

代码语言:javascript
复制
Building executable 'xmonad-vem:xmobar'.
Other executables with the same name might be overwritten: 'xmobar:xmobar'.

Building executable 'xmonad-vem:xmonad'.
Other executables with the same name might be overwritten: 'xmonad:xmonad'.

Building all executables for `xmonad-vem' once. After a successful build of all of them, only specified executables will be rebuilt.
xmonad-vem> configure (exe)
xmonad-vem> Configuring xmonad-vem-0.3...
xmonad-vem> build (exe)
xmonad-vem> Preprocessing executable 'xmobar' for xmonad-vem-0.3..
xmonad-vem> Building executable 'xmobar' for xmonad-vem-0.3..
xmonad-vem> [9 of 9] Compiling Prompt.Man
xmonad-vem> 
xmonad-vem> /home/myuser/.config/xmonad/src/Prompt/Man.hs:9:1: error:
xmonad-vem>     Bad interface file: /home/myuser/.config/xmonad/.stack-work/install/x86_64-linux-tinfo6/11f8cebbee3588011a80cb3a0acfb83ab68c1e233a64bf2f944fbcae91e1b2fb/8.10.6/lib/x86_64-linux-ghc-8.10.6/xmonad-contrib-0.17.0-KtuI6PQ7yCQKkNv0hd26Wj/XMonad/Actions/OnScreen.dyn_hi
xmonad-vem>         Something is amiss; requested module  xmonad-contrib-0.17.0:XMonad.Actions.OnScreen differs from name found in the interface file xmonad-contrib-0.17.0-Jq55vblrWW56gRIiMssDFv:XMonad.Actions.OnScreen (if these names look the same, try again with -dppr-debug)
xmonad-vem>   |
xmonad-vem> 9 | import XMonad.Actions.OnScreen (onlyOnScreen)
xmonad-vem>   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

--  While building package xmonad-vem-0.3 (scroll up to its section to see the error) using:
      /home/myuser/.stack/setup-exe-cache/x86_64-linux-tinfo6/Cabal-simple_mPHDZzAJ_3.2.1.0_ghc-8.10.6 --builddir=.stack-work/dist/x86_64-linux-tinfo6/Cabal-3.2.1.0 build exe:xmobar exe:xmonad --ghc-options ""
    Process exited with code: ExitFailure 1

按照GHC的建议,将标志-dppr-debug添加到ghc-opts中的package.yaml将在尝试重建时产生完全相同的错误消息。

我还试着删除我的.stack.stack-work目录,然后重新运行,作为一种无望的尝试,看看它是否修复了任何东西,但没有效果。

是什么导致了这个错误,我如何解决它?

附加文件

stack.yaml

代码语言:javascript
复制
resolver: lts-18.7
packages:
  - .
  - /var/cache/distfiles/xmobar-0.44.1
  - /var/cache/distfiles/xmonad-0.17.0
  - /var/cache/distfiles/xmonad-contrib-0.17.0
extra-deps: []
flags:
  xmobar:
    with_xpm: false
    with_threaded: false
    with_xft: true
    with_rtsopts: false
    with_alsa: true
    with_mpd: false
    with_weather: false
    with_dbus: false
    with_mpris: false
    with_inotify: false
    with_nl80211: false
    with_iwlib: false
    with_datezone: false
    with_uvmeter: false
    with_kraken: false
arch: x86_64

/var/cache/distfiles/是我保存xmonad、xmond-cont肋骨和xmobar源代码的特定版本。

package.yaml

代码语言:javascript
复制
name: xmonad-vem
version: 0.3

ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -O2 -j -dynamic

dependencies:
  - base
  - containers
  - directory
  - filepath
  - process
  - regex-tdfa
  - utf8-string
  - unix
  - xmobar
  - xmonad >= 0.17
  - xmonad-contrib >= 0.17

source-dirs:
  - src

executables:
  xmonad:
    main: xmonad.hs
    dependencies:
      - xmonad
      - X11 >= 1.10
  xmobar:
    main: xmobar.hs
    dependencies:
      - xmobar

更新#1

应一条评论的请求,即该问题与全局安装的xmonad-contrib-0.17.0版本有关,我尝试了stack exec ghc-pkg unregister xmonad-contrib-0.17.0 && stack build,它现在编译,但在运行时立即崩溃,并有以下错误:

代码语言:javascript
复制
discover_other_daemon: 0/home/myuser/.local/bin/xmonad: error while loading shared libraries: libHSxmonad-contrib-0.17.0-Jq55vblrWW56gRIiMssDFv-ghc8.10.6.so: cannot open shared object file: No such file or directory

更新#2

由于一条评论,我想出了部分原因;我需要更新我的stack.yaml,使其不包括xmonad、xmonad-cont肋骨和xmobar的本地版本,让Stack为我获取它们:

stack.yaml

代码语言:javascript
复制
resolver: lts-18.7
packages:
  - .
extra-deps:
  - xmonad-0.17.0
  - xmonad-contrib-0.17.0
  - xmobar-0.44.1
  xmobar:
    with_xpm: false
    with_threaded: false
    with_xft: true
    with_rtsopts: false
    with_alsa: true
    with_mpd: false
    with_weather: false
    with_dbus: false
    with_mpris: false
    with_inotify: false
    with_nl80211: false
    with_iwlib: false
    with_datezone: false
    with_uvmeter: false
    with_kraken: false
arch: x86_64

...and稍微编辑构建脚本:build.sh

代码语言:javascript
复制
#!/bin/sh
SRC_DIR=$HOME/.config/xmonad
EXE_DIR=$HOME/.local/bin
EXE_NAME_XMONAD=xmonad
EXE_NAME_XMOBAR=xmobar
######################
unset STACK_YAML
cd $SRC_DIR
stack build 2>.log
ln -f -T $(stack exec -- which $EXE_NAME_XMONAD) $EXE_DIR/$EXE_NAME_XMONAD 2>.log
ln -f -T $(stack exec -- which $EXE_NAME_XMOBAR) $EXE_DIR/$EXE_NAME_XMOBAR 2>.log
rm ./src/$EXE_NAME_XMONAD.hi ./src/$EXE_NAME_XMONAD.o ./src/$EXE_NAME_XMOBAR.hi ./src/$EXE_NAME_XMOBAR.o 2>/dev/null

在执行build.sh并尝试在X服务器上的/home/myuser/.local/bin上运行新的xmonadxmobar之后,我仍然得到了一个类似的运行时错误:

代码语言:javascript
复制
discover_other_daemon: 0XMonad is recompiling and replacing itself with another XMonad process because the current process is called "xmonad" but the compiled configuration should be called "xmonad-x86_64-linux"
XMonad will use build script at "/home/myuser/.config/xmonad/build" to recompile.
XMonad recompiling because a custom build script is being used.
XMonad recompilation process exited with success!
/home/myuser/.cache/xmonad/xmonad-x86_64-linux: error while loading shared libraries: libHSxmonad-contrib-0.17.0-KtuI6PQ7yCQKkNv0hd26Wj-ghc8.10.6.so: cannot open shared object file: No such file or directory
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-22 18:07:51

我想出来了。这就是我必须做的:

#1

使用以下内容作为Stack配置的起点。

stack.yaml

代码语言:javascript
复制
resolver: lts-18.7
packages:
  - .
extra-deps:
  - xmonad-0.17.0
  - xmonad-contrib-0.17.0
  - xmobar-0.44.1
  xmobar:
    with_xpm: false
    with_threaded: false
    with_xft: true
    with_rtsopts: false
    with_alsa: true
    with_mpd: false
    with_weather: false
    with_dbus: false
    with_mpris: false
    with_inotify: false
    with_nl80211: false
    with_iwlib: false
    with_datezone: false
    with_uvmeter: false
    with_kraken: false
arch: x86_64

package.yaml

代码语言:javascript
复制
name: xmonad-vem
version: 0.3

ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -O2 -j -dynamic

dependencies:
  - base
  - containers
  - directory
  - filepath
  - process
  - regex-tdfa
  - utf8-string
  - unix
  - xmobar
  - xmonad >= 0.17
  - xmonad-contrib >= 0.17

source-dirs:
  - src

executables:
  xmonad:
    main: xmonad.hs
    dependencies:
      - xmonad
      - X11 >= 1.10
  xmobar:
    main: xmobar.hs
    dependencies:
      - xmobar

解释

需要确保Stack将我希望作为起点使用的xmonad、xmond-cont肋骨和xmobar的版本作为依赖项,这是由package.yaml中的依赖项指定的;而不是试图使用我在机器上安装的全局版本。

#2

将我的build脚本更新为:

代码语言:javascript
复制
#!/bin/sh
SRC_DIR=$HOME/.config/xmonad
EXE_NAME=xmonad
unset STACK_YAML
FAIL=0
cd $SRC_DIR
stack build 2>.log || FAIL=1
ln -f -T $(stack exec -- which $EXE_NAME) $1 2>.log || FAIL=2
rm ./src/*.hi ./src/*.o 2>/dev/null
exit $FAIL

然后调用xmonad --recompile && startx,它应该如何工作。

解释

XMonad的重新编译过程比我的构建脚本做的更多。在我的版本中,我只是简单地将编译好的xmonadxmobar二进制文件直接链接到本地bin并退出,然后在命令行上调用./build来重新编译xmonad;然而,通过xmonad --recompile调用构建脚本实际上是将一个参数传递给./build,并将二进制文件链接到该二进制文件。

感谢@lsmor指出这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74524194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档