Win32::API now installs from the CPAN shell

brian_d_foy on 2006-12-23T20:26:00

The latest version of Win32::API, marked v0.46, should now correctly install even from the CPAN shell. Finally!

There is a fair amount of work behind, but now it should build, test and install cleanly on all major platform and compiler combinations.
In short, the build of API_test.dll is now gone. In the 0.46 package there's a pre-built library compiled with MSVC 6, that happens to work smoothly when loaded by any Win32::API flavour. The test suite is now simpler and takes compiler/environment differences into account.

I directly tested it on:

  • Source-compiled perl 5.8.8 + MSVC 6 + nmake
  • Source-compiled perl 5.8.8 + MSVC 2003 (Free toolkit) + nmake
  • Strawberry perl + MinGW GCC + GNU make
  • Strawberry perl + MinGW GCC + dmake
  • Cygwin perl + gcc + GNU make

Obviously there are lots of problems and improvements possible:

  • For example, it'd be great to investigate why gcc built the (now gone) test dll without all kernel32.lib imports...
  • Also, why functions with double or float return values always segfault when called.
  • And last but not least, callback interface works fully only under MSVC 6.

I don't know now when I'll find the time to go on with this work, but for now, have fun!


I wish I could say all is well, but...

bart on 2006-12-23T22:34:43

I've tried test COSIMO/Win32-API-0.46.tar.gz in the CPAN shell on the two platforms I have available, and it kind of works... but both seem to fall over a secundary test somewhere. The same one.
  1. ActivePerl 5.8.8 build 817 (Mar 20 2006) + MinGW gcc 3.2.3. ActivePerl depends on ActivePerl::Config to dynamically override settings in Config.

    C:\Perl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0, '..
    \blib\lib', '..\blib\arch')" t/*.t
    t/02_Callback....ok 1/8# Compiler name:cl
    # Compiler version:12
    # $^E=Het systeem kan de opgegeven omgevingsoptie niet vinden
    t/02_Callback....dubious
            Test returned status 5 (wstat 1280, 0x500)
    DIED. FAILED test 8
            Failed 1/8 tests, 87.50% okay
    Failed Test     Stat Wstat Total Fail  Failed  List of Failed
    ------------------------------------------------------------------------ -------
    t/02_Callback.t    5  1280     8    2  25.00%  8
    Failed 1/1 test scripts, 0.00% okay. 1/8 subtests failed, 87.50% okay.
    NMAKE : fatal error U1077: 'C:\WINDOWS\system32\cmd.exe' : return code '0x5'
    Stop.
      nmake test -- OK
    Note that despite the failed test, nmake still says "OK".

    And notice how it goes searching for the wrong compiler: "cl", not "gcc", as perl -V:cc does say:

    cc='gcc';
  2. PXPerl 5.8.7 + MinGW gcc 3.2.3

    D:\PXPerl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0, '
    ..\blib\lib', '..\blib\arch')" t/*.t
    t/02_Callback....ok 1/8# Compiler name:icl
    # Compiler version:0
    # $^E=
    Free to wrong pool 222778 not e58b2778, <DATA> line 164.
    t/02_Callback....dubious
            Test returned status 5 (wstat 1280, 0x500)
            after all the subtests completed successfully
    Failed Test     Stat Wstat Total Fail  Failed  List of Failed
    ------------------------------------------------------------------------ -------
    t/02_Callback.t    5  1280     8    0   0.00%  ??
    1 subtest skipped.
    Failed 1/1 test scripts, 0.00% okay. 0/8 subtests failed, 100.00% okay.
    NMAKE : fatal error U1077: 'C:\WINDOWS\system32\cmd.exe' : return code '0x5'
    Stop.
      D:\PXPerl\bin\nmake.EXE test -- OK

    Again, final verdict is "OK", despite a "freed to the wrong pool" error, which sounds very serious to me. Also notice the message "Test returned status 5 (wstat 1280, 0x500) after all the subtests completed successfully".

    And, once more, the compiler it tried to use is wrong again: "icl" — most likely the compiler PXPerl was built with (an Intel compiler, IIRC), but not the compiler that perl -V:cc reports back ("gcc").

    There sure is a pattern there: it seems to me like something here is trying too hard to find out the "truth" about the C compiler, ignoring the more obvious results.

Re:I wish I could say all is well, but...

cosimo on 2006-12-24T14:03:01

Hi Bart, this is interesting. Thanks for your time.

  • ActivePerl 5.8.8 + Gcc

    AFAIK, ActivePerl comes compiled by MSVC6, which is cl.exe version 12, but you are using with gcc. Correct?

    In the Callback tests, which btw fail unless you have MSVC6, I needed a way to check the compiler and I used $Config{ccname} and $Config{ccversion} instead of only using $Config{cc}, because I only must distinguish between MSVC 6 and 7+.

    Can you report your cc, ccname and ccversion variables? Or better, file a bug on RT attaching your Config_heavy.pl? Thanks.

  • PXPerl

    I didn't try that, but I suspect it's the same issue, as you said.

Thank you!

dagolden on 2006-12-31T16:44:01

Works smoothly on Strawberry Perl. I've updated it on the Vanilla Perl Problem Modules page on win32.perl.org. Thank you very much for all your work on this!

Works for me

Ron Savage on 2006-12-31T22:14:12

All tests successful.
This is perl, v5.8.7 built for MSWin32-x86-multi-thread