On Friday 22 December 2006 12:54, Ron Blaschke wrote: > 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.
That patch works for me, but if you want to hold off it's fine. Anything that embeds Parrot needs to use those APIs anyway, so it's not a P::E specific fix. > > 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. Alright. Unix needs a similar fix, so I think I'll have to find some way to set that for C<./Build test>, so when it launches child processes, they have the correct environment variables to find the shared library. (I think C<LD_RUN_PATH> works fairly well for the Unixes I know.) > > 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. Right. That's the point where Jerry and I had trouble; we couldn't quite figure out the right compiler flags for Win32. > 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. It may be somewhere in the guts of ExtUtils::CBuilder. > 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. It's a Unix tool that helps linking against installed libraries. F<Build.PL> parses it because it's probably close to correct. > 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. Unless and until there's a pkg-config for Windows, it's probably not worth doing this, as nothing else will use it. > 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. Fair enough. > 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... There are really only two things that P::E needs in two places: - the header and library path for compiling and linking - the library path for running This is generally only tricky when building in-tree, as there's no guarantee of an installed Parrot. Outside of the tree, there's no point in continuing if the headers aren't present; I'm not going to scan the attached mount points to try to find a likely target. -- c