mpsd.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. #!/usr/bin/env lua
  2. -- mpsd lua kodlaması
  3. -- build system logic
  4. --kütüphane eklemeleri
  5. local mps_path=os.getenv("MPS_PATH")
  6. if not mps_path then mps_path="/usr/milis/mps" end
  7. package.cpath = package.cpath .. ";"..mps_path.."/lua/?.so"
  8. package.path = package.path .. ";"..mps_path.."/lua/?.lua"
  9. package.cpath = package.cpath .. ";"..mps_path.."/lua/ext/?.so"
  10. package.path = package.path .. ";"..mps_path.."/lua/ext/?.lua"
  11. local lip= require("LIP")
  12. local lfs = require("lfs")
  13. local util=require ("mps_helper")
  14. local yaz=util.yaz
  15. local _assert=util._assert
  16. local has_value=util.has_value
  17. local path_exists=util.path_exists
  18. local shell=util.shell
  19. local get_abspath=util.get_abspath
  20. local get_basename=util.get_basename
  21. local get_content=util.get_content
  22. -- Paketleme dizini, yürürlük dosyasının oluşturulduğu konum
  23. local paketleme_dizin=os.getenv("PAKETLEME_DIZIN")
  24. if not paketleme_dizin then paketleme_dizin=lfs.currentdir() end
  25. -- local mesajlar sonra import edilip, dil entegre sağlanacak
  26. local messages={}
  27. messages.operation_file_is_created=" yürürlük dosyası oluşturuldu."
  28. messages.talimatdir_param_need=" talimat dizin parametresi yok"
  29. messages.talimatdir_is_not_exist=" talimat dizini yok"
  30. messages.talimat_is_not_exist=" talimat dosyası yok"
  31. messages.talimatdir_format_error="talimat dizin formatı isim-surum-devir şeklinde olmalı!"
  32. messages.hash_not_match="shasum uyumsuz kaynak arşiv dosyası!!!"
  33. -- local değişkenler
  34. local talimatdizin = ""
  35. local talimatyol = ""
  36. local isim = ""
  37. local surum = ""
  38. local devir = 0
  39. local isd = ""
  40. local isd_ayrac = "-"
  41. local yururluk_dir = '/tmp'
  42. local install_command = 'mps kur'
  43. local config_dir = mps_path.."/conf/"
  44. local global_variables = config_dir..'mpsd.conf'
  45. local helper_functions = config_dir..'mpsd-helper.sh'
  46. local renkyaz = true -- öntanımlı olarak renkli çıktı yazılır.
  47. local talimatd_format_pattern="([%a%d-_+]+)#([%d%a.]+)-([%d]+)"
  48. -- talimat processing
  49. local tproc={}
  50. -- talimat kaynakların analizi
  51. tproc.kaynak={}
  52. function tproc.kaynak.github(value)
  53. return "https://github.com/"..value.."/archive/v${surum}.tar.gz::$isim-$surum.tar.gz"
  54. end
  55. function tproc.kaynak.bz2(value) return value .. "/$isim-$surum.tar.bz2" end
  56. function tproc.kaynak.gz(value) return value .. "/$isim-$surum.tar.gz" end
  57. function tproc.kaynak.xz(value) return value .. "/$isim-$surum.tar.xz" end
  58. function tproc.kaynak.tgz(value) return value .. "/$isim-$surum.tgz" end
  59. function tproc.kaynak.lz(value) return value .. "/$isim-$surum.tar.lz" end
  60. -- talimat gereklerin analizi
  61. tproc.gerek={}
  62. function tproc.gerek.derleme(value)
  63. local betik=""
  64. for dep in value:gmatch('([^%s]+)') do
  65. --for _,dep in ipairs(value:split(" ")) do
  66. betik=betik..install_command.." "..dep.."\n"
  67. end
  68. return betik
  69. end
  70. -- talimat derle kısmının analizi
  71. tproc.derle={}
  72. tproc.derle.tipler={
  73. gnu = "./configure $confopt $extopt && make ${MAKEJOBS}",
  74. cmake = "cmake $extopt ./ && make ${MAKEJOBS}",
  75. py3 = "python3 setup.py build",
  76. py2 = "python2 setup.py build",
  77. meson = "cd $SRC && milis-meson $isim-$surum build $extopt",
  78. ninja = "mkdir -p build && ninja -C build",
  79. }
  80. function tproc.derle.ekconf(value)
  81. return 'export extopt="'..value..'"'
  82. end
  83. function tproc.derle.yama(value)
  84. if tproc.kaynaklar[tonumber(value)] then
  85. return "patch -Np1 -i $SRC/" .. tproc.kaynaklar[tonumber(value)]
  86. else
  87. return "patch -Np1 -i $SRC/" .. value
  88. end
  89. end
  90. function tproc.derle.betik(value) return value .. "\n" end
  91. function tproc.derle.tip(value) return tproc.derle.tipler[value]end
  92. function tproc.derle.dosya(value) return get_content(talimatdizin .."/"..value) end
  93. -- talimat pakur kısmının analizi
  94. tproc.pakur={}
  95. tproc.pakur.tipler={
  96. gnu = "make DESTDIR=$PKG install $extopt",
  97. py3 = "python3 setup.py install --root=${PKG} --optimize=1 --skip-build",
  98. py2 = "python2 setup.py install --root=${PKG} --optimize=1 --skip-build",
  99. ninja = "DESTDIR=$PKG ninja -C build install",
  100. meson = "cd $SRC && DESTDIR=$PKG ninja -C build install",
  101. }
  102. function tproc.pakur.betik(value) return value end
  103. function tproc.pakur.tip(value) return tproc.pakur.tipler[value] end
  104. function tproc.pakur.dosya(value) return get_content(talimatdizin .."/"..value) end
  105. -- elf dosyaların strip iptali için
  106. -- (mpsd.conf a müdahale için export ile kullanılacak)
  107. function tproc.pakur.strip(value)
  108. if has_value({"no","yok","0"},value) then
  109. --return "set_var \"STRIP\" \"-\""
  110. return "touch $PKG/.nostrip"
  111. else
  112. return "touch $PKG/.nostrip"
  113. end
  114. end
  115. -- strip karaliste belirtilmiş ise
  116. function tproc.pakur.skliste(value)
  117. return "set_var STRIP_KARALISTE=\""..value.."\""
  118. end
  119. --
  120. function tproc.pakur.servis(value)
  121. return ("cd /usr/milis/ayarlar/servisler\nmake DESTDIR=$PKG kur-%s\ncd -"):format(value)
  122. end
  123. -- isim, devir, sürüm değişken analiz işlevi
  124. function get_isd(talimatdizin)
  125. isd = get_basename(talimatdizin)
  126. isim,surum,devir=isd:match(talimatd_format_pattern)
  127. if not (isim and surum and devir) then
  128. messages.talimatdir_format_error:yaz(0)
  129. end
  130. talimatdizin=get_abspath(talimatdizin)
  131. talimatyol=get_abspath(talimatdizin .. '/talimat')
  132. end
  133. -- split a string
  134. function string:split(delimiter)
  135. local result = { }
  136. local from = 1
  137. local delim_from, delim_to = string.find( self, delimiter, from )
  138. while delim_from do
  139. table.insert( result, string.sub( self, from , delim_from-1 ) )
  140. from = delim_to + 1
  141. delim_from, delim_to = string.find( self, delimiter, from )
  142. end
  143. table.insert( result, string.sub( self, from ) )
  144. return result
  145. end
  146. -- bir dosya urlsinin inen isminin alınması
  147. function get_urlfsn(url)
  148. local purl,dname=table.unpack(url:split("::"))
  149. if dname == nil then
  150. local list=url:split("/")
  151. dname=list[#list]
  152. end
  153. return purl,dname
  154. end
  155. -- kaynakların analizi
  156. tproc.kaynaklar={}
  157. tproc.adkaynaklar={}
  158. tproc.inkomutlar={}
  159. function get_kaynaklar(talimat)
  160. local kaynaklar=""
  161. for key,c_value in ipairs(talimat.kaynak) do
  162. local key,value=c_value:match("(.*)@@(.*)")
  163. -- kaynak değerinin düzenlemesi
  164. if tproc.kaynak[key] then
  165. value=tproc.kaynak[key](value)
  166. end
  167. table.insert(tproc.kaynaklar,value)
  168. kaynaklar=kaynaklar .. value .. "\n"
  169. -- kaynakların kayıt adlarının alınması
  170. local url,dname=get_urlfsn(value)
  171. table.insert(tproc.adkaynaklar,dname)
  172. -- kaynakların indirme veya kopyalama surumlarının belirlenmesi
  173. if key == "git" then
  174. table.insert(tproc.inkomutlar,"indir_git "..url.." "..dname)
  175. elseif key == "dosya" then
  176. table.insert(tproc.inkomutlar,("cp -f ${TALIMAT_DIZIN}/%s ${KAYNAKLAR_DEPO}/"):format(dname))
  177. else
  178. table.insert(tproc.inkomutlar,"indir_wget "..url.." "..dname)
  179. end
  180. end
  181. return kaynaklar
  182. end
  183. -- derle işlevi hazırlanması
  184. function get_derle(talimat)
  185. local betik=""
  186. for key,c_value in ipairs(talimat.derle) do
  187. -- key e göre derle analiz
  188. local key,value=c_value:match("(.*)@@(.*)")
  189. -- ilgili anahtar işleve göre betik düzenlenecek.
  190. if tproc.derle[key] == nil then
  191. ("derle kısmında tanımsız anahtar:" .. key):yaz(0)
  192. else
  193. if tproc.derle[key](value) then
  194. betik=betik .. tproc.derle[key](value) .."\n"
  195. else
  196. ("derle kısmında uyumsuz deger:" .. value):yaz(0)
  197. end
  198. end
  199. end
  200. return betik
  201. end
  202. -- pakur işlev hazırlanması
  203. function get_pakur(talimat)
  204. local betik=""
  205. for key,c_value in ipairs(talimat.pakur) do
  206. -- key e göre derle analiz
  207. local key,value=c_value:match("(.*)@@(.*)")
  208. -- ilgili anahtar işleve göre betik düzenlenecek.
  209. if tproc.pakur[key] == nil then
  210. ("pakur kısmında tanımsız anahtar:" .. key):yaz(0)
  211. else
  212. local _val=tproc.pakur[key](value)
  213. if _val ~= nil then
  214. betik=betik .. _val .. "\n"
  215. else
  216. ("pakur kısmında uyumsuz deger:" .. value):yaz(0)
  217. end
  218. end
  219. end
  220. return betik
  221. end
  222. -- derleme gerek işlev hazırlanması
  223. function get_bdeps(talimat)
  224. local betik=""
  225. if talimat.gerek then
  226. for key,value in pairs(talimat.gerek) do
  227. if tproc.gerek[key] ~= nil then
  228. betik=tproc.gerek[key](value)
  229. end
  230. end
  231. end
  232. if betik == "" then betik="echo \"derleme gerekleri yok\"\n" end
  233. return betik
  234. end
  235. -- kaynakların indirme veya kopyalanma işlevinin hazırlanması
  236. function get_download()
  237. local betik=""
  238. for _,inkomut in ipairs(tproc.inkomutlar) do
  239. betik=betik..inkomut.."\n"
  240. end
  241. return betik
  242. end
  243. -- talimat dosyasının sha256sum değerinin alınması
  244. function get_talimathash()
  245. return shell("sha256sum "..talimatyol.." | awk '{print $1}'")
  246. end
  247. -- indirilen kaynakların hash kontrolünün yapılması
  248. function get_hashcheck(talimat)
  249. local betik,hashline,iline,hvalue,file=""
  250. -- mpsd-helper.sh
  251. local hash_kontrol_komut="[ $? -eq 1 ] && hata_olustu \""..messages.hash_not_match.."\""
  252. function hash_betik_al(hashler,komut)
  253. for key,hvalue in pairs(hashler) do
  254. local kaynak=tproc.kaynaklar[key]
  255. if kaynak ~= nil then
  256. _,dname=get_urlfsn(kaynak)
  257. --hashline="hash değeri alınsa doğru da olsa alınacak?"
  258. iline="echo \""..hvalue.." ${KAYNAKLAR_DEPO}/"..dname.."\" | "..komut.." --check\n"
  259. iline=iline..hash_kontrol_komut.."\n"
  260. else
  261. (key.." sıralı linke ait hash değeri bulunamadı!"):yaz(0)
  262. end
  263. betik=betik..iline.."\n"
  264. end
  265. end
  266. if talimat.sha256 then
  267. hash_betik_al(talimat.sha256,"sha256sum")
  268. end
  269. if talimat.sha512 then
  270. hash_betik_al(talimat.sha512,"sha512sum")
  271. end
  272. if betik == "" then betik="echo \"hash kontrol pas geçildi\"\n" end
  273. return betik
  274. end
  275. -- indirilen kaynakların dışarı çıkarılması
  276. function get_extract()
  277. local betik=""
  278. for _,kaynak in ipairs(tproc.adkaynaklar) do
  279. betik=betik.."echo \""..kaynak.."\" >> $SRC/arsiv.list\n"
  280. end
  281. if betik ~= "" then
  282. betik=betik.."kaynak_cikar\n"
  283. end
  284. return betik
  285. end
  286. -- girdilerin kontrolü
  287. local param=arg[1]
  288. _assert(param,messages.talimatdir_param_need)
  289. _assert(path_exists(param),messages.talimatdir_is_not_exist)
  290. _assert(path_exists(param.."/talimat"),messages.talimat_is_not_exist)
  291. talimatdizin=arg[1]
  292. -- isim, sürüm, devir değişkenlerinin ayrıştırılması ve talimatyol atanması
  293. get_isd(talimatdizin)
  294. --local talimat = ini.parse_file(talimatyol)
  295. local talimat = lip.load(talimatyol,{"derle","pakur","kaynak"})
  296. -- talimat üstbilgi değişkenlerin atanması
  297. -- altta atandı
  298. -- talimat kaynakların analizi
  299. -- yürürlük dosyasının ilklenmesi
  300. -- local yururluk_file=yururluk_dir .. "/"..isd..".yur"
  301. -- local yururluk_file=talimatdizin .. "/"..isd..".yur"
  302. local yururluk_file=paketleme_dizin .. "/"..isim..".yur"
  303. local yururluk = io.open(yururluk_file ,"w")
  304. -- yürürlük şablonun atanması
  305. local yur_content = require("yursablon")
  306. yur_content=yur_content:gsub("@([%w_]+)@",{
  307. THASH=get_talimathash(),
  308. TALIMAT_DIZIN=talimatdizin,
  309. GLOBALS=get_content(global_variables),--"source ./"..global_variables,
  310. FUNCTIONS=get_content(helper_functions),--"source ./"..global_variables,
  311. GENTIME="# "..os.date("%x %H:%M:%S") .."\n",
  312. TANIM=talimat.paket.tanim,
  313. URL=talimat.paket.url,
  314. PAKETCI=talimat.paket.paketci,
  315. GRUP=talimat.paket.grup,
  316. ISIM=isim,
  317. SURUM=surum,
  318. DEVIR=devir,
  319. KAYNAK=get_kaynaklar(talimat),
  320. DERLE=get_derle(talimat),
  321. PAKUR=get_pakur(talimat),
  322. --GEREK_KUR=get_bdeps(talimat),
  323. DOWNLOAD=get_download(),
  324. HASH_CHECK=get_hashcheck(talimat),
  325. EXTRACT=get_extract(),
  326. })
  327. yururluk:write(yur_content)
  328. yururluk:close();
  329. shell("chmod +x "..yururluk_file);
  330. (yururluk_file..messages.operation_file_is_created):yaz(1);
  331. -- ("farklı tipte derlemeler yapılacak,"):yaz(2);
  332. -- ("arsiv.bilgi!,"):yaz(2)