Upgrade to Pro — share decks privately, control downloads, hide ads and more …

レガシーPerlビルド ~現代に蘇るPerl[1-2].0とPerl6~

AnaTofuZ
January 26, 2019

レガシーPerlビルド ~現代に蘇るPerl[1-2].0とPerl6~

YAPC::Tokyo 2019でのトークです

AnaTofuZ

January 26, 2019
Tweet

More Decks by AnaTofuZ

Other Decks in Technology

Transcript

  1. my $self = shift; • 八雲アナグラ (id:AnaTofuZ) • 最近はCとCbC(軽量継続が入ったC言語)
 Perlなどを書いている

    • オリオンビールと泡盛を飲むのが目的の団体
 Okinawa.pmとPerl入学式in沖縄所属です
  2. • Perlのビルド方法 • Perl1.0 • Perl2.0 • Perl3.0 • Perl4.0

    • Perl5.0の動かし方 • Perl6についてちょっと触れる
  3. $git tag if-0.0603 if-0.0604 if-0.0605 perl-1.0 perl-1.0.15 perl-1.0.16 perl-2.0 perl-2.001

    perl-3.000 perl-3.044 perl-4.0.00 perl-4.0.36 perl-5.000 perl-5.000o
  4. tar ~/w/p/o/p/t/perl5-perl-1.0 » ls -la total 816 drwxr-xr-x 44 anatofuz

    staff 1408 Dec 18 1987 ./ drwxr-xr-x 6 anatofuz staff 192 Jan 26 05:35 ../ -rwxr-xr-x 1 anatofuz staff 27329 Dec 18 1987 Configure* -rw-r--r-- 1 anatofuz staff 226 Dec 18 1987 EXTERN.h -rw-r--r-- 1 anatofuz staff 224 Dec 18 1987 INTERN.h -rw-r--r-- 1 anatofuz staff 5872 Dec 18 1987 MANIFEST -rw-r--r-- 1 anatofuz staff 3522 Dec 18 1987 Makefile.SH -rw-r--r-- 1 anatofuz staff 3386 Dec 18 1987 README -rw-r--r-- 1 anatofuz staff 84 Dec 18 1987 Wishlist -rw-r--r-- 1 anatofuz staff 47964 Dec 18 1987 arg.c -rw-r--r-- 1 anatofuz staff 5478 Dec 18 1987 arg.h -rw-r--r-- 1 anatofuz staff 3366 Dec 18 1987 array.c
  5. Perl • make dpenedは実はperl5でも実行されている(自動実行される) • 基本的には現代のperl5とほとんど変わりない!! • old perl(厳密には3くらいまで)は,手動でmake dependする

    • 現在のlinuxやbsdベースなmac osのビルドフローと変わらない のはラリー・ウォールがUNIXの延長でPerlを考えたからである 為な気がしている(個人の見解です)
  6. metacon g ( ) sub main'profile { &auto_main'profile; } sub

    auto_main'profile { &main'dataload; } # Load the calling function from DATA segment and call it. This function is # called only once per routine to be loaded. sub main'dataload { local($__packname__) = (caller(1))[3]; $__packname__ =~ s/::/'/; local($__rpackname__) = $__packname__; local($__at__) = $@; $__rpackname__ =~ s/^auto_//; &perload'load_from_data($__rpackname__); local($__fun__) = "$__rpackname__"; $__fun__ =~ s/'/'load_/; eval "*$__packname__ = *$__fun__;"; # Change symbol table entry die $@ if $@; # Should not happen $@ = $__at__; # Restore value $@ had on entrance &$__fun__; # Call newly loaded function
  7. metacon g • Tux(H.Merjin Brand)さん以外
 殆ど詳しい人がおらず問題に一部でなった. • 2016年のQA Hackathonなどから海外のPerlMongerの間で metaconfigが話題にでる

    • GitHubにリポジトリを移したり
 READMEを書いたりなどの作業がその後進み
 PerlToolChainSummitでもmetaconfigの話がされていた模様
  8. (main ) main(argc,argv,env) register int argc; register char **argv; register

    char **env; { register STR *str; register char *s; char *index(); linestr = str_new(80); str = str_make("-I/usr/lib/perl "); /* first
  9. (main ) main(argc,argv,env) register int argc; register char **argv; register

    char **env; { register STR *str; register char *s; char *index(); linestr = str_new(80); str = str_make("-I/usr/lib/perl "); /* first mainͷܕ͕ແ্͍ʹenvΛ Ҿ਺Ͱ࣋ͬͯ͘Δ Ϩδελʹࡌ͍ͤͨؾ࣋ͪΛ දͨ͠ register͕ଟ༻
  10. (main ) main(argc,argv,env) register int argc; register char **argv; register

    char **env; { register STR *str; register char *s; char *index(); linestr = str_new(80); str = str_make("-I/usr/lib/perl "); /* first ͦ΋ͦ΋Ҿ਺ͷએݴ͕͍ΘΏΔ
 K&RελΠϧ
  11. Perl5 #ifdef NO_ENV_ARRAY_IN_MAIN extern char **environ; int main(int argc, char

    **argv) #else int main(int argc, char **argv, char **env) #endif { int exitstatus, i; #ifdef PERL_GLOBAL_STRUCT struct perl_vars *my_vars = init_global_struct(); # ifdef PERL_GLOBAL_STRUCT_PRIVATE int veto; mainؔ਺͚ͩͷperlmain.cͰ intܕͰهड़
  12. Perl2.0 • 付属のConfigureはそのまま使えるが
 make dependした時にmac osのヘッダーファイル関連で破滅 ./config.h:172:19: warning: '/*' within

    block comment [-Wcomment] #/*undef TMINSYS /**/ ^ /usr/include/AvailabilityInternal.h:38846:2: error: #else after #else #else ^ /usr/include/AvailabilityInternal.h:38203:10: error: unterminated conditional directive #if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_13 ^ /usr/include/AvailabilityInternal.h:38116:10: error: unterminated conditional directive #if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_12_4
  13. Con gure <2> • mac osにgccをinstallする • mac osに標準では行っているgccはgccのフリをしたllvm/clang •

    gccでビルドする様にMakefileを書き換えるとよしなに動く • Mojaveではそもそもgccをinstallするのが難しいので
 最近はこの方法を取らない…
  14. Make le • 無事生成したMakefileであるが, 微妙にビルドできない状況に なっている • Makefileに謎の <built-in>と <command

    line>が出現 • ヘッダーファイルとして存在し無い為ビルドできない
 (昔はこの記法があった?) arg.o: /usr/include/time.h arg.o: <built-in> arg.o: <command line>
  15. makedepend.SH $egrep '^#include ' ` cat .clist` ` cat .hlist`

    >.deptmp $echo "Updating Makefile..." <.clist $sed -n \ -e '/\//{' \ -e 's|^\(.*\)/\(.*\)\.c|\2.o: \1/\2.c; '"$defrule \1/\2.c|p" \ -e d \ -e '}' \ -e 's|^\(.*\)\.c|\1.o: \1.c|p' >> Makefile.new <.hlist $sed -n 's|\(.*/\)\(.*\)|s= \2= \1\2=|p' >.hsed <.deptmp $sed -n 's|c:#include "\(.*\)".*$|o: \1|p' | \ $sed 's|^[^;]*/||' | \ $sed -f .hsed >> Makefile.new <.deptmp $sed -n 's|c:#include <\(.*\)>.*$|o: /usr/include/\1|p' \ >> Makefile.new <.deptmp $sed -n 's|h:#include "\(.*\)".*$|h: \1|p' | \ $sed -f .hsed >> Makefile.new
  16. YACC • コメントアウトや!!!!!! %type <ival> prog decl format /*%type <stabval>*/

    %type <cmdval> block lineseq line loop cond sideff nexpr else
  17. C • UIDTYPEが無い…? そんな…? ./perl.h:235:1: error: unknown type name 'UIDTYPE'

    UIDTYPE getuid(); ^ ./perl.h:236:1: error: unknown type name 'UIDTYPE' UIDTYPE geteuid(); ^ ./perl.h:237:1: error: unknown type name 'GIDTYPE' GIDTYPE getgid(); ^ ./perl.h:238:1: error: unknown type name 'GIDTYPE' GIDTYPE getegid();
  18. C • 型変わっとるやんけ!!!!!!! NAME geteuid, getuid -- get user identification

    SYNOPSIS #include <unistd.h> uid_t geteuid(void); uid_t getuid(void);
  19. C • エラーが増えてつらい arg.c:934:43: error: incomplete definition of type 'struct

    tms' apush(ary,str_nmake(((double)timesbuf.tms_utime)/HZ)); ~~~~~~~~^ ./perl.h:226:12: note: forward declaration of 'struct tms' EXT struct tms timesbuf; ^ arg.c:935:43: error: incomplete definition of type 'struct tms' apush(ary,str_nmake(((double)timesbuf.tms_stime)/HZ)); ~~~~~~~~^ ./perl.h:226:12: note: forward declaration of 'struct tms' EXT struct tms timesbuf; ^ arg.c:936:43: error: incomplete definition of type 'struct tms' apush(ary,str_nmake(((double)timesbuf.tms_cutime)/HZ));
  20. C • morecoerがstaticで定義されてないなどとでる malloc.c:155:1: error: static declaration of 'morecore' follows

    non-static declaration malloc.c:126:5: note: previous implicit declaration is here morecore(bucket); ^ malloc.c:164:5: error: non-void function 'morecore' should return a value [- Wreturn-type] return; ^ malloc.c:181:5: error: non-void function 'morecore' should return a value [- Wreturn-type] return; ^