En utilisant ExtUtils :: MakeMaker, comment puis-je comstackr un exécutable en utilisant les mêmes parameters que mon module XS?

Avec un module Perl XS utilisant une bibliothèque C, supposons qu’un Makefile.PL est configuré correctement pour que tous les emplacements d’en-tête et de bibliothèque, les indicateurs de compilateur et d’éditeur de liens, etc. fonctionnent correctement.

Supposons maintenant que je souhaite inclure un petit programme C avec ledit module XS utilisant la même bibliothèque C sous-jacente. Quel est le moyen correct, indépendant de la plate-forme, de spécifier l’exécutable cible afin qu’il soit construit avec les mêmes parameters et les mêmes indicateurs?

Si je fais ce qui suit

sub MY::postamble { return <<FRAG; target$Config{exe_ext}: target$Config{obj_ext} target$Config{obj_ext}: target.c FRAG } 

Je ne comprends pas les emplacements, listes de bibliothèques, etc. que j’ai configurés dans les arguments de WriteMakefile . Si je commence à écrire des règles manuellement, je dois prendre en compte au moins make , dmake et nmake . Je ne peux pas trouver un moyen simple de spécifier des bibliothèques sur lesquelles créer un lien si vous utilisez ExtUtils :: CBuilder .

J’ai dû louper quelque chose. Je vous en serais reconnaissant si vous pouviez le signaler.

    EU :: MM ne sait pas comment créer un fichier exécutable . Si vous avez besoin de le faire, vous devrez tenir compte de différentes chaînes d’outils du compilateur. Je l’ai fait au moins une fois , mais je ne prétends pas que c’est complètement portable (juste assez portable).

    Une solution à long terme serait un cadre de compilation approprié, sur lequel je travaille mais qui n’est pas négligeable.

    Vous voudrez peut-être regarder Dist :: Zilla . Je l’utilise parce que je ne me souviens jamais comment faire cela non plus. Avec un fichier dist.ini assez petit et boilerplaty pour lui dire quels plugins utiliser, il générera tous les systèmes de construction adéquats pour vous, y compris l’ensemble du nécessaire Makefile.PL . Pensez-y comme un fabricant de makefile. Je l’utilise pour l’un de mes plus petits modules CPAN basés sur le C: https://github.com/morungos/p5-Algorithm-Diff-Fast , qui ne fonctionne pas très bien comme module, mais possède une construction correcte. La magie nécessaire est dans inc/DiffMakeMaker.pm .

    Cependant, la réponse courte est d’examiner les parameters supplémentaires que ce composant place dans Makefile.PL :

     LIBS => [''], INC => '-I.', OBJECT => '$(O_FILES)', # link all the C files too 

    Ajoutez simplement ces options dans votre Makefile.PL devrait lui permettre de construire un Makefile qui gère C ainsi que XS, et les lie ensemble pour le Perl.

    Parce que, bien que EU :: MM ne sache pas créer un exécutable, la plupart de ce qu’il fait pour créer un Makefile. Et c’est plus qu’heureux de faire ce qui est nécessaire pour coller correctement C et Perl.