xiaoyafeng has asked for the wisdom of the Perl Monks concerning the following question:

I've found ExtUtils::Embed's output is affected by arg. sequence:
C:\>perl -MExtUtils::Embed -e"ldopts" -e"ccopts" Set up gcc environment - 3.4.5 (mingw-vista special r3) -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DUSE_SITEC +USTOMIZE - DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -D_USE_32BIT_T +IME_T -DPE RL_MSVCRT_READFIX -DHASATTRIBUTE -fno-strict-aliasing -mms-bitfields +-I"C:\Perl \lib\CORE" C:\>perl -MExtUtils::Embed -e"ccopts" -e"ldopts" Set up gcc environment - 3.4.5 (mingw-vista special r3) -L"C:\Perl\lib\CORE" C:\Perl\lib\CORE\perl512.lib C:\Perl\site\lib\ +auto\MinGW \lib\libkernel32.a C:\Perl\site\lib\auto\MinGW\lib\libuser32.a C:\Perl +\site\lib\ auto\MinGW\lib\libgdi32.a C:\Perl\site\lib\auto\MinGW\lib\libwinspool. +a C:\Perl\ site\lib\auto\MinGW\lib\libcomdlg32.a C:\Perl\site\lib\auto\MinGW\lib\ +libadvapi3 2.a C:\Perl\site\lib\auto\MinGW\lib\libshell32.a C:\Perl\site\lib\auto +\MinGW\lib \libole32.a C:\Perl\site\lib\auto\MinGW\lib\liboleaut32.a C:\Perl\site +\lib\auto\ MinGW\lib\libnetapi32.a C:\Perl\site\lib\auto\MinGW\lib\libuuid.a C:\P +erl\site\l ib\auto\MinGW\lib\libws2_32.a C:\Perl\site\lib\auto\MinGW\lib\libmpr.a + C:\Perl\s ite\lib\auto\MinGW\lib\libwinmm.a C:\Perl\site\lib\auto\MinGW\lib\libv +ersion.a C :\Perl\site\lib\auto\MinGW\lib\libodbc32.a C:\Perl\site\lib\auto\MinGW +\lib\libod bccp32.a C:\Perl\site\lib\auto\MinGW\lib\libcomctl32.a C:\Perl\site\li +b\auto\Min GW\lib\libmsvcrt.a -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DUSE_SITEC +USTOMIZE - DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -D_USE_32BIT_T +IME_T -DPE RL_MSVCRT_READFIX -DHASATTRIBUTE -fno-strict-aliasing -mms-bitfields +-I"C:\Perl \lib\CORE"
as above, if you put ldopts before ccopts, perl will omit it silently. Is it a bug or feature? it's really a pitfall to me tho ;)




I am trying to improve my English skills, if you see a mistake please feel free to reply or /msg me a correction

Comment on ExtUtils::Embed function sequence affect output?
Download Code
Re: ExtUtils::Embed function sequence affect output? (B::Deparse)
by Anonymous Monk on Jul 16, 2013 at 13:04 UTC

    as above, if you put ldopts before ccopts, perl will omit it silently. Is it a bug or feature? it's really a pitfall to me tho ;)

    Use Basic debugging checklist always

    $ perl -MO=Deparse -MExtUtils::Embed -e"ldopts" -e"ccopts" use ExtUtils::Embed; ldopts(ccopts()); -e syntax OK
    and try
    perl -MExtUtils::Embed -e"ldopts; " -e"ccopts"
      Thanks! the article you refer is very helpful!




      I am trying to improve my English skills, if you see a mistake please feel free to reply or /msg me a correction

Re: ExtUtils::Embed function sequence affect output?
by rjt (Deacon) on Jul 16, 2013 at 13:14 UTC
    C:\>perl -MExtUtils::Embed -e"ccopts" -e"ldopts"

    This only works by accident. See perlrun (emphasis mine):

    -e commandline

    may be used to enter one line of program. If -e is given, Perl will not look for a filename in the argument list. Multiple -e commands may be given to build up a multi-line script. Make sure to use semicolons where you would in a normal program.

    Or, try this:

    perl -le 'print' -e '"foo"'
      This only works by accident. See perlrun (emphasis mine):

      This is not by accident, it's documented in perlembed:

      perldoc perlembed: Now compile this program (I'll call it *interp.c*) into an executable: % cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`

      I'll presume this usage is official because it document in perldoc. I think perl5 porter should make this clearer. I.E: use perl -MExtUtils::Embed -e'ldopts;' -e'ccopts;' instead.

      BTWI can use

      perl -MExtUtils::Embed -e'ldopts' && perl -MExtUtils::Embed -e'ccopts'
      to get the same result, it looks a little bit silly tho.





      I am trying to improve my English skills, if you see a mistake please feel free to reply or /msg me a correction

        This is not by accident, it's documented in perlembed: ... I'll presume this usage is official because it document in perldoc.

        ExtUtils::Embed has nothing to suggest this usage is supported. perlembed documents a particular ordering that happens to work without semicolons due to the way those two functions happen to process arguments (which is only obvious upon review of the module code). Do you really think this was the intention of the developers or documentation team?

        I think perl5 porter should make this clearer.

        I agree, the perlembed docs invite trouble. Why don't you open a perlbug?

        I.E: use perl -MExtUtils::Embed -e'ldopts;' -e'ccopts;' instead.

        Or perl -MExtUtils::Embed -e 'ldopts; ccopts' (I'd suggest -eldopts,ccopts, but while the comma works here, it doesn't everywhere.)