mpsd.lua 12 KB

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