--- /dev/null
+PDCLIB ?= pdclib ;\r
+\r
+ECHO "PDCLIB_TOP: " $(PDCLIB_TOP) ;\r
+\r
+if ! $(PDCLIB_HAVE_PLATFORM) && ! $(PDCLIB_PLATFORM) {\r
+ if $(NT) {\r
+ PDCLIB_PLATFORM = "win32" ;\r
+ } else if $(UNIX) {\r
+ PDCLIB_PLATFORM = "posix" ;\r
+ } else {\r
+ ECHO "PDCLIB_PLATFORM not set and platform not automatically detected" ;\r
+ ECHO "Set PDCLIB_PLATFORM to the platform to be built for" ;\r
+ EXIT ;\r
+ }\r
+ PDCLIB_HAVE_PLATFORM = 1 ;\r
+}\r
+\r
+#if $(CC) = "gcc" {\r
+# TODO: Better toolchain handling\r
+\r
+ # No -Wcast-align : spurious warnings when using char* to do pointer \r
+ # arithmetic\r
+ # No -Winline : when compiling with e.g. -Os causes spurious \r
+ # warnings that call is unlikely/code size would grow\r
+ # No -Wredundant-decls : some functions must be multiply defined\r
+ PDCLIB_WARNINGS ?= \r
+ -Wall -Wextra -pedantic -Wno-unused-parameter -Wshadow \r
+ -Wpointer-arith -Wwrite-strings -Wmissing-declarations -Wno-long-long \r
+ -Wuninitialized \r
+ ;\r
+ PDCLIB_CCWARNINGS ?= \r
+ -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes ;\r
+ PDCLIB_CCFLAGS = \r
+ -ffreestanding \r
+ -nostdinc \r
+ -std=c11 \r
+ -g \r
+ -D_PDCLIB_BUILD\r
+ $(PDCLIB_WARNINGS) ;\r
+ PDCLIB_C++FLAGS =\r
+ -ffreestanding\r
+ -nostdinc\r
+ -std=c++11\r
+ -g\r
+ -D_PDCLIB_BUILD\r
+ $(PDCLIB_WARNINGS) ;\r
+\r
+ actions Link bind NEEDLIBS\r
+ {\r
+ $(LINK) $(LINKFLAGS) -o $(<) $(UNDEFS) $(>) -Wl,--start-group $(NEEDLIBS) $(LINKLIBS) -Wl,--end-group\r
+ }\r
+#}\r
+\r
+if $(PDCLIB_PLATFORM) {\r
+ include [ FDirName $(PDCLIB_TOP) platform $(PDCLIB_PLATFORM) Config.jam ] ;\r
+}\r
+\r
+rule PDCLibHeaders {\r
+ SubDirHdrs $(PDCLIB_TOP) includes ;\r
+ SubDirHdrs $(PDCLIB_TOP) internals ;\r
+ SubDirHdrs $(PDCLIB_TOP) testing ;\r
+ for opt in $(PDCLIB_OPTIONS) {\r
+ SubDirHdrs $(PDCLIB_TOP) opt $(opt) ;\r
+ }\r
+ PDCLibTargetHeaders ;\r
+}\r
+\r
+rule PDCLibConfig {\r
+ SubDirCcFlags $(PDCLIB_CCFLAGS) ;\r
+ SubDirC++Flags $(PDCLIB_C++FLAGS) ;\r
+ PDCLibHeaders ;\r
+ PDCLibTargetConfig ;\r
+}\r
+\r
+# MinGW needs appropriate prodding to cretae executables\r
+if $(TOOLSET) = MINGW {\r
+ PDCLIB_TEST_LINKFLAGS += -mconsole ;\r
+ PDCLIB_REGTEST_LINKFLAGS += -mconsole ;\r
+}\r
+\r
+# Tests\r
+ALWAYS regtest test ;\r
+\r
+rule Test {\r
+ DEPENDS $(<) : $(>) ;\r
+ ALWAYS $(<) ;\r
+ DEPENDS test : $(<) ;\r
+}\r
+\r
+rule RegTest {\r
+ DEPENDS $(<) : $(>) ;\r
+ ALWAYS $(<) ;\r
+ DEPENDS regtest : $(<) ;\r
+}\r
+\r
+actions Test {\r
+ $(>)\r
+}\r
+\r
+actions RegTest {\r
+ $(>)\r
+}\r
+\r
+# list all files in a directory, except ., ..\r
+# [ ListDir base : dirname ]\r
+rule ListDir {\r
+ # start with empty list\r
+ local _result = ;\r
+\r
+ # for each file in the directory\r
+ local _dirlist = [ GLOB [ FDirName $(1) $(2) ] : * ] ;\r
+ for _subdir in $(_dirlist) {\r
+\r
+ # if it is not . or ..\r
+ switch $(_subdir) {\r
+ case *\\. : _dummy = "" ; # is there some no-op statement?\r
+ case *\\.. : _dummy = "" ; # is there some no-op statement?\r
+ case * :\r
+ # add it to the list\r
+ _result += $(_subdir:D=$(2)) ;\r
+ }\r
+ }\r
+\r
+ # return resulting list\r
+ return $(_result) ;\r
+}\r
+\r
+# same as glob, but recurses into subdirs\r
+rule RecursiveGlob {\r
+ # initially use the files in the current directory\r
+ local _dir = $(2) ;\r
+ local _path = [ FDirName $(1) $(2) ] ;\r
+ local _result = [ GLOB $(_path) : $(3) ] ;\r
+ _result = $(_result:D=$(_dir)) ;\r
+\r
+ # list all subdirectories (and files, but it doesn't hurt)\r
+ local _subdirlist = [ ListDir $(1) : $(2) ] ;\r
+\r
+ # for each subdir/file\r
+ for _subdir in $(_subdirlist) {\r
+ # recurse into it\r
+ _result += [ RecursiveGlob $(1) : $(_subdir) : $(3) ] ;\r
+ }\r
+\r
+ # return the resulting list\r
+ return $(_result) ;\r
+}\r
+\r
+# Fix to work on targets in subdirs\r
+rule MakeLocate\r
+{\r
+ # Note we grist the directory name with 'dir',\r
+ # so that directory path components and other\r
+ # targets don't conflict.\r
+\r
+ if $(>)\r
+ {\r
+ local _rev = [ FReverse $(>) ] ;\r
+ if $(_rev[1]) = "." {\r
+ _rev = $(_rev[2-]) ;\r
+ } \r
+ local _dir = [ FDirName [ FReverse $(_rev) ] $(<[0]:D) ] ;\r
+\r
+ LOCATE on $(<) = [ FDirName $(>) ] ;\r
+ Depends $(<) : $(_dir:G=dir) ;\r
+ MkDir $(_dir:G=dir) ;\r
+ }\r
+}
\ No newline at end of file