Perl Inline C code inside nginx Perl module
Maxim Dounin
mdounin at mdounin.ru
Fri Apr 13 14:03:40 UTC 2018
Hello!
On Fri, Apr 13, 2018 at 02:40:17AM +0200, Ondrej Jombik wrote:
> We have some proprietary code in C language, which we cannot convert
> into Perl. We would like to use this C code in Perl nginx module. Code
> runs well under Perl's Inline C.
>
> However when I try to run Inline C code in nginx Perl module, it does
> not work. Not only this code does not work, in fact no Inline C code
> work inside Perl nginx environment.
>
> For example, look at this very simple Perl module inlinetest.pm:
>
> package inlinetest;
> use strict;
> use nginx;
>
> $ENV{'PATH'} = '/bin/:/usr/bin/';
> use Inline Config =>
> DIRECTORY => '/tmp/';
> use Inline "C" => <<'...';
> void test_fnc(int num)
> {
> fprintf(stderr, "%d\n", num);
> }
[...]
> As you can see in my example, I am not even using or calling test_fnc()
> yet. But Perl code simply fails on startup with this error message:
>
> -- Unit nginx.service has begun starting up.
> nginx[20011]: nginx: [emerg] require_pv("inlinetest.pm") failed: "Running Mkbootstrap for inlinetest_0cff
> nginx[20011]: chmod 644 "inlinetest_0cff.bs"
> nginx[20011]: "/usr/bin/perl" "/usr/share/perl/5.24/ExtUtils/xsubpp" -typemap "/usr/share/perl/5.24/ExtUt
> nginx[20011]: x86_64-linux-gnu-gcc -c -I"/" -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fwrapv -fno-strict-alias
> nginx[20011]: x86_64-linux-gnu-gcc: error trying to exec 'cc1': execvp: No such file or directory
> nginx[20011]: Makefile:332: recipe for target 'inlinetest_0cff.o' failed
The problem is that your PATH is empty when relevant compilation
happens. You try to set it in the code using "$ENV{'PATH'} =
...", but it doesn't work as this happens _after_ "use Inline...",
because "use ..." operators are executed at compile time in Perl,
much like BEGIN{}.
A simple fix would be to set PATH in a BEGIN{} block at compile
time:
BEGIN { $ENV{'PATH'} = '/bin/:/usr/bin/'; }
use Inline ...
Alternativel, you can use nginx "env" directive to set PATH or
preserve it from original environment, see http://nginx.org/r/env.
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx
mailing list