xref: /haiku/src/tools/gensyscalls/Jamfile (revision 3be9edf8da228afd9fec0390f408c964766122aa)
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