chromatic wrote:
> On Friday 22 December 2006 11:08, Ron Blaschke wrote:

>> There are three steps necessary (four using VC8).
>>
>> 1) Two additional functions need to be exported.
>>     Parrot_register_pmc
>>     Parrot_unregister_pmc
> 
> In some .def file somewhere, or marked somehow in the source code?

The necessary change is:

----
$ svn diff include/parrot/extend.h
Index: include/parrot/extend.h
===================================================================
--- include/parrot/extend.h     (revision 16218)
+++ include/parrot/extend.h     (working copy)
@@ -121,8 +121,8 @@

 Parrot_Language Parrot_find_language(Parrot_INTERP, char*);

-void Parrot_register_pmc(Parrot_INTERP, Parrot_PMC);
-void Parrot_unregister_pmc(Parrot_INTERP, Parrot_PMC);
+PARROT_API void Parrot_register_pmc(Parrot_INTERP, Parrot_PMC);
+PARROT_API void Parrot_unregister_pmc(Parrot_INTERP, Parrot_PMC);
 Parrot_PMC Parrot_get_dod_registry(Parrot_INTERP);
----

I thought I'd collect everything necessary together and submit a single
patch.


>> 2) Change the compiler and linker flags.
>>
>> 3) Add the path to parrot.dll to Path, so it can be found during (test)
>> execution.
> 
> That's tough on all platforms.  Is it a simple case of adding ../../blib/lib 
> to $ENV{PATH} before executing the tests?

Yes.  ${libdir} points to F<../../blib/lib>, but on Windows the DLL is
put into the root directory, like F<miniparrot.exe> or F<parrot.exe>.
Not sure about other platforms.  So F<../..> would do for Windows.


>> Step 2 is the hard part, and I'd like to ask for some advice.  The flags
>> seem to come from F<parrot.pc>, generated from the input file
>> F<config/gen/makefiles/parrot.pc.in>.  The relevant entries are:
>>
>>     Libs: -L${libdir} -lparrot
>>     Cflags: -I${includedir}
>>
>> The C<Cflags> seem to be added correctly in Module::Build (version
>> 0.2805) to the C<extra_compiler_flags>, but they don't get passed to the
>> compiler.  I needed to change C<incpath> for this.  This seems to be an
>> issue with Module::Build, but I need to double check this.
> 
> Is C<incpath> a separate M::B option for Win32?

I have to admit I just hacked F<_build/build_params> to get P::E
compiled.  I'm not sure where C<incpath> is coming from.  On my box it says:

    'incpath' => '\\include'

I'll have to keep searching for this.

C<extra_compiler_flags> is:

           'extra_compiler_flags' => [
                                       '-I/usr/local/include',
                                       '-I..\\..\\include'
                                     ],

But I don't see them during the call to the compiler.

> 
>> Second, C<Libs> is not right for Visual C++ (but added to
>> C<extra_linker_flags> and passed to the linker.)
>>
>> F<config/gen/makefiles/parrot.pc.in> says:
>>
>>     Libs: -L${libdir} -lparrot @icu_shared@ @libs@
>>
>> Visual C++ needs:
>>
>>     ${libdir}/libparrot.lib @icu_shared@ @libs@
>> or
>>     /LIBPATH:${libdir} libparrot.lib @icu_shared@ @libs@
>>
>> Any recommended way to get there?
> 
> 
> Does pkg-config work on Windows?  If not, modifying that file is rather moot, 
> and Parrot::Embed can work another way.  Another option is to use 
> Parrot::Config, if that'll be available and installed.  That might be a 
> better option.
>
> I'm open to ideas.

Sorry, no pkg-config here.  Not sure if there are other toolkits, like
MinGW or Cygwin, that are providing it.  I'm not a Linux/UNIX regular,
is F<parrot.pc> used by this tool?  The file is parsed directly by
P::E's Build.PL, so I thought it's just a random format.

Just thinking loud here, but even if there isn't a pkg-config on Windows
we could reuse the file.  C<parrot.pc> is generated by Configure using
the template F<config/gen/makefiles/parrot.pc.in>.  One way I can see
would be to put the parrot library options into a variable, like this:

    Libs: @libparrot_shared@ @icu_shared@ @libs@

with @libparrot_shared@ == "-L${libdir} -lparrot" on GCC (not sure where
else, too)
and  @libparrot_shared@ == "${libdir}/libparrot.lib" on VC.

Another way would be to template all of C<parrot.pc.in>, by adding
C<vc_parrot.pc.in>, and select the right template during source generation.

In my opinion Parrot::Config is probably not the best way to handle
this.  The paths are relative and not expanded, for example:

    'cc_inc' => '-I./include',
    'libparrot' => '$(LIBPARROT_SHARED)',
    'libparrot_ldflags' => 'libparrot$(A)',
    'libparrot_shared' => 'libparrot$(SHARE_EXT)',

I guess P::C is more for introspection how Parrot was built, not how to
build an extension.

Maybe it would be enough to come up with some platform specific search
code for Windows in P::C's Build.PL.  After all, everything we need is
the library and the headers.  I'm wondering how other Perl modules
handle this...

Any thoughts are greatly appreciated,
Ron

Reply via email to