【问题标题】:How to make perl Makefile.PL use a given C compiler when compiling an XS module?编译 XS 模块时如何使 perl Makefile.PL 使用给定的 C 编译器?
【发布时间】:2021-01-15 17:12:17
【问题描述】:

我正在尝试使用通过 conda 下载的预编译 perl 构建 Acme::Damn,有关详细信息,请参阅 this 问题。用于构建perlcc 由以下公式给出:

$ perl -V | grep cc=./
    cc='/tmp/build/80754af9/perl_1527832170752/_build_env/bin/x86_64-conda_cos6-linux-gnu-gcc'

这在我的机器上不存在,因此 make 失败:

$ perl Makefile.PL
Checking if your kit is complete...
Looks good
Warning: prerequisite Test::Exception 0 not found.
Generating a Unix-style Makefile
Writing Makefile for Acme::Damn
Writing MYMETA.yml and MYMETA.json
$ make
cp Damn.pm blib/lib/Acme/Damn.pm
Running Mkbootstrap for Damn ()
chmod 644 "Damn.bs"
"/home/hakon/anaconda3/envs/perl_test/bin/perl" -MExtUtils::Command::MM -e 'cp_nonempty' -- Damn.bs blib/arch/auto/Acme/Damn/Damn.bs 644
"/home/hakon/anaconda3/envs/perl_test/bin/perl" "/home/hakon/anaconda3/envs/perl_test/lib/5.26.2/ExtUtils/xsubpp"  -typemap '/home/hakon/anaconda3/envs/perl_test/lib/5.26.2/ExtUtils/typemap'  Damn.xs > Damn.xsc
mv Damn.xsc Damn.c
/tmp/build/80754af9/perl_1527832170752/_build_env/bin/x86_64-conda_cos6-linux-gnu-gcc -c  -I. -D_REENTRANT -D_GNU_SOURCE --sysroot=/tmp/build/80754af9/perl_1527832170752/_build_env/x86_64-conda_cos6-linux-gnu/sysroot -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2 -O2   -DVERSION=\"0.08\" -DXS_VERSION=\"0.08\" -fPIC --sysroot=/tmp/build/80754af9/perl_1527832170752/_build_env/x86_64-conda_cos6-linux-gnu/sysroot "-I/home/hakon/anaconda3/envs/perl_test/lib/5.26.2/x86_64-linux-thread-multi/CORE"   Damn.c
/bin/sh: 1: /tmp/build/80754af9/perl_1527832170752/_build_env/bin/x86_64-conda_cos6-linux-gnu-gcc: not found
make: *** [Makefile:337: Damn.o] Error 127

我可以安装用于使用 conda 构建 perl 的相同编译器:

$ conda install -c anaconda gcc_linux-64
$ which  x86_64-conda_cos6-linux-gnu-gcc
/home/hakon/anaconda3/envs/perl_test/bin/x86_64-conda_cos6-linux-gnu-gcc

如何使 perl Makefile.PL 在生成 Makefile 时将其用作编译器位置?我试过了:

CC=/home/hakon/anaconda3/envs/perl_test/bin/x86_64-conda_cos6-linux-gnu-gcc perl Makefile.PL

但这不起作用。

