]> pd.if.org Git - pdclib.old/blob - Jamrules
Enable building PDCLib with Watcom. This was surprisingly painless: their C99 mode...
[pdclib.old] / Jamrules
1 PDCLIB ?= pdclib ;\r
2 \r
3 ECHO "PDCLIB_TOP: " $(PDCLIB_TOP) ;\r
4 \r
5 if ! $(PDCLIB_HAVE_PLATFORM) && ! $(PDCLIB_PLATFORM) {\r
6     if $(NT) {\r
7         PDCLIB_PLATFORM = "win32" ;\r
8     } else if $(UNIX) {\r
9         PDCLIB_PLATFORM = "posix" ;\r
10     } else {\r
11         ECHO PDCLIB_PLATFORM not set and platform not automatically detected ;\r
12         ECHO Set PDCLIB_PLATFORM to the platform to be built for ;\r
13         EXIT ;\r
14     }\r
15     PDCLIB_HAVE_PLATFORM = 1 ;\r
16 }\r
17 \r
18 if $(PDCLIB_TOOLCHAIN) = "" {\r
19   local __ccparts = [ SPLIT $(CC) : "-" ] ;\r
20   if $(JAM_TOOLSET) = "MINGW" || "gcc" in $(__ccparts) \r
21       || "clang" in $(__ccparts) {\r
22     # GCC / GCC-alike\r
23     PDCLIB_TOOLCHAIN = "gcc" ;\r
24   } else if $(JAM_TOOLSET) != "" {\r
25     PDCLIB_TOOLCHAIN = $(JAM_TOOLSET) ;\r
26   } else {\r
27     ECHO PDCLIB_TOOLCHAIN is unset and I can't glean what toolset is being ;\r
28     ECHO used from your environment. Please set it.  ;\r
29     EXIT ;\r
30   }\r
31 }\r
32 \r
33 if $(PDCLIB_TOOLCHAIN) = "gcc" {\r
34     # No -Wcast-align      : spurious warnings when using char* to do pointer \r
35     #                        arithmetic\r
36     # No -Winline          : when compiling with e.g. -Os causes spurious \r
37     #                        warnings that call is unlikely/code size would grow\r
38     # No -Wredundant-decls : some functions must be multiply defined\r
39     PDCLIB_WARNINGS ?= \r
40       -Wall -Wextra -pedantic -Wno-unused-parameter -Wshadow \r
41       -Wpointer-arith -Wwrite-strings -Wmissing-declarations -Wno-long-long \r
42       -Wuninitialized \r
43       ;\r
44     PDCLIB_CCWARNINGS ?= \r
45       -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes ;\r
46     PDCLIB_CCFLAGS  = \r
47       -ffreestanding \r
48       #-nostdinc \r
49       -std=c11 \r
50       -g \r
51       -D_PDCLIB_BUILD\r
52       $(PDCLIB_WARNINGS) ;\r
53     PDCLIB_C++FLAGS =\r
54       -ffreestanding\r
55       #-nostdinc\r
56       -std=c++11\r
57       -g\r
58       -D_PDCLIB_BUILD\r
59       $(PDCLIB_WARNINGS) ;\r
60 \r
61     actions Link bind NEEDLIBS\r
62     {\r
63         $(LINK) $(LINKFLAGS) -o $(<) $(UNDEFS) $(>) -Wl,--start-group $(NEEDLIBS) $(LINKLIBS) -Wl,--end-group\r
64     }\r
65 } else if $(PDCLIB_TOOLCHAIN) = "WATCOM" {\r
66   ECHO "Watcom!" ;\r
67   CCFLAGS  = /zq /DWIN32 ;\r
68   C++FLAGS = /zq /DWIN32 ;\r
69   STDHDRS  = $(WATCOM)\\h\\nt ;\r
70 \r
71   PDCLIB_CCFLAGS = "-za99 -zl" ;\r
72 } else {\r
73   ECHO The value of PDCLIB_TOOLCHAIN is not recognized  ;\r
74   ECHO Currently set to $(PDCLIB_TOOLCHAIN)  ;\r
75   EXIT ;\r
76 }\r
77 \r
78 if $(PDCLIB_PLATFORM) {\r
79     include [ FDirName $(PDCLIB_TOP) platform $(PDCLIB_PLATFORM) Config.jam ] ;\r
80 }\r
81 \r
82 rule PDCLibHeaders {\r
83     SubDirHdrs $(PDCLIB_TOP) includes ;\r
84     SubDirHdrs $(PDCLIB_TOP) internals ;\r
85     SubDirHdrs $(PDCLIB_TOP) testing ;\r
86     for opt in $(PDCLIB_OPTIONS) {\r
87         SubDirHdrs $(PDCLIB_TOP) opt $(opt) ;\r
88     }\r
89     PDCLibTargetHeaders ;\r
90 }\r
91 \r
92 rule PDCLibConfig {\r
93     SubDirCcFlags $(PDCLIB_CCFLAGS) ;\r
94     SubDirC++Flags $(PDCLIB_C++FLAGS) ;\r
95     PDCLibHeaders ;\r
96     PDCLibTargetConfig ;\r
97 }\r
98 \r
99 # MinGW needs appropriate prodding to cretae executables\r
100 if $(TOOLSET) = MINGW {\r
101     PDCLIB_TEST_LINKFLAGS    += -mconsole ;\r
102     PDCLIB_REGTEST_LINKFLAGS += -mconsole ;\r
103 }\r
104 \r
105 # Tests\r
106 ALWAYS regtest test ;\r
107 \r
108 rule Test {\r
109     DEPENDS $(<) : $(>) ;\r
110     ALWAYS $(<) ;\r
111     DEPENDS test : $(<) ;\r
112 }\r
113 \r
114 rule RegTest {\r
115     DEPENDS $(<) : $(>) ;\r
116     ALWAYS $(<) ;\r
117     DEPENDS regtest : $(<) ;\r
118 }\r
119 \r
120 actions Test {\r
121     $(>)\r
122 }\r
123 \r
124 actions RegTest {\r
125     $(>)\r
126 }\r
127 \r
128 # list all files in a directory, except ., ..\r
129 # [ ListDir base : dirname ]\r
130 rule ListDir {\r
131   # start with empty list\r
132   local _result =  ;\r
133 \r
134   # for each file in the directory\r
135   local _dirlist = [ GLOB [ FDirName $(1) $(2) ] : * ] ;\r
136   for _subdir in $(_dirlist) {\r
137 \r
138     # if it is not . or ..\r
139     switch $(_subdir) {\r
140     case *\\. :  _dummy = "" ; # is there some no-op statement?\r
141     case *\\.. : _dummy = "" ; # is there some no-op statement?\r
142     case * :\r
143       # add it to the list\r
144       _result += $(_subdir:D=$(2)) ;\r
145     }\r
146   }\r
147 \r
148   # return resulting list\r
149   return $(_result) ;\r
150 }\r
151 \r
152 # same as glob, but recurses into subdirs\r
153 rule RecursiveGlob {\r
154   # initially use the files in the current directory\r
155   local _dir  = $(2) ;\r
156   local _path = [ FDirName $(1) $(2) ] ;\r
157   local _result = [ GLOB $(_path) : $(3) ] ;\r
158   _result = $(_result:D=$(_dir)) ;\r
159 \r
160   # list all subdirectories (and files, but it doesn't hurt)\r
161   local _subdirlist = [ ListDir $(1) : $(2) ] ;\r
162 \r
163   # for each subdir/file\r
164   for _subdir in $(_subdirlist) {\r
165     # recurse into it\r
166     _result += [ RecursiveGlob $(1) : $(_subdir) : $(3) ] ;\r
167   }\r
168 \r
169   # return the resulting list\r
170   return $(_result) ;\r
171 }\r
172 \r
173 # Fix to work on targets in subdirs\r
174 rule MakeLocate\r
175 {\r
176     # Note we grist the directory name with 'dir',\r
177     # so that directory path components and other\r
178     # targets don't conflict.\r
179 \r
180     if $(>)\r
181     {\r
182         local _rev = [ FReverse $(>) ] ;\r
183         if $(_rev[1]) = "." {\r
184           _rev = $(_rev[2-]) ;\r
185         } \r
186         local _dir = [ FDirName [ FReverse $(_rev) ] $(<[0]:D) ] ;\r
187 \r
188         LOCATE on $(<) = [ FDirName $(>) ] ;\r
189         Depends $(<) : $(_dir:G=dir) ;\r
190         MkDir $(_dir:G=dir) ;\r
191     }\r
192 }