]> pd.if.org Git - pdclib.old/blobdiff - Jamrules
* New feature check macro system. See _PDCLIB_aux.h for details
[pdclib.old] / Jamrules
diff --git a/Jamrules b/Jamrules
new file mode 100644 (file)
index 0000000..8657cc9
--- /dev/null
+++ b/Jamrules
@@ -0,0 +1,168 @@
+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