【问题讨论】:

    标签: perl


    【解决方案1】:

    Makefile.PL 接受参数,而不是环境变量。

    perl Makefile.PL CC=/home/hakon/anaconda3/envs/perl_test/bin/x86_64-conda_cos6-linux-gnu-gcc
    

    【讨论】:

      【解决方案2】:

      修复Config.pm 指向正确的位置。

      perl -i~ -spe's{^\s*cc\s*=>\s*\x27\K[^\x27]*}{$cc}' \
         -- -cc=/home/hakon/anaconda3/envs/perl_test/bin/x86_64-conda_cos6-linux-gnu-gcc \
         -- "$( perldoc -lm Config )"
      

      这会导致perl -V:cc 显示更新后的路径。

      cc 也在Config_heavy.pl 中定义,不过。因此,您可能还需要以下内容:

      perl -i~ -spe's{^cc=\x27\K[^\x27]*}{$cc}' \
         -- -cc=/home/hakon/anaconda3/envs/perl_test/bin/x86_64-conda_cos6-linux-gnu-gcc \
         -- "$( perldoc -lm Config_heavy.pl )"
      

      【讨论】:

        【解决方案3】:

        通过查看Config_heavy.pl,我可以看到比cc 更多的配置变量可能还需要更新,包括cccdlflagsccflagsconfig_arg10config_arg8config_args ,cppflags,cpprun,cppstdin,glibpth,incpth,ld,lddlflags,libpth,libsdirs,locincpth,libspath,libspath,@987654338 987654340@、stringssysroottimeinclusrincxlibpth

        根据@ikegami 的回答,我编写了以下Perl 脚本来修改Config.pmConfig_heavy.pl

        use feature qw(say);
        use strict;
        use warnings;
        use Config;
        {
            my $compiler_name = 'x86_64-conda_cos6-linux-gnu-gcc';
            my $cc = $Config{cc};
            my ($old_prefix) = $cc =~ m{^(.*?)/bin/$compiler_name};
            die "Unexpected: Could not find old sysroot prefix." if !defined $old_prefix;
            my $new_prefix = $ENV{CONDA_PREFIX};
            die "Unexpected: Could find new sysroot prefix." if !defined $new_prefix;
            say "Old prefix: $old_prefix";
            say "New prefix: $new_prefix";
            fix_config_file($old_prefix, $new_prefix, 'Config.pm');
            fix_config_file($old_prefix, $new_prefix, 'Config_heavy.pl');
        }
        
        sub fix_config_file {
            my ($old_prefix, $new_prefix, $fn) = @_;
        
            my $path = qx/perldoc -lm $fn/;
            chomp $path;
            system 'perl', '-i~', '-pe', "s{\Q$old_prefix\E}{$new_prefix}g", $path;
            say "Updated: $path";
        }
        
        

        在 conda 环境中运行上述脚本后,我可以编译模块:

        $ perl Makefile.PL 
        Warning: prerequisite Test::Exception 0 not found.
        Generating a Unix-style Makefile
        Writing Makefile for Acme::Damn
        Writing MYMETA.yml and MYMETA.json
        
        $ make
        Skip blib/lib/Acme/Damn.pm (unchanged)
        Running Mkbootstrap for Damn ()
        chmod 644 "Damn.bs"
        "/home/hakon/anaconda3/envs/perl_test/bin/perl" -MExtUtils::Command::MM -e 'cp_nonempty' -- Damn.bs blib/arch/auto/Acme/Damn/Damn.bs 644
        /home/hakon/anaconda3/envs/perl_test/bin/x86_64-conda_cos6-linux-gnu-gcc -c  -I. -D_REENTRANT -D_GNU_SOURCE --sysroot=/home/hakon/anaconda3/envs/perl_test/x86_64-conda_cos6-linux-gnu/sysroot -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2 -O2   -DVERSION=\"0.08\" -DXS_VERSION=\"0.08\" -fPIC --sysroot=/home/hakon/anaconda3/envs/perl_test/x86_64-conda_cos6-linux-gnu/sysroot "-I/home/hakon/anaconda3/envs/perl_test/lib/5.26.2/x86_64-linux-thread-multi/CORE"   Damn.c
        rm -f blib/arch/auto/Acme/Damn/Damn.so
        /home/hakon/anaconda3/envs/perl_test/bin/x86_64-conda_cos6-linux-gnu-gcc  -shared -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-rpath,/home/hakon/anaconda3/envs/perl_test/lib -L/home/hakon/anaconda3/envs/perl_test/lib --sysroot /home/hakon/anaconda3/envs/perl_test/x86_64-conda_cos6-linux-gnu/sysroot -fstack-protector-strong Damn.o  -o blib/arch/auto/Acme/Damn/Damn.so  \
              \
          
        chmod 755 blib/arch/auto/Acme/Damn/Damn.so
        Manifying 1 pod document
        

        【讨论】:

          猜你喜欢
          • 2013-02-04
          • 1970-01-01
          • 1970-01-01
          • 2014-06-03
          • 2022-10-05
          • 2021-06-10
          • 2015-07-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多