automake在dist_bin_SCRIPTS上正确设置+ x位,除非从brew公式安装

时间:2014-06-17 02:29:06

标签: homebrew file-permissions automake

我有几个脚本来设置我的tmux开发环境,我试图将它们打包成brew公式,但我遇到了麻烦。

本地跑步:

% ./configure
% make install

从* .in生成两个脚本,并在每个脚本上成功运行chmod +x。它生成的文件都是可执行的(0755)。

手动运行ls后项目文件夹中./configure && make的输出为:

~/repositories/tmuxide/scripts on :master? (2895bf9) tracking origin/master
frankjmattia@lappy-i686(ttys002)[1062] % ls
total 104
drwxr-xr-x   9 frankjmattia  staff   306B Jun 16 22:10 .
drwxr-xr-x  24 frankjmattia  staff   816B Jun 16 22:10 ..
-rw-r--r--   1 frankjmattia  staff    14K Jun 16 22:09 Makefile
-rw-r--r--   1 frankjmattia  staff   405B Jun 16 22:08 Makefile.am
-rw-r--r--   1 frankjmattia  staff    14K Jun 16 22:09 Makefile.in
-rwxr-xr-x   1 frankjmattia  staff   1.7K Jun 16 22:10 log-pane
-rw-r--r--   1 frankjmattia  staff   1.7K Jun 12 20:35 log-pane.in
-rwxr-xr-x   1 frankjmattia  staff   2.1K Jun 16 22:10 tmuxide
-rw-r--r--   1 frankjmattia  staff   2.1K Jun 16 22:04 tmuxide.in

Homebrew安装文件夹中的ls输出为:

/usr/local/Cellar/tmuxide/0.0.3.j/bin on :master (3fec4c9)
frankjmattia@lappy-i686(ttys002)[1056] % ls
total 16
drwxr-xr-x  4 frankjmattia  admin   136B Jun 16 22:11 .
drwxr-xr-x  6 frankjmattia  admin   204B Jun 16 22:11 ..
-r--r--r--  1 frankjmattia  admin   1.7K Jun 16 22:11 log-pane
-r--r--r--  1 frankjmattia  admin   2.1K Jun 16 22:11 tmuxide

以下是正在播放的文件的重要部分:

configure.ac

AC_PREREQ([2.69])
AC_INIT([tmuxide], [0.0.3.j], [frankjmattia+tmuxide@gmail.com])
AM_INIT_AUTOMAKE
AC_OUTPUT(Makefile man/Makefile scripts/Makefile)
AC_OUTPUT

脚本/ Makefile.am

dist_bin_SCRIPTS = tmuxide log-pane
CLEANFILES = $(dist_bin_SCRIPTS)

EXTRA_DIST = tmuxide.in log-pane.in

do_subst = sed \
    -e 's,[@]PACKAGE[@],$(PACKAGE),g' \
    -e 's,[@]PACKAGE_VERSION[@],$(PACKAGE_VERSION),g'

tmuxide: tmuxide.in Makefile
    $(do_subst) < $(srcdir)/tmuxide.in > tmuxide
    chmod +x tmuxide

log-pane: log-pane.in Makefile
    $(do_subst) < $(srcdir)/log-pane.in > log-pane
    chmod +x log-pane

但是,当我将它包装在brew公式中时,生成的文件只能读取(0444)。

自制/ tmuxide.rb

require "formula"

class Tmuxide < Formula
  homepage 'https://github.com/frankjmattia/tmuxide'
  url 'https://frankjmattia.github.io/tmuxide/tmuxide-0.0.3.j.tar.gz'
  sha1 '5e51b66013a4afd60c362ce448b7e976cf7d6d6e'

  depends_on 'gnu-getopt'

  def install
    system './configure', '--disable-silent-rules',
                          "--prefix=#{prefix}"

    system 'make', 'install'
  end
end

我无法弄清楚哪里出了问题,我们将非常感谢任何建议。

您可以在github.com/frankjmattia/tmuxide

找到完整的来源

1 个答案:

答案 0 :(得分:0)

最后让它发挥作用。

我跑了brew install tmuxide -vd,在跑步结束时我发现了这个宝石

==> Cleaning
Fixing /usr/local/Cellar/tmuxide/0.0.3.k/bin/log-pane permissions from 755 to 444
Fixing /usr/local/Cellar/tmuxide/0.0.3.k/bin/tmuxide permissions from 755 to 444

深入了解自制软件来源,我发现了这一点:

[@f.bin, @f.sbin, @f.lib].select{ |d| d.exist? }.each{ |d| clean_dir d }

clean_dir基本上遍历每个文件,如果它是二进制可执行文件或文本可执行文件,则相应地调整执行位。如果不是,则删除执行位。

然后我偶然发现了这个stack overflow question,这让我相信我应该使用libexec分发这些文件。 clean_dir方法没有改变libexec中的任何内容,因此我的文件权限得以保留,但我的旅程远未结束。

让这个工作后,我必须将这些符号链接到/usr/local/bin,因为libexec不在路径中。所以我在公式中添加了bin.install_symlink "#{libexec}/tmuxide"。这很有效 - 但它不是正确的解决方案。放了一下之后,我又回去看了一遍clean_dir方法,看看是什么构成了text_executable?路径名。

def text_executable?
  %r[^#!\s*\S+] === open('r') { |f| f.read(1024) }
end

我回到我的剧本(因为我知道我在那里有一个shebang)并且意识到我的shebang线没有正确形成。我把它作为普通评论# /usr/bin/env zsh。将其更正为#!/usr/bin/env zsh后,一切都正常进行。

@ ldav1s感谢您对automake的好建议。感谢您的帮助。