如何使用plenv或perlbrew将编译选项传递给perl

时间:2016-09-27 19:18:26

标签: perl perlbrew plenv

我有一台机器在Windows上使用Ubuntu上的Bash运行Windows 10。它使用某种没有适当硬链接支持的FUSE文件系统。

因此,这是典型的perl compilation fails。如果我想编译,我需要做:

echo "dont_use_nlink='define'" >> Policy.sh
./Configure -des
make
make install

我理想的是能够使用perlbrewplenv管理我的perls并将dont_use_nlink参数传递给我构建的任何perl。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

我没有看过Windows 10或Windows的新bash shell,所以我不知道新的Windows bash环境与perlbrew或plenv的兼容性。

另一种方法是利用便携式Strawberry Perl的版本。不久前,David Farrell写了一个使用便携式Strawberry Perl在Windows上模仿perlbrew而不是从源代码编译Perl的莓果。他写了一篇关于它的blog post并将他的东西放在GitHub上(berrybrew)。后来,史蒂夫伯特兰想要添加更多功能,最终最终分配了该项目。你可以在他的blog post上阅读更多关于它的内容,他的分叉项目已经在GitHub上了解(见here)。

除非您需要/想要从源代码构建Perl版本,否则使用berrybrew可能会为您提供您正在寻找的功能。

答案 1 :(得分:1)

幸运的是,它看起来像underlying issue in Win10 WSL is fixed,并且很快就会发布。

正如MichielB指出的那样,-A或-D看起来应该是这样做的,但是从我的一些测试中可以看出,perl的Configure并不尊重#!/usr/bin/env python3 import pygame import os # --- constants --- WIDTH = 1360 HEIGHT = 705 BLACK = (0, 0, 0) WHITE = (250, 250, 250) BULLET_SPEED = 5 # --- classes --- #empty # --- functions --- #empty # --- main --- # - init - os.environ['SDL_VIDEO_WINDOW_POS'] = '0, 25' pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) # - objects - bullets = [] # center of screen as Vector2 #center = pygame.math.Vector2(WIDTH//2, HEIGHT//2) center = pygame.math.Vector2(screen.get_rect().center) # - mainloop - clock = pygame.time.Clock() while True: screen.fill(BLACK) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if event.type== pygame.MOUSEBUTTONDOWN: if event.button == 1: # get vector from center to mouse position vector = event.pos - center # `center` is `Vector2` so `vector` will be `Vector2` too #print(type(vector)) # normalize normal = vector.normalize() # create speed vector speed = normal * BULLET_SPEED # move object (first move 5 times bigger then next moves ) pos = center + (speed * 5) #pygame.draw.line(screen, (255,150,100), (pos.x, pos.y), (center.x, center.y)) pygame.draw.line(screen, (255,150,100), pos, center) # remeber position and speed as one object bullets.append( [pos, speed] ) # - draws - for pos, speed in bullets: # move pos += speed # draw pygame.draw.rect(screen, WHITE, (pos.x, pos.y, 2, 2)) pygame.display.update() # - speed - clock.tick(60) # - end - -A也被传递时,或-D个参数(请参阅"usage" in perl's metaconfig了解这些参数的重要性)。尽管在生成的config.sh的args列表中清楚地看到了正确形成的-A和-D标志,但dont_use_nlink永远不会被添加。

除非你使用special PERLBREW_CONFIGURE_FLAGS environment variable,否则perlbrew会将这些作为默认值传递。

但是,有一种解决方法。您可以使用-de使用PERLBREW_CONFIGURE_FLAGS来传递我们自己的配置文件。我们可以使用由失败的" perlbrew安装生成的大多数正确的config.sh"运行,然后调整并传入。

步骤:

  1. 运行将失败的perlbrew安装,例如:
  2. -f

    1. 将生成的config.sh文件复制到某处以进行修改和重用:
    2. perlbrew install perl-5.24.0

      1. 编辑文件并插入cp /home/USERNAME/perl5/perlbrew/build/perl-5.24.0/config.sh ~/config_dont_use_nlink.sh 。如果你整洁并按字母顺序归档,那么它将介于dlsrc和doubleinfbytes之间:
      2. dont_use_nlink='define'

        1. 运行perlbrew install,但设置一个环境变量,该变量将导致" -f"要传递给新的perl的配置脚本:
        2. dlsrc='dl_dlopen.xs' dont_use_nlink='define' doubleinfbytes='0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f'

          在Win10 build 14393上为一个大多数干净的WSL编译,并且几乎所有测试都通过了(其余的看起来像已经提交的WSL错误的东西)。