__init__.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. import os
  2. from collections import OrderedDict
  3. from glob import glob
  4. from os.path import basename, dirname
  5. from devtools.yamaker.modules import GLOBAL, Linkable, Program, Recursable, Switch
  6. from devtools.yamaker.project import GNUMakeNixProject
  7. def libffi_post_build(self):
  8. configs_dir = self.dstdir + "/configs"
  9. os.mkdir(configs_dir)
  10. os.rename(self.dstdir + "/x86_64-pc-linux-gnu", configs_dir + "/x86_64-pc-linux-gnu")
  11. os.unlink(self.dstdir + "/libffi.map.in")
  12. def libffi_post_install(self):
  13. configs_dir = self.arcdir + "/configs"
  14. with self.yamakes["."] as m:
  15. # Disable dllimport/dllexport on windows
  16. # We know that the library is always linked statically
  17. m.CFLAGS.append(GLOBAL("-DFFI_BUILDING"))
  18. m.ADDINCL = [path for path in m.ADDINCL if "/x86_64-pc-linux-gnu" not in path] + [
  19. GLOBAL(self.arcdir + "/include")
  20. ]
  21. m.SRCS = [path for path in m.SRCS if "/x86/" not in path]
  22. # See configure.host script in libffi distribution for original host->srcs mapping
  23. m.after(
  24. "SRCS",
  25. Switch(
  26. OrderedDict(
  27. sorted(
  28. [
  29. (
  30. "ARCH_I386 AND OS_WINDOWS",
  31. Linkable(
  32. ADDINCL=[
  33. configs_dir + "/i386-microsoft-windows",
  34. GLOBAL(configs_dir + "/i386-microsoft-windows/include"),
  35. ],
  36. SRCS=[
  37. "src/x86/ffi.c",
  38. "configs/i386-microsoft-windows/sysv_intel.masm",
  39. ],
  40. LDFLAGS=[
  41. "/safeseh:no",
  42. ],
  43. ),
  44. ),
  45. (
  46. "ARCH_I386 AND OS_ANDROID",
  47. Linkable(
  48. ADDINCL=[
  49. configs_dir + "/i686-pc-linux-android16",
  50. GLOBAL(configs_dir + "/i686-pc-linux-android16/include"),
  51. ],
  52. SRCS=[
  53. "src/x86/ffi.c",
  54. "src/x86/sysv.S",
  55. ],
  56. ),
  57. ),
  58. (
  59. "ARCH_X86_64 AND OS_LINUX",
  60. Linkable(
  61. ADDINCL=[
  62. configs_dir + "/x86_64-pc-linux-gnu",
  63. GLOBAL(configs_dir + "/x86_64-pc-linux-gnu/include"),
  64. ],
  65. SRCS=[
  66. "src/x86/ffi64.c",
  67. "src/x86/ffiw64.c",
  68. "src/x86/unix64.S",
  69. "src/x86/win64.S",
  70. ],
  71. ),
  72. ),
  73. (
  74. "ARCH_X86_64 AND OS_ANDROID",
  75. Linkable(
  76. ADDINCL=[
  77. configs_dir + "/x86_64-pc-linux-android21",
  78. GLOBAL(configs_dir + "/x86_64-pc-linux-android21/include"),
  79. ],
  80. SRCS=[
  81. "src/x86/ffi64.c",
  82. "src/x86/ffiw64.c",
  83. "src/x86/unix64.S",
  84. "src/x86/win64.S",
  85. ],
  86. ),
  87. ),
  88. (
  89. "ARCH_X86_64 AND OS_DARWIN",
  90. Linkable(
  91. ADDINCL=[
  92. configs_dir + "/x86_64-apple-macosx",
  93. GLOBAL(configs_dir + "/x86_64-apple-macosx/include"),
  94. ],
  95. SRCS=[
  96. "src/x86/ffi64.c",
  97. "src/x86/ffiw64.c",
  98. "src/x86/unix64.S",
  99. "src/x86/win64.S",
  100. ],
  101. ),
  102. ),
  103. (
  104. "ARCH_ARM64 AND OS_DARWIN",
  105. Linkable(
  106. ADDINCL=[
  107. configs_dir + "/aarch64-apple-macos",
  108. GLOBAL(configs_dir + "/aarch64-apple-macos/include"),
  109. ],
  110. SRCS=[
  111. "src/aarch64/ffi.c",
  112. "src/aarch64/sysv.S",
  113. ],
  114. ),
  115. ),
  116. (
  117. "ARCH_X86_64 AND OS_IOS",
  118. Linkable(
  119. ADDINCL=[
  120. configs_dir + "/x86_64-apple-iphonesimulator",
  121. GLOBAL(configs_dir + "/x86_64-apple-iphonesimulator/include"),
  122. ],
  123. SRCS=[
  124. "src/x86/ffi64.c",
  125. "src/x86/ffiw64.c",
  126. "src/x86/unix64.S",
  127. "src/x86/win64.S",
  128. ],
  129. ),
  130. ),
  131. (
  132. "ARCH_X86_64 AND OS_WINDOWS",
  133. Linkable(
  134. ADDINCL=[
  135. configs_dir + "/x86_64-microsoft-windows",
  136. GLOBAL(configs_dir + "/x86_64-microsoft-windows/include"),
  137. ],
  138. SRCS=[
  139. "src/x86/ffiw64.c",
  140. "configs/x86_64-microsoft-windows/win64_intel.masm",
  141. ],
  142. ),
  143. ),
  144. (
  145. "ARCH_ARM7 AND OS_LINUX",
  146. Linkable(
  147. ADDINCL=[
  148. configs_dir + "/armv7a-unknown-linux-gnueabihf",
  149. GLOBAL(configs_dir + "/armv7a-unknown-linux-gnueabihf/include"),
  150. ],
  151. SRCS=[
  152. "src/arm/ffi.c",
  153. "src/arm/sysv.S",
  154. ],
  155. ),
  156. ),
  157. (
  158. "ARCH_ARM7 AND OS_ANDROID",
  159. Linkable(
  160. ADDINCL=[
  161. configs_dir + "/armv7a-unknown-linux-androideabi16",
  162. GLOBAL(configs_dir + "/armv7a-unknown-linux-androideabi16/include"),
  163. ],
  164. SRCS=[
  165. "src/arm/ffi.c",
  166. "src/arm/sysv.S",
  167. ],
  168. ),
  169. ),
  170. (
  171. "ARCH_ARM64 AND OS_LINUX",
  172. Linkable(
  173. ADDINCL=[
  174. configs_dir + "/aarch64-unknown-linux-gnu",
  175. GLOBAL(configs_dir + "/aarch64-unknown-linux-gnu/include"),
  176. ],
  177. SRCS=[
  178. "src/aarch64/ffi.c",
  179. "src/aarch64/sysv.S",
  180. ],
  181. ),
  182. ),
  183. (
  184. "ARCH_ARM64 AND OS_ANDROID",
  185. Linkable(
  186. ADDINCL=[
  187. configs_dir + "/aarch64-unknown-linux-android21",
  188. GLOBAL(configs_dir + "/aarch64-unknown-linux-android21/include"),
  189. ],
  190. SRCS=[
  191. "src/aarch64/ffi.c",
  192. "src/aarch64/sysv.S",
  193. ],
  194. ),
  195. ),
  196. (
  197. "ARCH_ARM64 AND OS_IOS",
  198. Linkable(
  199. ADDINCL=[
  200. configs_dir + "/aarch64-apple-iphoneos",
  201. GLOBAL(configs_dir + "/aarch64-apple-iphoneos/include"),
  202. ],
  203. SRCS=[
  204. "src/aarch64/ffi.c",
  205. "src/aarch64/sysv.S",
  206. ],
  207. ),
  208. ),
  209. (
  210. "ARCH_PPC64LE AND OS_LINUX",
  211. Linkable(
  212. ADDINCL=[
  213. configs_dir + "/powerpc64le-unknown-linux-gnu",
  214. GLOBAL(configs_dir + "/powerpc64le-unknown-linux-gnu/include"),
  215. ],
  216. SRCS=[
  217. "src/powerpc/ffi.c",
  218. "src/powerpc/ffi_linux64.c",
  219. "src/powerpc/ffi_sysv.c",
  220. "src/powerpc/linux64.S",
  221. "src/powerpc/linux64_closure.S",
  222. "src/powerpc/ppc_closure.S",
  223. "src/powerpc/sysv.S",
  224. ],
  225. ),
  226. ),
  227. # fix only configure-stage for OS_NONE, see YMAKE-218, DEVTOOLSSUPPORT-46190
  228. (
  229. "OS_NONE",
  230. Linkable(
  231. ADDINCL=[
  232. configs_dir + "/x86_64-pc-linux-gnu",
  233. GLOBAL(configs_dir + "/x86_64-pc-linux-gnu/include"),
  234. ],
  235. ),
  236. ),
  237. ]
  238. + [
  239. (
  240. "default",
  241. "MESSAGE(FATAL_ERROR Unsupported libffi platform: ${TARGET_PLATFORM} / ${HARDWARE_TYPE})",
  242. ),
  243. ]
  244. )
  245. )
  246. ),
  247. )
  248. def _add_test(testdir, src):
  249. modpath = "testsuite/" + testdir + "/" + src
  250. self.yamakes[modpath] = Program(
  251. SUBSCRIBER=self.owners,
  252. NO_RUNTIME=True,
  253. NO_COMPILER_WARNINGS=True,
  254. PEERDIR=[self.arcdir],
  255. SRCDIR=[self.arcdir + "/testsuite/" + testdir],
  256. SRCS=[src + ".c"],
  257. LICENSE=["GPL-2.0-only"], # See LICENSE-BUILDTOOLS file
  258. )
  259. self.yamakes["."].RECURSE.add(modpath)
  260. for testpath in glob(self.dstdir + "/testsuite/*/*.c"):
  261. if basename(testpath) == "testcases.c":
  262. continue
  263. _add_test(basename(dirname(testpath)), basename(testpath)[:-2])
  264. self.yamakes.make_recursive()
  265. with self.yamakes["testsuite"] as m:
  266. m.RECURSE -= {"libffi.go", "libffi.complex"}
  267. # Fails to build.
  268. m.after("RECURSE", Switch({"NOT OS_IOS": Recursable(RECURSE={"libffi.go"})}))
  269. # MSVC does not support 'T _Complex' C syntax
  270. # powerpc64le is configured without complex types
  271. m.after(
  272. "RECURSE",
  273. Switch({"NOT OS_WINDOWS AND NOT ARCH_PPC64LE": Recursable(RECURSE={"libffi.complex"})}),
  274. )
  275. with self.yamakes["testsuite/libffi.closures"] as m:
  276. recs = {
  277. "cls_align_longdouble_split",
  278. "cls_align_longdouble_split2",
  279. "cls_many_mixed_float_double",
  280. }
  281. m.RECURSE -= recs
  282. m.after("RECURSE", Switch({"NOT OS_WINDOWS": Recursable(RECURSE=recs)}))
  283. libffi = GNUMakeNixProject(
  284. nixattr="libffi",
  285. owners=["borman", "g:cpp-contrib"],
  286. arcdir="contrib/restricted/libffi",
  287. makeflags=["libffi.la", "libffi.map"],
  288. copy_sources=[
  289. "src/aarch64/*",
  290. "src/arm/*",
  291. "src/powerpc/*",
  292. "src/x86/*",
  293. "testsuite/*/*.c",
  294. "testsuite/*/*.h",
  295. "testsuite/*/*.inc",
  296. ],
  297. disable_includes=[
  298. "os2.h",
  299. "sunmedia_types.h",
  300. "/usr/include/malloc.h",
  301. ],
  302. keep_paths=[
  303. "configs",
  304. ],
  305. post_build=libffi_post_build,
  306. post_install=libffi_post_install,
  307. )