mpsd.lua 11 KB

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