123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- import os
- from collections import OrderedDict
- from glob import glob
- from os.path import basename, dirname
- from devtools.yamaker.modules import GLOBAL, Linkable, Program, Recursable, Switch
- from devtools.yamaker.project import GNUMakeNixProject
- def libffi_post_build(self):
- configs_dir = self.dstdir + "/configs"
- os.mkdir(configs_dir)
- os.rename(self.dstdir + "/x86_64-pc-linux-gnu", configs_dir + "/x86_64-pc-linux-gnu")
- os.unlink(self.dstdir + "/libffi.map.in")
- def libffi_post_install(self):
- configs_dir = self.arcdir + "/configs"
- with self.yamakes["."] as m:
- # Disable dllimport/dllexport on windows
- # We know that the library is always linked statically
- m.CFLAGS.append(GLOBAL("-DFFI_BUILDING"))
- m.ADDINCL = [path for path in m.ADDINCL if "/x86_64-pc-linux-gnu" not in path] + [
- GLOBAL(self.arcdir + "/include")
- ]
- m.SRCS = [path for path in m.SRCS if "/x86/" not in path]
- # See configure.host script in libffi distribution for original host->srcs mapping
- m.after(
- "SRCS",
- Switch(
- OrderedDict(
- sorted(
- [
- (
- "ARCH_I386 AND OS_WINDOWS",
- Linkable(
- ADDINCL=[
- configs_dir + "/i386-microsoft-windows",
- GLOBAL(configs_dir + "/i386-microsoft-windows/include"),
- ],
- SRCS=[
- "src/x86/ffi.c",
- "configs/i386-microsoft-windows/sysv_intel.masm",
- ],
- LDFLAGS=[
- "/safeseh:no",
- ],
- ),
- ),
- (
- "ARCH_I386 AND OS_ANDROID",
- Linkable(
- ADDINCL=[
- configs_dir + "/i686-pc-linux-android16",
- GLOBAL(configs_dir + "/i686-pc-linux-android16/include"),
- ],
- SRCS=[
- "src/x86/ffi.c",
- "src/x86/sysv.S",
- ],
- ),
- ),
- (
- "ARCH_X86_64 AND OS_LINUX",
- Linkable(
- ADDINCL=[
- configs_dir + "/x86_64-pc-linux-gnu",
- GLOBAL(configs_dir + "/x86_64-pc-linux-gnu/include"),
- ],
- SRCS=[
- "src/x86/ffi64.c",
- "src/x86/ffiw64.c",
- "src/x86/unix64.S",
- "src/x86/win64.S",
- ],
- ),
- ),
- (
- "ARCH_X86_64 AND OS_ANDROID",
- Linkable(
- ADDINCL=[
- configs_dir + "/x86_64-pc-linux-android21",
- GLOBAL(configs_dir + "/x86_64-pc-linux-android21/include"),
- ],
- SRCS=[
- "src/x86/ffi64.c",
- "src/x86/ffiw64.c",
- "src/x86/unix64.S",
- "src/x86/win64.S",
- ],
- ),
- ),
- (
- "ARCH_X86_64 AND OS_DARWIN",
- Linkable(
- ADDINCL=[
- configs_dir + "/x86_64-apple-macosx",
- GLOBAL(configs_dir + "/x86_64-apple-macosx/include"),
- ],
- SRCS=[
- "src/x86/ffi64.c",
- "src/x86/ffiw64.c",
- "src/x86/unix64.S",
- "src/x86/win64.S",
- ],
- ),
- ),
- (
- "ARCH_ARM64 AND OS_DARWIN",
- Linkable(
- ADDINCL=[
- configs_dir + "/aarch64-apple-macos",
- GLOBAL(configs_dir + "/aarch64-apple-macos/include"),
- ],
- SRCS=[
- "src/aarch64/ffi.c",
- "src/aarch64/sysv.S",
- ],
- ),
- ),
- (
- "ARCH_X86_64 AND OS_IOS",
- Linkable(
- ADDINCL=[
- configs_dir + "/x86_64-apple-iphonesimulator",
- GLOBAL(configs_dir + "/x86_64-apple-iphonesimulator/include"),
- ],
- SRCS=[
- "src/x86/ffi64.c",
- "src/x86/ffiw64.c",
- "src/x86/unix64.S",
- "src/x86/win64.S",
- ],
- ),
- ),
- (
- "ARCH_X86_64 AND OS_WINDOWS",
- Linkable(
- ADDINCL=[
- configs_dir + "/x86_64-microsoft-windows",
- GLOBAL(configs_dir + "/x86_64-microsoft-windows/include"),
- ],
- SRCS=[
- "src/x86/ffiw64.c",
- "configs/x86_64-microsoft-windows/win64_intel.masm",
- ],
- ),
- ),
- (
- "ARCH_ARM7 AND OS_LINUX",
- Linkable(
- ADDINCL=[
- configs_dir + "/armv7a-unknown-linux-gnueabihf",
- GLOBAL(configs_dir + "/armv7a-unknown-linux-gnueabihf/include"),
- ],
- SRCS=[
- "src/arm/ffi.c",
- "src/arm/sysv.S",
- ],
- ),
- ),
- (
- "ARCH_ARM7 AND OS_ANDROID",
- Linkable(
- ADDINCL=[
- configs_dir + "/armv7a-unknown-linux-androideabi16",
- GLOBAL(configs_dir + "/armv7a-unknown-linux-androideabi16/include"),
- ],
- SRCS=[
- "src/arm/ffi.c",
- "src/arm/sysv.S",
- ],
- ),
- ),
- (
- "ARCH_ARM64 AND OS_LINUX",
- Linkable(
- ADDINCL=[
- configs_dir + "/aarch64-unknown-linux-gnu",
- GLOBAL(configs_dir + "/aarch64-unknown-linux-gnu/include"),
- ],
- SRCS=[
- "src/aarch64/ffi.c",
- "src/aarch64/sysv.S",
- ],
- ),
- ),
- (
- "ARCH_ARM64 AND OS_ANDROID",
- Linkable(
- ADDINCL=[
- configs_dir + "/aarch64-unknown-linux-android21",
- GLOBAL(configs_dir + "/aarch64-unknown-linux-android21/include"),
- ],
- SRCS=[
- "src/aarch64/ffi.c",
- "src/aarch64/sysv.S",
- ],
- ),
- ),
- (
- "ARCH_ARM64 AND OS_IOS",
- Linkable(
- ADDINCL=[
- configs_dir + "/aarch64-apple-iphoneos",
- GLOBAL(configs_dir + "/aarch64-apple-iphoneos/include"),
- ],
- SRCS=[
- "src/aarch64/ffi.c",
- "src/aarch64/sysv.S",
- ],
- ),
- ),
- (
- "ARCH_PPC64LE AND OS_LINUX",
- Linkable(
- ADDINCL=[
- configs_dir + "/powerpc64le-unknown-linux-gnu",
- GLOBAL(configs_dir + "/powerpc64le-unknown-linux-gnu/include"),
- ],
- SRCS=[
- "src/powerpc/ffi.c",
- "src/powerpc/ffi_linux64.c",
- "src/powerpc/ffi_sysv.c",
- "src/powerpc/linux64.S",
- "src/powerpc/linux64_closure.S",
- "src/powerpc/ppc_closure.S",
- "src/powerpc/sysv.S",
- ],
- ),
- ),
- # fix only configure-stage for OS_NONE, see YMAKE-218, DEVTOOLSSUPPORT-46190
- (
- "OS_NONE",
- Linkable(
- ADDINCL=[
- configs_dir + "/x86_64-pc-linux-gnu",
- GLOBAL(configs_dir + "/x86_64-pc-linux-gnu/include"),
- ],
- ),
- ),
- ]
- + [
- (
- "default",
- "MESSAGE(FATAL_ERROR Unsupported libffi platform: ${TARGET_PLATFORM} / ${HARDWARE_TYPE})",
- ),
- ]
- )
- )
- ),
- )
- def _add_test(testdir, src):
- modpath = "testsuite/" + testdir + "/" + src
- self.yamakes[modpath] = Program(
- SUBSCRIBER=self.owners,
- NO_RUNTIME=True,
- NO_COMPILER_WARNINGS=True,
- PEERDIR=[self.arcdir],
- SRCDIR=[self.arcdir + "/testsuite/" + testdir],
- SRCS=[src + ".c"],
- LICENSE=["GPL-2.0-only"], # See LICENSE-BUILDTOOLS file
- )
- self.yamakes["."].RECURSE.add(modpath)
- for testpath in glob(self.dstdir + "/testsuite/*/*.c"):
- if basename(testpath) == "testcases.c":
- continue
- _add_test(basename(dirname(testpath)), basename(testpath)[:-2])
- self.yamakes.make_recursive()
- with self.yamakes["testsuite"] as m:
- m.RECURSE -= {"libffi.go", "libffi.complex"}
- # Fails to build.
- m.after("RECURSE", Switch({"NOT OS_IOS": Recursable(RECURSE={"libffi.go"})}))
- # MSVC does not support 'T _Complex' C syntax
- # powerpc64le is configured without complex types
- m.after(
- "RECURSE",
- Switch({"NOT OS_WINDOWS AND NOT ARCH_PPC64LE": Recursable(RECURSE={"libffi.complex"})}),
- )
- with self.yamakes["testsuite/libffi.closures"] as m:
- recs = {
- "cls_align_longdouble_split",
- "cls_align_longdouble_split2",
- "cls_many_mixed_float_double",
- }
- m.RECURSE -= recs
- m.after("RECURSE", Switch({"NOT OS_WINDOWS": Recursable(RECURSE=recs)}))
- libffi = GNUMakeNixProject(
- nixattr="libffi",
- owners=["borman", "g:cpp-contrib"],
- arcdir="contrib/restricted/libffi",
- makeflags=["libffi.la", "libffi.map"],
- copy_sources=[
- "src/aarch64/*",
- "src/arm/*",
- "src/powerpc/*",
- "src/x86/*",
- "testsuite/*/*.c",
- "testsuite/*/*.h",
- "testsuite/*/*.inc",
- ],
- disable_includes=[
- "os2.h",
- "sunmedia_types.h",
- "/usr/include/malloc.h",
- ],
- keep_paths=[
- "configs",
- ],
- post_build=libffi_post_build,
- post_install=libffi_post_install,
- )
|