Contact me: hankecnc@gmail.com

构建系统没有正确使用 –prefix= #216

推推 grbl 3年前 (2023-01-29) 331次浏览
打开
bjornfor 打开了这个问题 2016 年 12 月 6 日 · 5 条评论
打开

构建系统没有正确使用 –prefix=#216

bjornfor 打开了这个问题 2016 年 12 月 6 日 · 5 条评论

注释

构建系统没有正确使用 --prefix= #216

以下是我重现该问题所遵循的步骤:

$ cd linuxcnc/src
$ ./autogen.sh
$ ./configure --with-realtime=uspace --prefix=$PWD/_install
$ make
$ make install
(error due to trying to install files in /etc)

这是我期望发生的事情:

make install通过将所有工件放入--prefix=$PWD/_install目录中来成功。

这是发生了什么:

安装失败是由于

  1. 构建系统错误地强制用户设置 DESTDIR——通过设置解决DESTDIR=/
  2. 使用硬编码的 /etc 目录绕过给定的几个地方--prefix=

解决了这个小的构建系统问题后,我/我们将接近于将 LinuxCNC 打包到 Nix/nixpkgs 中。

构建系统没有正确使用 --prefix= #216

有没有人为 nix/nixpkgs 打包过 linuxcnc?

构建系统没有正确使用 --prefix= #216
贡献者

${prefix}在构建系统中也遇到了很多麻烦。我认为这个问题源于构建系统的历史。最初的构建系统看起来很像我在 1990 年代使用的许多 EDA 和 CAD 构建系统,其中一切都围绕着一个$FOO_HOME变量。后来,添加了 Autoconf 配置,但通过互换${prefix}和,构建系统基本保持不变${EMC_HOME}。虽然这确实有效,但在某些情况下会导致细微的错误。

在 Machinekit 中完成了一些工作以转换为 CMake。NixOS 用户是这项工作的主要贡献者。在machinekit#336 (comment)中应该有一些面包屑。

构建系统没有正确使用 --prefix= #216

