gitlab.com/thomasboni/go-enry/v2@v2.8.3-0.20220418031202-30b0d7a3de98/python/build_enry.py (about) 1 from cffi import FFI 2 import os 3 from pathlib import Path 4 5 ffibuilder = FFI() 6 7 # cdef() expects a single string declaring the C types, functions and 8 # globals needed to use the shared object. It must be in valid C syntax. 9 # Taken from java/shared/libenry.h 10 ffibuilder.cdef( 11 """ 12 typedef unsigned char GoUint8; 13 typedef long long GoInt64; 14 typedef GoInt64 GoInt; 15 16 typedef struct { const char *p; ptrdiff_t n; } _GoString_; 17 typedef _GoString_ GoString; 18 19 typedef struct { void *data; GoInt len; GoInt cap; } GoSlice; 20 21 22 extern GoString GetLanguage(GoString p0, GoSlice p1); 23 24 /* Return type for GetLanguageByContent */ 25 struct GetLanguageByContent_return { 26 GoString r0; /* language */ 27 GoUint8 r1; /* safe */ 28 }; 29 30 extern struct GetLanguageByContent_return GetLanguageByContent(GoString p0, GoSlice p1); 31 32 /* Return type for GetLanguageByEmacsModeline */ 33 struct GetLanguageByEmacsModeline_return { 34 GoString r0; /* language */ 35 GoUint8 r1; /* safe */ 36 }; 37 38 extern struct GetLanguageByEmacsModeline_return GetLanguageByEmacsModeline(GoSlice p0); 39 40 /* Return type for GetLanguageByExtension */ 41 struct GetLanguageByExtension_return { 42 GoString r0; /* language */ 43 GoUint8 r1; /* safe */ 44 }; 45 46 extern struct GetLanguageByExtension_return GetLanguageByExtension(GoString p0); 47 48 /* Return type for GetLanguageByFilename */ 49 struct GetLanguageByFilename_return { 50 GoString r0; /* language */ 51 GoUint8 r1; /* safe */ 52 }; 53 54 extern struct GetLanguageByFilename_return GetLanguageByFilename(GoString p0); 55 56 /* Return type for GetLanguageByModeline */ 57 struct GetLanguageByModeline_return { 58 GoString r0; /* language */ 59 GoUint8 r1; /* safe */ 60 }; 61 62 extern struct GetLanguageByModeline_return GetLanguageByModeline(GoSlice p0); 63 64 /* Return type for GetLanguageByShebang */ 65 struct GetLanguageByShebang_return { 66 GoString r0; /* language */ 67 GoUint8 r1; /* safe */ 68 }; 69 70 extern struct GetLanguageByShebang_return GetLanguageByShebang(GoSlice p0); 71 72 /* Return type for GetLanguageByVimModeline */ 73 struct GetLanguageByVimModeline_return { 74 GoString r0; /* language */ 75 GoUint8 r1; /* safe */ 76 }; 77 78 extern struct GetLanguageByVimModeline_return GetLanguageByVimModeline(GoSlice p0); 79 80 extern void GetLanguageExtensions(GoString p0, GoSlice* p1); 81 82 extern void GetLanguages(GoString p0, GoSlice p1, GoSlice* p2); 83 84 extern void GetLanguagesByContent(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3); 85 86 extern void GetLanguagesByEmacsModeline(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3); 87 88 extern void GetLanguagesByExtension(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3); 89 90 extern void GetLanguagesByFilename(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3); 91 92 extern void GetLanguagesByModeline(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3); 93 94 extern void GetLanguagesByShebang(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3); 95 96 extern void GetLanguagesByVimModeline(GoString p0, GoSlice p1, GoSlice p2, GoSlice* p3); 97 98 extern GoString GetMimeType(GoString p0, GoString p1); 99 100 extern GoUint8 IsBinary(GoSlice p0); 101 102 extern GoUint8 IsConfiguration(GoString p0); 103 104 extern GoUint8 IsDocumentation(GoString p0); 105 106 extern GoUint8 IsDotFile(GoString p0); 107 108 extern GoUint8 IsImage(GoString p0); 109 110 extern GoUint8 IsVendor(GoString p0); 111 112 extern GoUint8 IsGenerated(GoString p0, GoSlice p1); 113 114 extern GoString GetColor(GoString p0); 115 """ 116 ) 117 118 # set_source() gives the name of the python extension module to 119 # produce, and some C source code as a string. This C code needs 120 # to make the declarated functions, types and globals available, 121 # so it is often just the "#include". 122 lib_dir = Path(__file__).resolve().parent.parent / ".shared" 123 lib_header = lib_dir / "libenry.h" 124 125 ffibuilder.set_source( 126 "_c_enry", 127 f'#include "{lib_header.absolute()}"', 128 libraries=["enry"], 129 library_dirs=[str(lib_dir.absolute())], 130 ) # library name, for the linker 131 132 133 if __name__ == "__main__": 134 ffibuilder.compile(verbose=True)