]> pd.if.org Git - pdclib/blob - Jamrules
win32: most tests now build on Watcom
[pdclib] / 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 /zls ;\r
68   C++FLAGS = /zq /DWIN32 /zls ;\r
69   STDHDRS  = $(WATCOM)\\h\\nt ;\r
70   PDCLIB_CCFLAGS = "-za99 -zl -s" ;\r
71 } else {\r
72   ECHO The value of PDCLIB_TOOLCHAIN is not recognized  ;\r
73   ECHO Currently set to $(PDCLIB_TOOLCHAIN)  ;\r
74   EXIT ;\r
75 }\r
76 \r
77 if $(PDCLIB_PLATFORM) {\r
78     include [ FDirName $(PDCLIB_TOP) platform $(PDCLIB_PLATFORM) Config.jam ] ;\r
79 }\r
80 \r
81 rule PDCLibHeaders {\r
82     SubDirHdrs $(PDCLIB_TOP) includes ;\r
83     SubDirHdrs $(PDCLIB_TOP) internals ;\r
84     SubDirHdrs $(PDCLIB_TOP) testing ;\r
85     for opt in $(PDCLIB_OPTIONS) {\r
86         SubDirHdrs $(PDCLIB_TOP) opt $(opt) ;\r
87     }\r
88     PDCLibTargetHeaders ;\r
89 }\r
90 \r
91 rule PDCLibConfig {\r
92     SubDirCcFlags $(PDCLIB_CCFLAGS) ;\r
93     SubDirC++Flags $(PDCLIB_C++FLAGS) ;\r
94     PDCLibHeaders ;\r
95     PDCLibTargetConfig ;\r
96 }\r
97 \r
98 # MinGW needs appropriate prodding to cretae executables\r
99 if $(TOOLSET) = MINGW {\r
100     PDCLIB_TEST_LINKFLAGS    += -mconsole ;\r
101     PDCLIB_REGTEST_LINKFLAGS += -mconsole ;\r
102 }\r
103 \r
104 # Tests\r
105 ALWAYS regtest test ;\r
106 \r
107 rule Test {\r
108     DEPENDS $(<) : $(>) ;\r
109     ALWAYS $(<) ;\r
110     DEPENDS test : $(<) ;\r
111 }\r
112 \r
113 rule RegTest {\r
114     DEPENDS $(<) : $(>) ;\r
115     ALWAYS $(<) ;\r
116     DEPENDS regtest : $(<) ;\r
117 }\r
118 \r
119 actions Test {\r
120     $(>)\r
121 }\r
122 \r
123 actions RegTest {\r
124     $(>)\r
125 }\r
126 \r
127 # list all files in a directory, except ., ..\r
128 # [ ListDir base : dirname ]\r
129 rule ListDir {\r
130   # start with empty list\r
131   local _result =  ;\r
132 \r
133   # for each file in the directory\r
134   local _dirlist = [ GLOB [ FDirName $(1) $(2) ] : * ] ;\r
135   for _subdir in $(_dirlist) {\r
136 \r
137     # if it is not . or ..\r
138     switch $(_subdir) {\r
139     case *\\. :  _dummy = "" ; # is there some no-op statement?\r
140     case *\\.. : _dummy = "" ; # is there some no-op statement?\r
141     case * :\r
142       # add it to the list\r
143       _result += $(_subdir:D=$(2)) ;\r
144     }\r
145   }\r
146 \r
147   # return resulting list\r
148   return $(_result) ;\r
149 }\r
150 \r
151 # same as glob, but recurses into subdirs\r
152 rule RecursiveGlob {\r
153   # initially use the files in the current directory\r
154   local _dir  = $(2) ;\r
155   local _path = [ FDirName $(1) $(2) ] ;\r
156   local _result = [ GLOB $(_path) : $(3) ] ;\r
157   _result = $(_result:D=$(_dir)) ;\r
158 \r
159   # list all subdirectories (and files, but it doesn't hurt)\r
160   local _subdirlist = [ ListDir $(1) : $(2) ] ;\r
161 \r
162   # for each subdir/file\r
163   for _subdir in $(_subdirlist) {\r
164     # recurse into it\r
165     _result += [ RecursiveGlob $(1) : $(_subdir) : $(3) ] ;\r
166   }\r
167 \r
168   # return the resulting list\r
169   return $(_result) ;\r
170 }\r
171 \r
172 # Fix to work on targets in subdirs\r
173 rule MakeLocate\r
174 {\r
175     # Note we grist the directory name with 'dir',\r
176     # so that directory path components and other\r
177     # targets don't conflict.\r
178 \r
179     if $(>)\r
180     {\r
181         local _rev = [ FReverse $(>) ] ;\r
182         if $(_rev[1]) = "." {\r
183           _rev = $(_rev[2-]) ;\r
184         } \r
185         local _dir = [ FDirName [ FReverse $(_rev) ] $(<[0]:D) ] ;\r
186 \r
187         LOCATE on $(<) = [ FDirName $(>) ] ;\r
188         Depends $(<) : $(_dir:G=dir) ;\r
189         MkDir $(_dir:G=dir) ;\r
190     }\r
191 }