您仍然需要 tkimg 等。下面的代码有效。Linuxcnc 甚至启动。
您还需要 /etc/* 文件的模块。但我仍然无法运行 CNC。如果有人有兴趣帮助测试这个,请告诉我。

{ python2Full
, stdenv
, gcc6Stdenv
, lib
, fetchFromGitHub

, wrapGAppsHook
, gobject-introspection
, makeWrapper
, readline6
, automake, autoconf, libtool,  pkgconfig, libtirpc, libmodbus, libusb1, gtk2, gtk3
, glib
, boost17x
, ps
, procps
, utillinux
, psmisc
, gettext
, intltool
, tk, tcl
, bwidget # TODO make executables find it
, tkimg
, tclx
, libGLU
, xlibs
, xorg
, pango, cairo
, linuxHeaders
} :

    let pythonEnv = 
      (python2Full.withPackages (ps: [
ps.Yapps2 ps.pycairo ps.cairocffi ps.cairosvg ps.tkinter ps.boost ps.pygobject3 ps.pygtk

    ])); in
    stdenv.mkDerivation {

    hardeningDisable = [ "all" ]; #TODO ? use patch instead ?

    # problems:
    # python pango/ cairo
    # import pango
    # import cairo ok

# import pygtk
# pygtk.require('2.0')
# import gtk
# import pango

    enableParalellBuilding = true;

    name = "linuxcnc-2.9-git";

    # # branch:master 2021-03-05 (2.9 pre)
    src = fetchFromGitHub {
      owner = "LinuxCNC";
      repo = "linuxcnc";
      rev = "578012bba16b807401f7bcae4390c49e1e90908a";
      sha256="1p0rq9pm97fdswxniwmfhmz11my654apnzb85fz4jklgxssw9kx1";
    };

    # src = fetchgit {
    #   url = "git://github.com/linuxcnc/linuxcnc.git";
    #   rev = "578012bba16b807401f7bcae4390c49e1e90908a";
    #   # date = "2021-03-05T16:05:06+00:00";
    #   sha256 = "1p0rq9pm97fdswxniwmfhmz11my654apnzb85fz4jklgxssw9kx1";
    # };

    nativeBuildInputs = [
        wrapGAppsHook
      gobject-introspection
    ];

    buildInputs = [
      makeWrapper
      readline6
      automake autoconf gettext libtool  pkgconfig libtirpc libmodbus libusb1 
      gtk2 pango cairo
      glib
      boost17x
      ps
      procps
      utillinux
      psmisc
      intltool
      tk tcl
      bwidget # TODO make executables find it
      tkimg
      tclx
      libGLU
      xlibs.libXmu

      pythonEnv
  ];

      # configure: WARNING: The LinuxCNC binary you are building may not be
      # distributable due to a license incompatibility with LinuxCNC (some portions
      # GPL-2 only) and Readline version 6 and greater (GPL-3 or later).
      # configure: error: To configure LinuxCNC in this way, you must
      # invoke configure with "--enable-non-distributable=yes".  Note that on
      # Debian-based systems, you may be able to use libreadline-gplv2-dev instead.


    # for uts kernel
    # linuxHeaders # ?
    # export KERNELDIR=${linuxHeaders};

    # --with-realtime=uspace \  -> stepconf -> simualtion version only?
    configurePhase = ''
    export KERNELDIR=${linuxHeaders};
    export TCLLIBPATH="${bwidget}/lib ${tkimg}/lib ${tclx}/lib"
    cd src
    ./autogen.sh
    ./configure  \
      --with-tkConfig=${tk}/lib/tkConfig.sh \
      --with-tclConfig=${tcl}/lib/tclConfig.sh \
      --with-realtime=uspace \
      --disable-run-place \
      "--enable-non-distributable=yes" \
      --prefix=$out

      sed -i \
        -e 's/chown.*//' \
        -e 's/-o root//g' \
        -e 's/ -m [0-9]\+//g' \
        Makefile
    '';

    installPhase = ''
      mkdir $out
      make install DESTDIR=$out
      set -x

      link(){
        local from="$1"
        local to="$2"
        local b
        echo "calling link $from $to"

        for x in "$from"/*; do
          b="$(basename "$x")"
          if [ -d "$to/$b" ]; then
            link "$x" "$to/$b"
          else
            ln -s "$x" "$to/$b"
          fi
        done
      }

      link "$out/$out" "$out"
      gappsWrapperArgsHook

      for p in $out/bin/*; do
        wrapGApp "$p" \
          --prefix PATH ':' $PATH \
          --prefix TCLLIBPATH ' ' "$TCLLIBPATH $out/lib $out/lib/tcltk/linuxcnc" \
          --prefix PYTHONPATH ':' "$out/${pythonEnv}/lib/python2.7/site-packages" \
          --prefix LD_LIBRARY_PATH ':' "${xorg.libXScrnSaver}/lib"
      done

    '';
  }


{ config, pkgs, lib, ... }:

with lib;

let
  cfg = config.programs.linuxcnc;

in

{

  options = {

    programs.linuxcnc.enable = mkEnableOption "enable linuxcnc";

    programs.linuxcnc.package = mkOption {
      type = types.package;
      default = pkgs.linuxcnc29;
    };

  };

  config = mkIf cfg.enable {

    environment.etc."init.d/realtime".source =  "${cfg.package}/etc/init.d/realtime";
    environment.etc."X11/app-defaults/TkLinuxCNC".source =  "${cfg.package}/etc/X11/app-defaults/TkLinuxCNC";
    environment.etc."linuxcnc/rtapi.conf".source =  "${cfg.package}${cfg.package}/etc/linuxcnc/rtapi.conf";
    environment.systemPackages = [ cfg.package ];

    security.wrappers.rtapi_app = {
      group = "root";
      owner = "root";
      program = "rtapi_app";
      source = "${cfg.package}/bin/rtapi_app";
      # group = cfg.setgidGroup;
      setuid = false;
      setgid = true;
    };

  };

}
构建系统没有正确使用 --prefix= #216
马克韦伯 评论了 2021 年 3 月 13 日  

https://github.com/MarcWeber/nixpkgs/tree/e2/linuxcnc
我完全没有实时的东西。
当以 root 身份运行时,它会显示“using realtime=posix”等。
但即使测量抖动 (stepconf) 我拥有的非常旧的 i686 机器也开始挂起。没有 realitme (uspace) 它似乎部分工作。我能够在 stepconf 中移动 X 轴。

像下面这样的脚本可用于将构建在现代快速机器上的 i686 系统推送到慢速旧机器上:

update_linuxcnc(){
  export NIX_PATH=nixos=/etc/nixos/nixpkgs/nixos:nixpkgs=/etc/nixos/nixpkgs:nixos-config=/etc/nixos/setups/u/configuration.nix
  nix-build --out-link /tmp/u '<nixpkgs/nixos>' --argstr system 'i686-linux' -A system || return
  echo build ok
  l=$(readlink /tmp/u)
  nix-copy-closure --to  root@192.168.178.103 $l || return
  echo copy ok
  echo "$l/bin/switch-to-configuration switch" | ssh root@192.168.178.103 || return
  echo switch ok
}
构建系统没有正确使用 --prefix= #216

这个问题有点老了,但我已经为 NixOS 打包了 LinuxCNC,cc@MarcWeber @bjornfor如果你仍然感兴趣。

目前在 x86_64 上通过 Mesa 卡和 PREEMPT_RT 慢跑机器。我还打包了一个 PREEMPT_RT Rpi4 内核并将其移动到那里。主要的实用程序似乎可以运行,并且 linuxcnc 本身可以与 AXIS 一起运行。其他 GUI 需要多加注意。

尽管需要围绕构建系统和 FHS 路径进行大量修补,但不确定是否值得仅针对 NixOS 将它们升级到上游,因为 NixOS 软件包无论如何都需要特殊修补,以解决 setuid 问题。

我的回购协议和注释与示例 Rpi4 配置一起在这里。

免费注册 在 GitHub 上加入此对话。已有帐户? 登录评论
项目

还没有

发展

没有分支机构或拉取请求

6人参加
构建系统没有正确使用 --prefix= #216构建系统没有正确使用 --prefix= #216构建系统没有正确使用 --prefix= #216构建系统没有正确使用 --prefix= #216构建系统没有正确使用 --prefix= #216构建系统没有正确使用 --prefix= #216

喜欢 (0)