http://qs321.pair.com?node_id=658610

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

When writing a CPAN module, how do I declare a dependency on syscall.ph and get it built automatically if it is lacking?

Recently I was attempting to install Fuse but it just wouldn't pass tests. Eventually I began manually debugging the test suite and it turned on an "optional" use of syscall.ph. On a lark I read the docs for h2ph and ran ( cd /usr/include; h2ph -r -l . ) after which all the tests passed. Fuse didn't declare syscall.ph as a dependency and perhaps it isn't for some people. It was for me. I'd like to patch it appropriately so the normal CPAN infrastructure will go build this stuff automatically.

⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

Replies are listed 'Best First'.
Re: Declaring a dependency on syscall.ph (and getting it generated)
by Zaxo (Archbishop) on Dec 22, 2007 at 06:35 UTC

    That's easy in a makefile. Just preface your command line with a tab under a ".ph" target.

    After Compline,
    Zaxo

      Perhaps you didn't understand the question. I know of many ways to generate things during module-building. What I don't know about is if there is an existing package which already handles .ph file dependencies. If not, what I don't know about is how to generate this sanely myself. I have a guess but I quickly run directly into shell quoting issues and guessing about what compiler options mean. It gets ugly rather quickly. Or... well... maybe it's possible to write a Module::Build plugin which could handle getting the compiler to find the syscall.h file.


      Makefile.PL

      WriteMakefile( ... CC => "$^X bin/fake-cc", # shell quoting matters here! );

      bin/fake-cc

      #!perl for ( map extract_paths( $_ ), @ARGV ) { # stash this somewhere, I guess. } # etc.

      ⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

        I am not aware of an existing mechanism to detect the .ph files and build them. A simple way could be to add something like this in then Makefile.PL:
        if (!eval { require "sys/syscall.ph"; 1 }) { my $save_pwd = cwd; chdir "/usr/include" or die $!; system("h2ph", "sys/syscall.ph"); chdir $save_pwd or die $!; }

        Of course, this should be only run on Unix systems. But not all Unix systems have include files installed, so one has to be protected from this fact. Also, Makefile.PL is often not run under root permissions, so the above would fail. It's also possible that even "make install" is not run as root, so maybe it should also be possible to install the .ph into some other directory.

        Or maybe it would be safer to not use .ph files at all and move the required stuff into an XS module?