1SubDir HAIKU_TOP src tools gensyscalls ; 2 3# preprocess the syscalls header 4 5rule PreprocessSyscalls 6{ 7 # PreprocessSyscalls <preprocessedHeader> : <header> : <parsable> ; 8 # 9 local parsable = $(3) ; 10 local parsableDefine ; 11 12 if $(parsable) { 13 parsableDefine = GEN_SYSCALL_INFOS_PROCESSING ; 14 } 15 16 Depends $(<) : $(>) ; 17 18 local headers = [ on $(1) return $(SEARCH_SOURCE) $(SUBDIRHDRS) $(HDRS) ] ; 19 local sysHeaders = 20 $(TARGET_PRIVATE_SYSTEM_HEADERS) 21 [ ArchHeaders $(TARGET_ARCH) ] 22 [ on $(1) return $(SUBDIRSYSHDRS) $(SYSHDRS) ] 23 $(HAIKU_HDRS) ; 24 25 HDRS on $(<) = $(headers) ; 26 SYSHDRS on $(<) = $(sysHeaders) ; 27 28 HDRRULE on $(>) = HdrRule ; 29 HDRSCAN on $(>) = $(HDRPATTERN) ; 30 HDRSEARCH on $(>) = $(headers) $(sysHeaders) $(STDHDRS) ; 31 HDRGRIST on $(>) = $(HDRGRIST) ; 32 33 DEFINES on $(<) += $(HAIKU_DEFINES) $(parsableDefine) ; 34 35 CCFLAGS on $(<) += $(HAIKU_CCFLAGS) $(SUBDIRCCFLAGS) $(OPTIM) ; 36 CCHDRS on $(<) = [ FIncludes $(headers) : $(HAIKU_LOCAL_INCLUDES_OPTION) ] 37 $(HAIKU_INCLUDES_SEPARATOR) 38 [ FSysIncludes $(sysHeaders) : $(HAIKU_SYSTEM_INCLUDES_OPTION) ] ; 39 CCDEFS on $(<) = [ on $(<) FDefines $(DEFINES) ] ; 40} 41 42actions PreprocessSyscalls 43{ 44 $(HAIKU_C++) -xc++ -E "$(2)" $(CCFLAGS) $(CCDEFS) $(CCHDRS) -o "$(1)" ; 45} 46 47local syscallsHeader = [ FGristFiles syscalls.h ] ; 48SEARCH on $(syscallsHeader) = [ FDirName $(HAIKU_TOP) headers private system ] ; 49 50# We generate two preprocessed headers. One for parsing by gensyscallinfos 51# (it contains #pragmas) and one for inclusion by the generated 52# gensyscalls_infos.cpp. 53local syscallsHeaderPPParsable = [ FGristFiles syscalls.h.pp.parsable ] ; 54local syscallsHeaderPP = [ FGristFiles syscalls.h.pp ] ; 55MakeLocateArch $(syscallsHeaderPPParsable) $(syscallsHeaderPP) ; 56 57PreprocessSyscalls $(syscallsHeaderPPParsable) : $(syscallsHeader) : true ; 58PreprocessSyscalls $(syscallsHeaderPP) : $(syscallsHeader) ; 59 60 61# build gensyscallinfos 62 63BuildPlatformMain gensyscallinfos 64 : gensyscallinfos.cpp 65 : $(HOST_LIBSTDC++) $(HOST_LIBSUPC++) 66; 67 68 69# generate the syscall infos source file 70 71local syscallInfos = [ FGristFiles gensyscalls_infos.cpp ] ; 72MakeLocateArch $(syscallInfos) ; 73 74rule GenSyscallInfos { 75 Depends $(1) : gensyscallinfos $(2) ; 76 GenSyscallInfos1 $(1) : gensyscallinfos $(2) ; 77} 78 79actions GenSyscallInfos1 { 80 $(2[1]) $(2[2]) $(1) 81} 82 83GenSyscallInfos $(syscallInfos) : $(syscallsHeaderPPParsable) ; 84 85SubDirHdrs [ FDirName $(SUBDIR) arch $(TARGET_ARCH) ] ; 86 87 88# build gensyscalls 89 90ObjectDefines $(syscallInfos) : HAIKU_BUILD_COMPATIBILITY_H ; 91 # Prevent the inclusion of HaikuBuildCompatibility.h. TODO: Very hacky! 92BuildPlatformMain gensyscalls : gensyscalls.cpp $(syscallInfos) ; 93LinkAgainst gensyscalls : $(HOST_LIBSTDC++) $(HOST_LIBSUPC++) ; 94 95# Explicitly tell jam that gensyscalls.cpp includes the generated header. 96Includes [ FGristFiles gensyscalls.cpp ] : $(syscallsHeaderPP) ; 97 98 99# generate the output files 100 101# place them where they are needed 102local dir = $(HAIKU_COMMON_DEBUG_OBJECT_DIR) ; 103MakeLocate <syscalls>syscalls.S.inc : [ FDirName $(dir) system libroot os ] ; 104MakeLocate <syscalls>syscall_dispatcher.h : [ FDirName $(dir) system kernel ] ; 105MakeLocate <syscalls>syscall_numbers.h : [ FDirName $(dir) system kernel ] ; 106MakeLocate <syscalls>syscall_table.h : [ FDirName $(dir) system kernel ] ; 107MakeLocate <syscalls>strace_syscalls.h : [ FDirName $(dir) bin debug strace ] ; 108 109rule GenSyscallsFile { 110 Depends $(1) : gensyscalls ; 111 GenSyscallsFile1 $(1) : gensyscalls ; 112} 113 114actions GenSyscallsFile1 { 115 $(2[1]) -c $(1) 116} 117 118rule GenSyscallsDispatcher { 119 Depends $(1) : gensyscalls ; 120 GenSyscallsDispatcher1 $(1) : gensyscalls ; 121} 122 123actions GenSyscallsDispatcher1 { 124 $(2[1]) -d $(1) 125} 126 127rule GenSyscallsNumbers { 128 Depends $(1) : gensyscalls ; 129 GenSyscallsNumbers1 $(1) : gensyscalls ; 130} 131 132actions GenSyscallsNumbers1 { 133 $(2[1]) -n $(1) 134} 135 136rule GenSyscallsTable { 137 Depends $(1) : gensyscalls ; 138 GenSyscallsTable1 $(1) : gensyscalls ; 139} 140 141actions GenSyscallsTable1 { 142 $(2[1]) -t $(1) 143} 144 145rule GenSyscallsSTrace { 146 Depends $(1) : gensyscalls ; 147 GenSyscallsSTrace1 $(1) : gensyscalls ; 148} 149 150actions GenSyscallsSTrace1 { 151 $(2[1]) -s $(1) 152} 153 154GenSyscallsFile <syscalls>syscalls.S.inc ; 155GenSyscallsDispatcher <syscalls>syscall_dispatcher.h ; 156GenSyscallsNumbers <syscalls>syscall_numbers.h ; 157GenSyscallsTable <syscalls>syscall_table.h ; 158GenSyscallsSTrace <syscalls>strace_syscalls.h ; 159