123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224(******************************************************************************)(* This file is part of the Dose library http://www.irill.org/software/dose *)(* *)(* Copyright (C) 2010,2011 Ralf Treinen <ralf.treinen@pps.jussieu.fr> *)(* *)(* This library is free software: you can redistribute it and/or modify *)(* it under the terms of the GNU Lesser General Public License as *)(* published by the Free Software Foundation, either version 3 of the *)(* License, or (at your option) any later version. A special linking *)(* exception to the GNU Lesser General Public License applies to this *)(* library, see the COPYING file for more information. *)(* *)(* Work developed with the support of the Mancoosi Project *)(* http://www.mancoosi.org *)(* *)(******************************************************************************)modulePcre=Re_pcreopenExtLibopenDose_commonincludeUtil.Logging(structletlabel="dose_deb.architecture"end)(* first column of /usr/share/dpkg/cputable *)(* the line numbers correspond to the line numbers in /usr/share/dpkg/cputable
* to be quickly able to find changes *)letcpulist=ref[(* lines 19..25 *)"i386";"ia64";"alpha";"amd64";"armeb";"arm";"arm64";(* lines 26..31 *)"avr32";"hppa";"m32r";"m68k";"mips";"mipsel";(* lines 32..36 *)"mipsr6";"mipsr6el";"mips64";"mips64el";"mips64r6";(* lines 37..41 *)"mips64r6el";"nios2";"or1k";"powerpc";"powerpcel";(* lines 42..48 *)"ppc64";"ppc64el";"s390";"s390x";"sh3";"sh3eb";"sh4";(* lines 49..52 *)"sh4eb";"sparc";"sparc64";"tilegx"](* from /usr/share/dpkg/tupletable
*
* the line numbers correspond to the line numbers in
* /usr/share/dpkg/tupletable to be quickly able to find changes
*
* debian tuple (abi,libc,os,cpu) debian arch *)lettupletable=ref[(("eabi","uclibc","linux","arm"),"uclibc-linux-armel");(* line 8 *)(("base","uclibc","linux","<cpu>"),"uclibc-linux-<cpu>");(("eabihf","musl","linux","arm"),"musl-linux-armhf");(* line 10 *)(("base","musl","linux","<cpu>"),"musl-linux-<cpu>");(("eabihf","gnu","linux","arm"),"armhf");(("eabi","gnu","linux","arm"),"armel");(("abin32","gnu","linux","mips64r6el"),"mipsn32r6el");(("abin32","gnu","linux","mips64r6"),"mipsn32r6");(* line 15 *)(("abin32","gnu","linux","mips64el"),"mipsn32el");(("abin32","gnu","linux","mips64"),"mipsn32");(("abi64","gnu","linux","mips64r6el"),"mips64r6el");(("abi64","gnu","linux","mips64r6"),"mips64r6");(("abi64","gnu","linux","mips64el"),"mips64el");(* line 20 *)(("abi64","gnu","linux","mips64"),"mips64");(("spe","gnu","linux","powerpc"),"powerpcspe");(("x32","gnu","linux","amd64"),"x32");(("base","gnu","linux","<cpu>"),"<cpu>");(("eabihf","gnu","kfreebsd","arm"),"kfreebsd-armhf");(* line 25 *)(("base","gnu","kfreebsd","<cpu>"),"kfreebsd-<cpu>");(("base","gnu","knetbsd","<cpu>"),"knetbsd-<cpu>");(("base","gnu","kopensolaris","<cpu>"),"kopensolaris-<cpu>");(("base","gnu","hurd","<cpu>"),"hurd-<cpu>");(("base","bsd","dragonflybsd","<cpu>"),"dragonflybsd-<cpu>");(* line 30 *)(("base","bsd","freebsd","<cpu>"),"freebsd-<cpu>");(("base","bsd","openbsd","<cpu>"),"openbsd-<cpu>");(("base","bsd","netbsd","<cpu>"),"netbsd-<cpu>");(("base","bsd","darwin","<cpu>"),"darwin-<cpu>");(("base","sysv","aix","<cpu>"),"aix-<cpu>");(* line 35 *)(("base","sysv","solaris","<cpu>"),"solaris-<cpu>");(("eabi","uclibc","uclinux","arm"),"uclinux-armel");(("base","uclibc","uclinux","<cpu>"),"uclinux-<cpu>");(("base","tos","mint","m68k"),"mint-m68k");(("base","gnu","linux","<cpu>"),"linux-<cpu>")(* this entry is not from /usr/share/dpkg/tupletable *)(* the "linux-" prefix is commented in scripts/Dpkg/Arch.pm with "XXX: Might disappear in the future, not sure yet." *)]letdebarch_to_debtuple=Hashtbl.create(List.length!tupletable*List.length!cpulist)lettupletable_done=reffalseletmangle_cpu_placeholder((abi,libc,os,cpu),debarch)=ifcpu="<cpu>"thenList.iter(func->letdt=(abi,libc,os,c)inlet(_,da)=String.replace~str:debarch~sub:"<cpu>"~by:cinHashtbl.replacedebarch_to_debtupledadt)!cpulistelseHashtbl.replacedebarch_to_debtupledebarch(abi,libc,os,cpu)letread_tupletable?(ttfile=None)?(ctfile=None)()=if!tupletable_done&&ttfile=None&&ctfile=Nonethen()else((* if cputable file was given, overwrite built-in table *)(matchctfilewith|Somefn->cpulist:=[];letic=open_infninifinput_lineic<>"# Version=1.0"thenfatal"Require cputable version 1.0";(* to stay most compatible with dpkg, it would be best to use its
* regex from from scripts/Dpkg/Arch.pm to parse this file.
* Unfortunately Re.pcre doesnt support look-ahead/look-behind
* assertions *)letauxline=ifline.[0]='#'||not(String.containsline'\t')then()elseletspacei=String.indexline'\t'inletcpu=String.subline0spaceiinifnot(List.memcpu!cpulist)thencpulist:=cpu::!cpulistinList.iteraux(Std.input_listic);close_inic|None->());(* if tupletable was given, overwrite built-in table, otherwise parse
* built-in table *)(matchttfilewith|Somefn->(* this is an implicit assumption of dpkg *)mangle_cpu_placeholder(("base","gnu","linux","<cpu>"),"linux-<cpu>");letic=open_infninifinput_lineic<>"# Version=1.0"thenfatal"Require tupletable version 1.0";(* to stay most compatible with dpkg, it would be best to use its
* regex from from scripts/Dpkg/Arch.pm to parse this file.
* Unfortunately Re.pcre doesnt support look-ahead/look-behind
* assertions *)letauxline=ifline.[0]='#'||not(String.containsline'\t')then()elseletspaceli=String.indexline'\t'inletspaceri=String.rindexline'\t'inletdebtuple=String.subline0spaceliinletdebarch=String.subline(spaceri+1)(String.lengthline-spaceri-1)inmatchString.nsplitdebtuple"-"with|[abi;libc;os;cpu]->mangle_cpu_placeholder((abi,libc,os,cpu),debarch)|_->fatal"Cannot parse debtuple: %s"debtupleinList.iteraux(Std.input_listic);close_inic|None->List.itermangle_cpu_placeholder!tupletable);tupletable_done:=true)(* this function performs what debarch_is form libdpkg-perl does *)letsrc_matches_archaliasreal=read_tupletable();ifalias=real||alias="any"||alias="all"thentrueelseletreal=Hashtbl.find_optiondebarch_to_debtuplerealin(* see libdpkg-perl function debwildcard_to_debtuple *)letalias=matchString.nsplitalias"-"with|["any";libc;os;cpu]->Some("any",libc,os,cpu)|[abi;"any";os;cpu]->Some(abi,"any",os,cpu)|[abi;libc;"any";cpu]->Some(abi,libc,"any",cpu)|[abi;libc;os;"any"]->Some(abi,libc,os,"any")|["any";os;cpu]->Some("any","any",os,cpu)|[libc;"any";cpu]->Some("any",libc,"any",cpu)|[libc;os;"any"]->Some("any",libc,os,"any")|["any";cpu]->Some("any","any","any",cpu)|[os;"any"]->Some("any","any",os,"any")|["any"]->Some("any","any","any","any")|_->(* only look up in the table if none of the parts is "any" *)Hashtbl.find_optiondebarch_to_debtuplealiasinmatch(real,alias)with|(Some(r1,r2,r3,r4),Some(a1,a2,a3,a4))->(a1=r1||a1="any")&&(a2=r2||a2="any")&&(a3=r3||a3="any")&&(a4=r4||a4="any")|_->false