makemake.lsp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. (print platform)
  2. (setq CC (select platform
  3. ('AIX "g++ ")
  4. ('LINUX "g++ ")
  5. ('SGI "g++ ")))
  6. (setq watcom_include "$(%WATCOM)\\h")
  7. (defun app (head tail) (if (null head) tail (cons (car head) (app (cdr head) tail))))
  8. (defun get-string-section (string start end)
  9. (if (> start end)
  10. nil
  11. (cons (elt string start) (get-string-section string (+ start 1) end))))
  12. (defun replace-string-section (string start end replacement)
  13. (concatenate 'string
  14. (get-string-section string 0 (- start 1))
  15. replacement
  16. (get-string-section string (+ end 1) (- (length string) 1))))
  17. (defun replace..withdd (string)
  18. (let ((find (search ".." string)))
  19. (if find
  20. (replace..withdd (replace-string-section string find (+ find 1) "dd"))
  21. string)))
  22. (defun replace.. (string)
  23. (if (equal outdir ".")
  24. string
  25. (let ((find (search ".." string)))
  26. (if find
  27. (replace..withdd (replace-string-section string find (+ find 1) outdir))
  28. string))))
  29. ;(setq platform 'WATCOM)
  30. (setq dirs_to_make '("."))
  31. (defun get_includes (include_list)
  32. (if (eq platform 'WATCOM)
  33. (cons watcom_include include_list)
  34. include_list))
  35. (defun add_dir_to_make (dir_list new_dir)
  36. (if dir_list
  37. (if (equal (car dir_list) new_dir)
  38. nil
  39. (add_dir_to_make (cdr dir_list) new_dir))
  40. (setq dirs_to_make (cons new_dir dirs_to_make))))
  41. (defun make_versions ()
  42. (if (equal platform 'WATCOM)
  43. '("debug" "opt")
  44. '("debug" "opt" "profile")))
  45. (defun default_version () ;; make will build all targets of this verison
  46. (if (equal platform 'LINUX) ;; linux is debug platform
  47. "debug"
  48. "opt"))
  49. (defun plat_dot_name (platform)
  50. (if (eq platform 'SGI)
  51. ".sgi"
  52. (if (eq platform 'SUN)
  53. ".sun"
  54. (if (eq platform 'AIX)
  55. ".aix"
  56. ""))))
  57. (defun get_version_extension (version platform)
  58. (concatenate 'string
  59. (select version
  60. ("debug" "")
  61. ("opt" "o")
  62. ("profile" "p"))
  63. (plat_dot_name platform)))
  64. ;(setq o_files '("nfserver" "nfclient" "username" "clisp" "gui" "transp"
  65. ; "collide" "trig" "property" "lisp" "cache" "particle"
  66. ; "objects" "server2" "client" "extend" "console" "ability"
  67. ; "items" "dev" "chars" "level" "smallfnt" "automap"
  68. ; "help" "intsect" "loader" "seq" "points" "fnt6x13"
  69. ; "morpher" "menu" "director" "view" "config" "game"
  70. ; "light" "devsel" "crc" "nnet/nnet"))
  71. (defun platform_name (plat)
  72. (select plat
  73. ('WATCOM "wat")
  74. ('LINUX_X11 "linux_x11")
  75. ('LINUX_SVGA "linux_svga")
  76. ('LINUX "linux")
  77. ('AIX "AIX")
  78. ('SGI "SGI")
  79. ('SUN "SUN")))
  80. (defun slash ()
  81. (if (equal platform 'WATCOM)
  82. "\\"
  83. "/"))
  84. (defun object_extension ()
  85. (if (equal platform 'WATCOM)
  86. ".obj"
  87. ".o"))
  88. (defun version_dir (dir version_name plat)
  89. ; (let ((platform (if (or (equal plat 'LINUX_SVGA) (equal plat 'LINUX_X11))
  90. ; "LINUX"
  91. ; (platform_name plat))))
  92. (concatenate 'string dir (platform_name plat) (slash) version_name))
  93. (defun make_obj_name (dir basename version_name plat)
  94. (concatenate 'string "/tmp/" (mangle_oname
  95. (convert_slashes (concatenate 'string (version_dir dir version_name plat)
  96. (slash) basename) (slash)))
  97. (object_extension)))
  98. (defun make_file_name ()
  99. (if (equal platform 'WATCOM)
  100. "makefile"
  101. "Makefile"))
  102. (defun link_flags (ver plat)
  103. (select plat
  104. ('LINUX_SVGA (if (equal ver "profile") "-lvga -lm" "-lvga -lm"))
  105. ('LINUX_X11
  106. "/lib/libXext.a /lib/libX11.a -lm")
  107. ('SUN "-lX11 -lXext -lm")
  108. ('SGI "-lX11 -lXext -lm")
  109. ('AIX "-lX11 -lXext -lm")
  110. ('WATCOM "")))
  111. (defun get_cflags (ver platform)
  112. (if (equal platform 'WATCOM)
  113. (concatenate 'string
  114. (if (equal ver "debug")
  115. "/zq /d2"
  116. "/omaxne /zp1 /zq -DNO_CHECK")
  117. " -DMANAGE_MEM")
  118. (if (equal platform 'AIX)
  119. "-O2 -DMANAGE_MEM -DNO_CHECK -DNO_XSHM"
  120. (if (equal ver "debug")
  121. "-g -DMEM_CHECK -DMANAGE_MEM"
  122. (if (equal ver "profile")
  123. (if (eq platform 'SGI)
  124. "-O2 -g -p -DMEM_CHECK -DMANAGE_MEM" ; libcrt0 not supported on IRIX 5.3
  125. "-O2 -g -pg -DMEM_CHECK -DMANAGE_MEM")
  126. "-O2 -DMANAGE_MEM -DNO_CHECK")))))
  127. (defun get_compiler (file)
  128. (if (equal platform 'WATCOM)
  129. "wpp386"
  130. CC))
  131. (defun line_delimiter ()
  132. (if (equal platform 'WATCOM)
  133. "&"
  134. "\\"))
  135. (defun append_c (filename)
  136. (concatenate 'string filename ".c"))
  137. (defun get_objs (list ver plat)
  138. (if (null list) nil
  139. (let ((x (split_filename (car list) (concatenate 'string outdir (slash)) )))
  140. (cons (make_obj_name (car x) (cdr x) ver plat) (get_objs (cdr list) ver plat)))))
  141. (defun list_files (list)
  142. (print "\t" (convert_slashes (car list) (slash)))
  143. (if (cdr list)
  144. (progn
  145. (print " " (line_delimiter) "\n")
  146. (list_files (cdr list)))
  147. nil))
  148. (defun isa_target2 (list platform)
  149. (if list
  150. (if (eq platform (car list))
  151. T
  152. (isa_target2 (cdr list) platform))
  153. nil))
  154. (defun isa_target (list platform)
  155. (if list (isa_target2 list platform)
  156. T))
  157. (defun add_out_dir (name)
  158. (if (equal outdir ".")
  159. name
  160. (concatenate 'string outdir (slash) name)))
  161. (defun extend_name (name letter version do_it platform)
  162. (if do_it
  163. (concatenate 'string name letter (get_version_extension version platform))
  164. name))
  165. (defun expand_targets (targets version)
  166. (if targets
  167. (let ((plats (car (cdr (cdr (cdr (cdr (cdr (car targets))))))))
  168. (extend (if (eq (car (cdr (cdr (car targets)))) 'self) nil T))
  169. (target_name (car (car targets)))
  170. (rest (cdr (car targets))))
  171. ; (open_file "/dev/tty" "wb" (print (concatenate 'string outdir target_name) "\n"))
  172. ; (print targets))
  173. (if (eq platform 'LINUX)
  174. (if (isa_target plats 'LINUX_X11)
  175. (cons (cons 'LINUX_X11 (cons (extend_name target_name "x" version extend platform) rest))
  176. (if (isa_target plats 'LINUX_SVGA)
  177. (cons (cons 'LINUX_SVGA (cons (extend_name target_name "" version extend platform)
  178. rest))
  179. (expand_targets (cdr targets) version))
  180. (expand_targets (cdr targets) version)))
  181. (if (isa_target plats 'LINUX_SVGA)
  182. (cons (cons 'LINUX_SVGA (cons (extend_name target_name "" version extend platform)
  183. rest))
  184. (expand_targets (cdr targets) version))
  185. (expand_targets (cdr targets) version)))
  186. (if (isa_target plats platform)
  187. (cons
  188. (cons platform (cons (extend_name target_name "" version extend platform) rest))
  189. (expand_targets (cdr targets) version)
  190. )
  191. (expand_targets (cdr targets) version))))))
  192. (defun make_lib_name (target platform version)
  193. (let ((x (split_filename target (concatenate 'string "." (slash)))))
  194. (replace.. (convert_slashes (concatenate 'string
  195. (version_dir (car x) version platform)
  196. (slash) (cdr x) (lib_ext)) (slash)))))
  197. (defun get_lib_list (target_list)
  198. (nth 3 (car target_list)))
  199. (defun list_targets (targets version)
  200. (if targets
  201. (let ((platform (car (car targets)))
  202. (target (nth 1 (car targets)))
  203. (ofiles (nth 2 (car targets)))
  204. (libs (nth 3 (car targets)))
  205. (inc (get_includes (nth 4 (car targets))))
  206. (cflags (nth 5 (car targets))))
  207. (print " ")
  208. (if (eq libs 'self)
  209. (print (make_lib_name target platform version))
  210. (if (eq platform 'WATCOM)
  211. (print target ".exe")
  212. (print target)))
  213. (list_targets (cdr targets) version))))
  214. (defun list_depends (file version plat includes cflags libs type)
  215. (let ((x (split_filename file (concatenate 'string outdir (slash)))))
  216. (add_dir_to_make dirs_to_make
  217. (concatenate 'string (version_dir (car x) version plat) (slash)))
  218. (let ((ofile (make_obj_name (car x) (cdr x) version plat)))
  219. (print ofile " : ")
  220. (print file ".c\n")
  221. (compile_to_object file version plat includes cflags type)
  222. (for i in (get_depends (concatenate 'string file ".c") (slash) includes) do
  223. (print ofile " : " i "\n")))
  224. ))
  225. (defun link_files (outname files version plat)
  226. (print "\t")
  227. (if (eq platform 'WATCOM)
  228. (progn
  229. (print "wlink @" outname ".lnk\n\n")
  230. (open_file (concatenate 'string outname ".lnk") "wb"
  231. (if (eq version "debug")
  232. (print "debug line\n"))
  233. (print "system dos4gw\n")
  234. (print "option caseexact\n")
  235. (print "option map=" outname ".map\n")
  236. (print "debug all\n")
  237. (print "name " outname ".exe\n")
  238. (print "option stack=120k\n")
  239. (for i in files do (print "file " i "\n"))
  240. )
  241. )
  242. (progn
  243. (print CC " -o " outname " " (line_delimiter) "\n")
  244. (list_files files)
  245. (print " " (link_flags version plat))
  246. (print "\n\n")
  247. )))
  248. (defun get_include_string (list)
  249. (if list
  250. (concatenate 'string (car list) (get_include_string (cdr list)))
  251. ""))
  252. (defun compile_to_object (file version plat includes cflags type)
  253. (let ((x (split_filename file (concatenate 'string outdir (slash)))))
  254. (let ((ofile (make_obj_name (car x) (cdr x) version plat)))
  255. (if (eq platform 'WATCOM)
  256. (progn
  257. (make_compile_header includes)
  258. (if (eq 'C type)
  259. (print "\twcc386 ")
  260. (print "\twpp386 "))
  261. (print file ".c -fo=" ofile " " (get_cflags version plat) " " cflags "\n\n"))
  262. (progn
  263. (if (eq 'C type)
  264. (print "\tgcc")
  265. (print "\t" CC))
  266. (progn
  267. (print " -c -o " ofile " " file ".c")
  268. (for i in includes do (print " -I" i))
  269. (print " " (get_cflags version plat) " " cflags "\n\n" )
  270. ))))))
  271. (defun lib_ext ()
  272. (if (eq platform 'WATCOM) ".lib"
  273. ".a"))
  274. (defun create_archive (target platform version objs)
  275. (let ((x (split_filename target (concatenate 'string "." (slash)))))
  276. (let ((outname (make_lib_name target platform version)))
  277. (if (eq platform 'WATCOM)
  278. (let ((link_bat (concatenate 'string (version_dir (car x) version platform)
  279. (slash) (cdr x) ".lnk")))
  280. (make_dir (concatenate 'string (car x) (platform_name platform)
  281. (slash) version (slash)))
  282. (open_file link_bat "wb"
  283. (print outname "\n")
  284. (for i in objs do
  285. (print "+ " (convert_slashes i (slash)) "\n")))
  286. (print "\twlib /n @" link_bat "\n\n"))
  287. (progn
  288. (print "\tar ruvs " outname " " (line_delimiter) "\n")
  289. (list_files objs)
  290. (print "\n\n"))))))
  291. (defun make_target (list version)
  292. (if list
  293. (let ((platform (car (car list)))
  294. (target (nth 1 (car list)))
  295. (ofiles (nth 2 (car list)))
  296. (libs (nth 3 (car list)))
  297. (inc (get_includes (nth 4 (car list))))
  298. (cflags (nth 5 (car list)))
  299. (type (nth 7 (car list))) )
  300. (let ((obj_list (get_objs ofiles version platform)))
  301. (print platform "_" target "_" version "_o_files = " (line_delimiter) "\n")
  302. (list_files obj_list)
  303. (print "\n\n")
  304. (make_target (cdr list) version)
  305. (if (eq libs 'self)
  306. (progn
  307. (print (make_lib_name target platform version) " : $("
  308. platform "_" target "_" version "_o_files)\n")
  309. (create_archive target platform version obj_list))
  310. (progn
  311. (if (not (equal "." outdir))
  312. (print outdir (slash)))
  313. (print target)
  314. (if (and (not (eq libs 'self))
  315. (eq platform 'WATCOM))
  316. (print ".exe"))
  317. (print " : $(" platform "_" target "_" version "_o_files)\n")
  318. (link_files target (app obj_list (get_lib_files libs platform version))
  319. version platform)))
  320. (for i in ofiles do
  321. (list_depends (convert_slashes i (slash)) version platform inc
  322. (if cflags cflags "") libs type ))
  323. (print "\n")
  324. ))))
  325. (defun get_ex_libs (libname plat version)
  326. (if (eq plat 'WATCOM)
  327. (if (equal libname "sound") "c:\\sos\\lib\\sosw1cr.lib" nil)
  328. (if (eq plat 'LINUX_X11) (if (eq libname "winman") "-lX11 -lXext" nil)
  329. (if (eq plat 'LINUX_SVGA) (if (eq libname "winman") "-lvga" nil)
  330. nil))))
  331. (defun get_lib_files (libs plat version)
  332. (if libs
  333. (let ((x (get_ex_libs (cdr (split_filename (car libs) "./")) plat version))
  334. (rest (get_lib_files (cdr libs) plat version))
  335. (this (make_lib_name (car libs) plat version)))
  336. (if x
  337. (cons x (cons this rest))
  338. (cons this rest)))
  339. nil))
  340. (defun make_include_string (list)
  341. (if list
  342. (concatenate 'string (car list)
  343. (if (cdr list)
  344. (concatenate 'string ";" (make_include_string (cdr list)))
  345. ""))
  346. ""))
  347. (defun make_compile_header (include)
  348. (if (eq platform 'WATCOM)
  349. (progn
  350. (print "\tset include=" (make_include_string include) "\n")) nil))
  351. (;progn
  352. open_file (concatenate 'string (make_file_name) "." (platform_name platform)) "wb"
  353. (print "all : " (default_version) "\n\n")
  354. (for i in (make_versions) do
  355. (print i " :")
  356. (list_targets (expand_targets targets i) i)
  357. (print "\n\techo Made " i "\n\n")
  358. )
  359. (for i in (make_versions) do
  360. (make_target (expand_targets targets i) i))
  361. )
  362. (print dirs_to_make)
  363. (for i in dirs_to_make do (make_dir i))