$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: troy_at_[hidden]
Date: 2008-06-02 16:59:08
Author: troy
Date: 2008-06-02 16:59:08 EDT (Mon, 02 Jun 2008)
New Revision: 46057
URL: http://svn.boost.org/trac/boost/changeset/46057
Log:
Testing without CTest: works on linux.   Python scripts in tools/build/CMake and
rules in tools/build/CMake/BoostBuildSlave.cmake need updating.
Added:
   branches/CMake/release/tools/build/CMake/BoostBuildSlave.cmake   (contents, props changed)
   branches/CMake/release/tools/build/CMake/passthru.py.in   (contents, props changed)
   branches/CMake/release/tools/build/CMake/post.py.in   (contents, props changed)
   branches/CMake/release/tools/build/CMake/xmlize.py.in   (contents, props changed)
Removed:
   branches/CMake/release/tools/build/CMake/CompileTest/
Text files modified: 
   branches/CMake/release/CMakeLists.txt                       |     1                                         
   branches/CMake/release/tools/build/CMake/BoostCore.cmake    |   150 +++++++++++--------                     
   branches/CMake/release/tools/build/CMake/BoostTesting.cmake |   297 ++++++++++++++++++++------------------- 
   3 files changed, 236 insertions(+), 212 deletions(-)
Modified: branches/CMake/release/CMakeLists.txt
==============================================================================
--- branches/CMake/release/CMakeLists.txt	(original)
+++ branches/CMake/release/CMakeLists.txt	2008-06-02 16:59:08 EDT (Mon, 02 Jun 2008)
@@ -40,6 +40,7 @@
 # Boost CMake modules                                                    #
 ##########################################################################
 list(APPEND CMAKE_MODULE_PATH ${Boost_SOURCE_DIR}/tools/build/CMake)
+include(BoostBuildSlave)
 include(BoostUtils)
 include(BoostConfig)
 include(BoostCore)
Added: branches/CMake/release/tools/build/CMake/BoostBuildSlave.cmake
==============================================================================
--- (empty file)
+++ branches/CMake/release/tools/build/CMake/BoostBuildSlave.cmake	2008-06-02 16:59:08 EDT (Mon, 02 Jun 2008)
@@ -0,0 +1,67 @@
+##########################################################################
+# Boost Build Slave Support                                              #
+##########################################################################
+# Copyright (C) 2008 Troy D. Straszheim                                  #
+#                                                                        #
+# Distributed under the Boost Software License, Version 1.0.             #
+# See accompanying file LICENSE_1_0.txt or copy at                       #
+#   http://www.boost.org/LICENSE_1_0.txt                                 #
+##########################################################################
+option(BOOST_BUILD_SLAVE "Be a build slave, report build/testing" OFF)
+
+message(STATUS "Configuring test/compile drivers")
+  
+if(CMAKE_VERBOSE_MAKEFILE)
+  set(BOOST_DRIVER_VERBOSE True)
+else(CMAKE_VERBOSE_MAKEFILE)
+  set(BOOST_DRIVER_VERBOSE False)
+endif(CMAKE_VERBOSE_MAKEFILE)
+
+# the program that does the posting when BOOST_BUILD_SLAVE is on
+configure_file(tools/build/CMake/post.py.in ${CMAKE_BINARY_DIR}/post.py @ONLY)
+
+# the programs that sit between 'make' and the test binaries, one does xmlization
+# the other doesn't.  T
+configure_file(tools/build/CMake/passthru.py.in ${CMAKE_BINARY_DIR}/passthru.py @ONLY)
+configure_file(tools/build/CMake/xmlize.py.in ${CMAKE_BINARY_DIR}/xmlize.py @ONLY)
+
+#
+# the test driver is either 
+#
+if(BOOST_BUILD_SLAVE)
+  set(BOOST_TEST_DRIVER ${CMAKE_BINARY_DIR}/xmlize.py)
+else(BOOST_BUILD_SLAVE)
+  set(BOOST_TEST_DRIVER ${CMAKE_BINARY_DIR}/passthru.py)
+endif(BOOST_BUILD_SLAVE)
+
+if(BOOST_BUILD_SLAVE)
+
+  #
+  #  Redirect various build steps
+  # 
+  set(CMAKE_CXX_COMPILE_OBJECT 
+    "${BOOST_TEST_DRIVER} <CMAKE_CURRENT_BINARY_DIR> cxx_compile_object <OBJECT> ${CMAKE_CXX_COMPILE_OBJECT}")
+
+  set(CMAKE_CXX_CREATE_SHARED_LIBRARY  
+    "${BOOST_TEST_DRIVER} <CMAKE_CURRENT_BINARY_DIR> create_shared_library <TARGET> ${CMAKE_CXX_CREATE_SHARED_LIBRARY}") 
+    
+  set(CMAKE_CXX_CREATE_STATIC_LIBRARY  
+    "${BOOST_TEST_DRIVER} <CMAKE_CURRENT_BINARY_DIR> create_static_library <TARGET> ${CMAKE_CXX_CREATE_STATIC_LIBRARY}") 
+
+  set(CMAKE_CXX_LINK_EXECUTABLE  
+    "${BOOST_TEST_DRIVER} <CMAKE_CURRENT_BINARY_DIR> link_executable <TARGET> ${CMAKE_CXX_LINK_EXECUTABLE}") 
+
+endif(BOOST_BUILD_SLAVE)
+
+macro(boost_post_results PROJECT_NAME_ LIBRARY_TARGET WHAT LOGDIR)
+
+  if(BOOST_BUILD_SLAVE)
+    add_custom_command(TARGET ${LIBRARY_TARGET}
+      POST_BUILD
+      COMMAND ${CMAKE_BINARY_DIR}/post.py ${PROJECT_NAME_} ${WHAT} ${LOGDIR}
+      COMMENT "${PROJECT_NAME_}: posting build results for ${WHAT} from ${LOGDIR}"
+      )
+    set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${LOGDIR}/Log.xml)
+
+  endif(BOOST_BUILD_SLAVE)
+endmacro(boost_post_results LIBRARY_TARGET)
Modified: branches/CMake/release/tools/build/CMake/BoostCore.cmake
==============================================================================
--- branches/CMake/release/tools/build/CMake/BoostCore.cmake	(original)
+++ branches/CMake/release/tools/build/CMake/BoostCore.cmake	2008-06-02 16:59:08 EDT (Mon, 02 Jun 2008)
@@ -277,12 +277,26 @@
         "Enable testing of Boost.${LIBNAME}" 
         ON)
 
-      # Only include the test directories when testing is enabled for
-      # this project.
+      # Only create test target and include the test directories
+      # when testing is enabled for this project.
       if(${BOOST_TEST_LIB_OPTION})
+	add_custom_target(${PROJECT_NAME}-test)
+
+	add_dependencies(test
+	  ${PROJECT_NAME}-test
+	  )
+
+	# the last argument here, the binary directory that the 
+	# logs are in, has to match the binary directory
+	# passed to 'add_subdirectory', in the foreach() just below
+	boost_post_results(${PROJECT_NAME} ${PROJECT_NAME}-test
+	  test
+	  ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-test)
+
         foreach(SUBDIR ${THIS_PROJECT_TESTDIRS})
-          add_subdirectory(${SUBDIR})
-        endforeach(SUBDIR ${THIS_PROJECT_TESTDIRS})
+          add_subdirectory(${SUBDIR} ${PROJECT_NAME}-test)
+        endforeach()
+
       endif(${BOOST_TEST_LIB_OPTION})
     endif(BUILD_TESTING AND THIS_PROJECT_TESTDIRS)
 
@@ -705,73 +719,77 @@
     # The basic LIBNAME target depends on each of the variants
     add_dependencies(${LIBNAME} ${VARIANT_LIBNAME})
     
+    boost_post_results(${PROJECT_NAME} ${VARIANT_LIBNAME} build ${CMAKE_CURRENT_BINARY_DIR})
+
     # Link against whatever libraries this library depends on
     target_link_libraries(${VARIANT_LIBNAME} ${THIS_VARIANT_LINK_LIBS})
     foreach(dependency ${THIS_LIB_DEPENDS})
       target_link_libraries(${VARIANT_LIBNAME} "${dependency}${VARIANT_TARGET_NAME}")
     endforeach(dependency)
 
-    # Setup installation properties
-    string(TOUPPER "${PROJECT_NAME}${VARIANT_TARGET_NAME}" LIB_COMPONENT)
-    string(REPLACE "-" "_" LIB_COMPONENT ${LIB_COMPONENT})
-    get_property(LIB_COMPONENT_EXISTS
-      GLOBAL PROPERTY CPACK_COMPONENT_${LIB_COMPONENT}_DISPLAY_NAME SET)
-    if (LIB_COMPONENT_EXISTS)
-      # There is more than one library binary associated with this
-      # installation component (e.g., both boost_serialization and 
-      # boost_wserialization library binaries), so update the
-      # display name of the installation component to the plural
-      # "libraries".
-      set_property(GLOBAL
-        PROPERTY CPACK_COMPONENT_${LIB_COMPONENT}_DISPLAY_NAME
-        "${VARIANT_DISPLAY_NAME} libraries")
-    else()
-      set_property(GLOBAL APPEND 
-        PROPERTY CPACK_COMPONENTS_ALL 
-        ${LIB_COMPONENT})
-      boost_set_cpack_variable(
-        CPACK_COMPONENT_${LIB_COMPONENT}_DISPLAY_NAME
-        "${VARIANT_DISPLAY_NAME} library")
-      boost_set_cpack_variable(
-        CPACK_COMPONENT_${LIB_COMPONENT}_GROUP 
-        ${ULIBNAME})
-    endif()
-    
-    # Installation of this library variant
-    string(TOUPPER ${PROJECT_NAME} ULIBNAME)
-    install(TARGETS ${VARIANT_LIBNAME} DESTINATION lib
-      EXPORT boost-targets
-      COMPONENT ${LIB_COMPONENT})
-    set_property( 
-      TARGET ${VARIANT_LIBNAME}
-      PROPERTY BOOST_CPACK_COMPONENT
-      ${LIB_COMPONENT})
+    if(NOT THIS_LIB_NO_INSTALL)
+      # Setup installation properties
+      string(TOUPPER "${PROJECT_NAME}${VARIANT_TARGET_NAME}" LIB_COMPONENT)
+      string(REPLACE "-" "_" LIB_COMPONENT ${LIB_COMPONENT})
+      get_property(LIB_COMPONENT_EXISTS
+	GLOBAL PROPERTY CPACK_COMPONENT_${LIB_COMPONENT}_DISPLAY_NAME SET)
+      if (LIB_COMPONENT_EXISTS)
+	# There is more than one library binary associated with this
+	# installation component (e.g., both boost_serialization and 
+	# boost_wserialization library binaries), so update the
+	# display name of the installation component to the plural
+	# "libraries".
+	set_property(GLOBAL
+          PROPERTY CPACK_COMPONENT_${LIB_COMPONENT}_DISPLAY_NAME
+          "${VARIANT_DISPLAY_NAME} libraries")
+      else()
+	set_property(GLOBAL APPEND 
+          PROPERTY CPACK_COMPONENTS_ALL 
+          ${LIB_COMPONENT})
+	boost_set_cpack_variable(
+          CPACK_COMPONENT_${LIB_COMPONENT}_DISPLAY_NAME
+          "${VARIANT_DISPLAY_NAME} library")
+	boost_set_cpack_variable(
+          CPACK_COMPONENT_${LIB_COMPONENT}_GROUP 
+          ${ULIBNAME})
+      endif()
+      
+      # Installation of this library variant
+      string(TOUPPER ${PROJECT_NAME} ULIBNAME)
+      install(TARGETS ${VARIANT_LIBNAME} DESTINATION lib
+	EXPORT boost-targets
+	COMPONENT ${LIB_COMPONENT})
+      set_property( 
+	TARGET ${VARIANT_LIBNAME}
+	PROPERTY BOOST_CPACK_COMPONENT
+	${LIB_COMPONENT})
       
-    # Make the library installation component dependent on the library
-    # installation components of dependent libraries.
-    foreach(DEP ${THIS_LIB_DEPENDS})
-      # We ask the library variant that this library depends on to tell us
-      # what it's associated installation component is. We depend on that 
-      # installation component.
-      get_property(DEP_COMPONENT 
-        TARGET "${DEP}${VARIANT_TARGET_NAME}"
-        PROPERTY BOOST_CPACK_COMPONENT)
+      # Make the library installation component dependent on the library
+      # installation components of dependent libraries.
+      foreach(DEP ${THIS_LIB_DEPENDS})
+	# We ask the library variant that this library depends on to tell us
+	# what it's associated installation component is. We depend on that 
+	# installation component.
+	get_property(DEP_COMPONENT 
+          TARGET "${DEP}${VARIANT_TARGET_NAME}"
+          PROPERTY BOOST_CPACK_COMPONENT)
         
-      if (DEP_COMPONENT)
-        if (DEP_COMPONENT STREQUAL LIB_COMPONENT)
-          # Do nothing: we have library dependencies within one 
-          # Boost library
-        else()
-          set_property(GLOBAL APPEND
-          PROPERTY CPACK_COMPONENT_${LIB_COMPONENT}_DEPENDS ${DEP_COMPONENT})
-        endif()
-      endif()
-    endforeach(DEP)
-    if (THIS_LIB_DEPENDS)
-      set_property(GLOBAL APPEND
-        PROPERTY BOOST_CPACK_EXPORTS
-        CPACK_COMPONENT_${LIB_COMPONENT}_DEPENDS)
-    endif ()
+	if (DEP_COMPONENT)
+          if (DEP_COMPONENT STREQUAL LIB_COMPONENT)
+            # Do nothing: we have library dependencies within one 
+            # Boost library
+          else()
+            set_property(GLOBAL APPEND
+              PROPERTY CPACK_COMPONENT_${LIB_COMPONENT}_DEPENDS ${DEP_COMPONENT})
+          endif()
+	endif()
+      endforeach(DEP)
+      if (THIS_LIB_DEPENDS)
+	set_property(GLOBAL APPEND
+          PROPERTY BOOST_CPACK_EXPORTS
+          CPACK_COMPONENT_${LIB_COMPONENT}_DEPENDS)
+      endif ()
+    endif(NOT THIS_LIB_NO_INSTALL)
   endif (THIS_VARIANT_OKAY)
 endmacro(boost_library_variant)
 
@@ -1043,7 +1061,7 @@
 macro(boost_add_library LIBNAME)
   parse_arguments(THIS_LIB
     "DEPENDS;COMPILE_FLAGS;LINK_FLAGS;LINK_LIBS;EXTRA_VARIANTS;${BOOST_ADD_ARG_NAMES}"
-    "STATIC_TAG;MODULE;${BOOST_ADDLIB_OPTION_NAMES}"
+    "STATIC_TAG;MODULE;NO_INSTALL;${BOOST_ADDLIB_OPTION_NAMES}"
     ${ARGN}
     )
   set(THIS_LIB_SOURCES ${THIS_LIB_DEFAULT_ARGS})
@@ -1052,7 +1070,7 @@
     # A top-level target that refers to all of the variants of the
     # library, collectively.
     add_custom_target(${LIBNAME})
-    
+
     if (THIS_LIB_EXTRA_VARIANTS)
       # Build the set of variants that we will generate for this library
       set(THIS_LIB_VARIANTS)
@@ -1330,7 +1348,7 @@
     if (THIS_PROJECT_IS_TOOL)
       set(THIS_EXE_NAME ${EXENAME})
     else()
-      set(THIS_EXE_NAME ${PROJECT_NAME}/${EXENAME})
+      set(THIS_EXE_NAME ${PROJECT_NAME}-${EXENAME})
     endif()
     add_executable(${THIS_EXE_NAME} ${THIS_EXE_SOURCES})
     
Modified: branches/CMake/release/tools/build/CMake/BoostTesting.cmake
==============================================================================
--- branches/CMake/release/tools/build/CMake/BoostTesting.cmake	(original)
+++ branches/CMake/release/tools/build/CMake/BoostTesting.cmake	2008-06-02 16:59:08 EDT (Mon, 02 Jun 2008)
@@ -1,8 +1,8 @@
 ##########################################################################
 # Regression Testing Support for Boost                                   #
 ##########################################################################
-# Copyright (C) 2007 Douglas Gregor <doug.gregor_at_[hidden]>              #
-# Copyright (C) 2007 Troy Straszheim                                     #
+# Copyright (C) 2007-8 Douglas Gregor <doug.gregor_at_[hidden]>            #
+# Copyright (C) 2007-8 Troy D. Straszheim                                #
 #                                                                        #
 # Distributed under the Boost Software License, Version 1.0.             #
 # See accompanying file LICENSE_1_0.txt or copy at                       #
@@ -35,9 +35,10 @@
 # is significantly faster when we aren't also building regression
 # tests.
 option(BUILD_TESTING "Enable testing" OFF)
-include(CTest)
 
 if (BUILD_TESTING)
+  add_custom_target(test COMMENT "Running all tests")
+
   option(TEST_INSTALLED_TREE "Enable testing of an already-installed tree" OFF)
 
   if (TEST_INSTALLED_TREE)
@@ -55,7 +56,8 @@
 #                         [COMPILE_FLAGS compileflags]
 #                         [LINK_FLAGS linkflags]
 #                         [LINK_LIBS linklibs]
-#                         [DEPENDS libdepend1 libdepend2 ...])
+#                         [DEPENDS libdepend1 libdepend2 ...]
+#                         [COMPILE] [RUN] [FAIL])
 #
 # testname is the name of the test. The remaining arguments passed to
 # this macro will be parsed and categorized for the developer-level
@@ -71,15 +73,24 @@
 #   source files, BOOST_TEST_SOURCES will contain those; otherwise,
 #   BOOST_TEST_SOURCES will only contain "testname.cpp".
 #
+#   BOOST_TEST_TAG:  compile, compile_fail, run, or run_fail.
+#   Used in test-reporting systems.
+#
+#   BOOST_TEST_TESTNAME: A (hopefully) globally unique target name
+#   for the test, constructed from PROJECT-testname-TAG
+#
 #   BOOST_TEST_arg: Will be populated with the arguments provided for
 #   the arguemnt "arg", where "arg" can be any of the extra arguments
 #   specified above.
+#
+#   
 macro(boost_test_parse_args testname)
+  #message("boost_test_parse_args ${testname} ${ARGN}")
   set(BOOST_TEST_OKAY TRUE)
   set(BOOST_TEST_COMPILE_FLAGS "")
   parse_arguments(BOOST_TEST 
     "LINK_LIBS;LINK_FLAGS;DEPENDS;COMPILE_FLAGS;ARGS"
-    ""
+    "COMPILE;RUN;LINK;FAIL"
     ${ARGN}
     )
     
@@ -109,10 +120,26 @@
     set(BOOST_TEST_SOURCES "${testname}.cpp")
   endif (BOOST_TEST_DEFAULT_ARGS)
 
+  #message("Sources: ${BOOST_TEST_SOURCES}")
+  if (BOOST_TEST_RUN)
+    set(BOOST_TEST_TAG "run")
+  elseif(BOOST_TEST_COMPILE)
+    set(BOOST_TEST_TAG "compile")
+  elseif(BOOST_TEST_LINK)
+    set(BOOST_TEST_TAG "link")
+  endif(BOOST_TEST_RUN)
+
+  if (BOOST_TEST_FAIL)
+    set(BOOST_TEST_TAG ${BOOST_TEST_TAG}-fail)
+  endif(BOOST_TEST_FAIL)
+
+  set(BOOST_TEST_TESTNAME "${PROJECT_NAME}-${testname}-${BOOST_TEST_TAG}")
+  #message("testname: ${BOOST_TEST_TESTNAME}")
   # If testing is turned off, this test is not okay
   if (NOT BUILD_TESTING)
     set(BOOST_TEST_OKAY FALSE)
   endif(NOT BUILD_TESTING)
+
 endmacro(boost_test_parse_args)
 
 # This macro creates a Boost regression test that will be executed. If
@@ -169,102 +196,52 @@
 #     best library variant available to meet those features and the
 #     current build variant (Debug or Release).
 macro(boost_test_run testname)
-  if (BUILD_TESTING)
-    boost_add_executable(${testname} ${ARGN}
+  boost_test_parse_args(${testname} ${ARGN} RUN)
+  if (BOOST_TEST_OKAY)
+    boost_add_executable(${testname} ${BOOST_TEST_SOURCES}
       OUTPUT_NAME tests/${PROJECT_NAME}/${testname}
+      DEPENDS "${BOOST_TEST_DEPENDS}"
       NO_INSTALL)
+
     if (THIS_EXE_OKAY)
-      add_test("${PROJECT_NAME}::${testname}" 
-        ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/tests/${PROJECT_NAME}/${testname} 
-        ${THIS_EXE_ARGS})
-    endif (THIS_EXE_OKAY)
-  endif(BUILD_TESTING)
+
+      # This target builds and runs the test
+      add_custom_target(${BOOST_TEST_TESTNAME})
+
+      set(THIS_TEST_PREFIX_ARGS
+	${BOOST_TEST_DRIVER} ${CMAKE_CURRENT_BINARY_DIR} ${BOOST_TEST_TAG} ${testname} 
+	)
+
+      add_custom_command(TARGET ${BOOST_TEST_TESTNAME}
+	POST_BUILD
+	COMMAND 
+	${THIS_TEST_PREFIX_ARGS} 
+	${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/tests/${PROJECT_NAME}/${testname}
+	${THIS_EXE_ARGS}
+	COMMENT "Running ${testname} in project ${PROJECT_NAME}"
+	)
+
+      add_dependencies(${BOOST_TEST_TESTNAME}
+	${PROJECT_NAME}-${testname}
+	)
+
+      add_dependencies(${PROJECT_NAME}-test
+	${BOOST_TEST_TESTNAME}
+	)
+
+    endif(THIS_EXE_OKAY)
+  endif (BOOST_TEST_OKAY)
 endmacro(boost_test_run)
 
-# This macro creates a Boost regression test that will be executed. If
-# the test can be built, executed, and exits with a return code that
-# is not zero, it will be considered to have passed.
-#
-#   boost_test_run_fail(testname 
-#                       [source1 source2 ...]
-#                       [ARGS arg1 arg2... ]
-#                       [COMPILE_FLAGS compileflags]
-#                       [LINK_FLAGS linkflags]
-#                       [LINK_LIBS linklibs]
-#                       [DEPENDS libdepend1 libdepend2 ...])
-#
-# testname is the name of the test. source1, source2, etc. are the
-# source files that will be built and linked into the test
-# executable. If no source files are provided, the file "testname.cpp"
-# will be used instead.
-#
-# There are several optional arguments to control how the regression
-# test is built and executed:
-#
-#   ARGS: Provides additional arguments that will be passed to the
-#   test executable when it is run.
-#
-#   COMPILE_FLAGS: Provides additional compilation flags that will be
-#   used when building this test. For example, one might want to add
-#   "-DBOOST_SIGNALS_ASSERT=1" to turn on assertions within the library.
-#
-#   LINK_FLAGS: Provides additional flags that will be passed to the
-#   linker when linking the test excecutable. This option should not
-#   be used to link in additional libraries; see LINK_LIBS and
-#   DEPENDS.
-#
-#   LINK_LIBS: Provides additional libraries against which the test
-#   executable will be linked. For example, one might provide "expat"
-#   as options to LINK_LIBS, to state that this executable should be
-#   linked against the external "expat" library. Use LINK_LIBS for
-#   libraries external to Boost; for Boost libraries, use DEPENDS.
-#
-#   DEPENDS: States that this test executable depends on and links
-#   against another Boost library. The argument to DEPENDS should be
-#   the name of a particular variant of a Boost library, e.g.,
-#   boost_signals-static.
-#
-# Example:
-#   boost_test_run_fail(prg_exec_fail1 DEPENDS boost_prg_exec_monitor-static)
-#
-# TODO: 
-#   - Improve handling of DEPENDS, so that we can specify just the
-#     library's abstract target (e.g., "boost_signals"), and possibly
-#     some features required for building the test (e.g.,
-#     MULTI_THREADED, STATIC). The test macros should then pick the
-#     best library variant available to meet those features and the
-#     current build variant (Debug or Release).
+# 
+# This macro creates a boost regression test that will be run but is
+# expected to fail (exit with nonzero return code).
+# See boost_test_run()
+# 
 macro(boost_test_run_fail testname)
-  if (BUILD_TESTING)
-    boost_add_executable(${testname} ${ARGN}
-      OUTPUT_NAME tests/${PROJECT_NAME}/${testname}
-      NO_INSTALL)
-    if (THIS_EXE_OKAY)
-      add_test("${PROJECT_NAME}::${testname}" 
-        ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/tests/${PROJECT_NAME}/${testname} 
-        ${THIS_EXE_ARGS})
-      set_tests_properties("${PROJECT_NAME}::${testname}" 
-        PROPERTIES WILL_FAIL TRUE)
-    endif (THIS_EXE_OKAY)
-  endif(BUILD_TESTING)
+  boost_test_run(${testname} ${ARGN} FAIL)
 endmacro(boost_test_run_fail)
 
-# Under construction...
-
-macro(boost_test_link testname)
-  boost_test_parse_args(${testname} ${ARGN})
-  if(BOOST_TEST_OKAY)
-    add_test("${PROJECT_NAME}::${testname}"
-  	     ${CMAKE_CTEST_COMMAND}
-             --build-and-test
-             ${Boost_SOURCE_DIR}/tools/build/CMake/LinkTest
-             ${Boost_BINARY_DIR}/tools/build/CMake/LinkTest
-             --build-generator {CMAKE_GENERATOR}
-             --build-makeprogram ${MAKEPROGRAM}
-	     --build-project LinkTest
-	     --build-options -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/${BOOST_TEST_SOURCES} -DINCLUDES=${Boost_SOURCE_DIR} -DCOMPILE_FLAGS="${BOOST_TEST_COMPILE_FLAGS}")
-  endif(BOOST_TEST_OKAY)
-endmacro(boost_test_link)
 
 # This macro creates a Boost regression test that will be compiled,
 # but not linked or executed. If the test can be compiled with no
@@ -284,67 +261,95 @@
 # Example:
 #   boost_test_compile(advance)
 macro(boost_test_compile testname)
-  boost_test_parse_args(${testname} ${ARGN})
+  boost_test_parse_args(${testname} ${ARGN} COMPILE)
 
-  # Determine the include directories to pass along to the underlying
-  # project.
-  get_directory_property(BOOST_TEST_INCLUDE_DIRS INCLUDE_DIRECTORIES)
-  set(BOOST_TEST_INCLUDES "")
-  foreach(DIR ${BOOST_TEST_INCLUDE_DIRS})
-    set(BOOST_TEST_INCLUDES "${BOOST_TEST_INCLUDES}:${DIR}")
-  endforeach(DIR ${BOOST_TEST_INCLUDE_DIRS})
 
-  if(BOOST_TEST_OKAY)
-    add_test("${PROJECT_NAME}::${testname}"
-  	     ${CMAKE_CTEST_COMMAND}
-             --build-and-test
-             ${Boost_SOURCE_DIR}/tools/build/CMake/CompileTest
-             ${Boost_BINARY_DIR}/tools/build/CMake/CompileTest
-             --build-generator ${CMAKE_GENERATOR}
-             --build-makeprogram ${MAKEPROGRAM}
-	     --build-project CompileTest
-	     --build-options -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/${BOOST_TEST_SOURCES} -DINCLUDES=${BOOST_TEST_INCLUDES} -DCOMPILE_FLAGS=${BOOST_TEST_COMPILE_FLAGS})
+  if (BOOST_TEST_OKAY)
+    # Determine the include directories to pass along to the underlying
+    # project.
+    # works but not great
+    get_directory_property(BOOST_TEST_INCLUDE_DIRS INCLUDE_DIRECTORIES)
+    set(BOOST_TEST_INCLUDES "")
+    foreach(DIR ${BOOST_TEST_INCLUDE_DIRS})
+      set(BOOST_TEST_INCLUDES "${BOOST_TEST_INCLUDES};-I${DIR}")
+    endforeach(DIR ${BOOST_TEST_INCLUDE_DIRS})
+
+    set(THIS_TEST_PREFIX_ARGS
+      ${BOOST_TEST_DRIVER} ${CMAKE_CURRENT_BINARY_DIR} ${BOOST_TEST_TAG} ${testname} 
+      )
+  
+    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${testname}-${BOOST_TEST_TAG}.o
+      COMMAND 
+      ${THIS_TEST_PREFIX_ARGS}
+      ${CMAKE_CXX_COMPILER} 
+      ${BOOST_TEST_COMPILE_FLAGS} 
+      ${BOOST_TEST_INCLUDES}
+      -c ${BOOST_TEST_SOURCES}
+      -o ${testname}-compile-test.o
+      COMMENT "Running ${testname} in project ${PROJECT_NAME}"
+      )
+
+    add_custom_target(${BOOST_TEST_TESTNAME}
+      DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${testname}-${BOOST_TEST_TAG}.o
+      )
+
+    add_dependencies(${PROJECT_NAME}-test
+      ${BOOST_TEST_TESTNAME}
+      )
+
   endif(BOOST_TEST_OKAY)
 endmacro(boost_test_compile)
 
-# This macro creates a Boost regression test that will be compiled,
-# but compilation should fail. It is used to test, e.g., that certain
-# disallowed syntax does in fact cause a compilation failure.
 #
-#   boost_test_compile_fail(testname 
-#                           [source1]
-#                           [COMPILE_FLAGS compileflags])
+# This macro creates a Boost regression test that is expected to 
+# *fail* to compile.   See boost_test_compile()
 #
-# testname is the name of the test. source1 is the name of the source
-# file that will be built. If no source file is provided, the file
-# "testname.cpp" will be used instead.
-#
-# The COMPILE_FLAGS argument provides additional arguments that will
-# be passed to the compiler when building this test.
-
-# Example:
-#   boost_test_compile_fail(function_test_fail1)
 macro(boost_test_compile_fail testname)
-  boost_test_parse_args(${testname} ${ARGN})
+  boost_test_compile(${testname} ${ARGN} FAIL)
+endmacro(boost_test_compile_fail)
 
-  # Determine the include directories to pass along to the underlying
-  # project.
-  get_directory_property(BOOST_TEST_INCLUDE_DIRS INCLUDE_DIRECTORIES)
-  set(BOOST_TEST_INCLUDES "")
-  foreach(DIR ${BOOST_TEST_INCLUDE_DIRS})
-    set(BOOST_TEST_INCLUDES "${BOOST_TEST_INCLUDES}:${DIR}")
-  endforeach(DIR ${BOOST_TEST_INCLUDE_DIRS})
-    
+
+
+
+#
+# boost_test_link:
+#
+# Under construction.
+#
+macro(boost_test_link testname)
+  boost_test_parse_args(${testname} ${ARGN} LINK)
   if(BOOST_TEST_OKAY)
-    add_test("${PROJECT_NAME}::${testname}"
-	     ${CMAKE_CTEST_COMMAND}
-             --build-and-test
-             ${Boost_SOURCE_DIR}/tools/build/CMake/CompileTest
-             ${Boost_BINARY_DIR}/tools/build/CMake/CompileTest
-             --build-generator ${CMAKE_GENERATOR}
-             --build-makeprogram ${MAKEPROGRAM}
-	     --build-project CompileTest
-	     --build-options -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/${BOOST_TEST_SOURCES} -DINCLUDES=${BOOST_TEST_INCLUDES} -DCOMPILE_FLAGS=${BOOST_TEST_COMPILE_FLAGS})
-    set_tests_properties("${PROJECT_NAME}::${testname}" PROPERTIES WILL_FAIL ON)
+
+    set(THIS_TEST_PREFIX_ARGS
+      ${BOOST_TEST_DRIVER} ${CMAKE_CURRENT_BINARY_DIR} test_link ${testname} 
+      )
+    
+    #
+    #  FIXME:  no ctest.
+    #
+    add_custom_target(TARGET ${BOOST_TEST_TESTNAME}
+      COMMAND /link/tests/are/failing/at/the/moment
+      COMMENT "Link test ${testname} in ${PROJECT_NAME} is failing."
+      )
+
+    # POST_BUILD
+    # COMMAND 
+    # ${THIS_TEST_PREFIX_ARGS}
+    # ${CMAKE_CTEST_COMMAND}
+    # --build-and-test
+    # ${Boost_SOURCE_DIR}/tools/build/CMake/LinkTest
+    # ${Boost_BINARY_DIR}/tools/build/CMake/LinkTest
+    # --build-generator \\"${CMAKE_GENERATOR}\\"
+    # --build-makeprogram \\"${MAKEPROGRAM}\\"
+    # --build-project LinkTest
+    # --build-options -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/${BOOST_TEST_SOURCES} -DINCLUDES=${Boost_SOURCE_DIR} -DCOMPILE_FLAGS=\\"${BOOST_TEST_COMPILE_FLAGS}\\"
+    # COMMENT "Running ${testname} (link) in project ${PROJECT_NAME}"
+    # )
+
+    add_dependencies(${PROJECT_NAME}-test
+      ${BOOST_TEST_TESTNAME}
+      )
+    
   endif(BOOST_TEST_OKAY)
-endmacro(boost_test_compile_fail)
+endmacro(boost_test_link)
+
Added: branches/CMake/release/tools/build/CMake/passthru.py.in
==============================================================================
--- (empty file)
+++ branches/CMake/release/tools/build/CMake/passthru.py.in	2008-06-02 16:59:08 EDT (Mon, 02 Jun 2008)
@@ -0,0 +1,67 @@
+#!/usr/bin/python
+#
+#  copyright (C) 2008  troy d. straszheim  <troy_at_[hidden]>
+#  
+#  Distributed under the Boost Software License, Version 1.0.
+#  See accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt
+#
+
+#
+#  "Passthru" driver, only responsible for 'flipping' exit status of
+#  tests that are expected to fail.  See driver.py for the version
+#  that is run when BOOST_BUILD_SLAVE is on, which does xmlizaton
+#  and the like
+#
+import sys, os, os.path
+from subprocess import Popen, PIPE
+
+def verbose(what):
+    if @BOOST_DRIVER_VERBOSE@:
+        print what
+
+# ignored
+# log = os.path.join(sys.argv[1], "Log.xml")
+op = sys.argv[2]
+# target = sys.argv[3]
+argv = sys.argv[4:]
+expect_fail = op.endswith("fail")
+
+#
+#  execute subprocess
+#
+subproc = None
+returncode = None
+ex = None
+try:
+    subproc = Popen(argv, stdout=PIPE, stderr=PIPE)
+    returncode = subproc.wait()
+except EnvironmentError, e:
+    ex = e
+
+print subproc.stdout.read()
+print subproc.stderr.read()
+
+if not ex: 
+    # possibly flip the return code
+    if not expect_fail:
+        if not returncode:
+            verbose("ok.")
+        else:
+            verbose("error.")
+        sys.exit(returncode)
+    else:
+        if returncode != 0:
+            verbose("ok.")
+            sys.exit(0)
+        else: 
+            verbose("*** UNEXPECTED SUCCESS ***")
+            sys.exit(1)  # we need an exit status for 'unexpected success'
+else:
+    # if there is an os error 'above' the actual exit status of the subprocess,
+    # use the errno
+    print "Error in build system: " + str(ex.strerror)
+    sys.exit(ex.errno)
+
+    
+
Added: branches/CMake/release/tools/build/CMake/post.py.in
==============================================================================
--- (empty file)
+++ branches/CMake/release/tools/build/CMake/post.py.in	2008-06-02 16:59:08 EDT (Mon, 02 Jun 2008)
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+#
+#  copyright (C) 2008  troy d. straszheim  <troy_at_[hidden]>
+#  
+#  Distributed under the Boost Software License, Version 1.0.
+#  See accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt
+#
+
+#
+#  HTTP POST the build log
+#
+
+import sys, os, os.path
+from subprocess import Popen, PIPE
+import xml.etree.ElementTree as ET
+
+project_name = sys.argv[1]
+library_target = sys.argv[2]
+logdir = sys.argv[3]
+
+print "\n>>>\n>>> Project " + project_name \
+      + "\n>>> POST build log for " + library_target \
+      + "\n>>> from log dir" + logdir \
+      + "\n>>>\n"
+
+#
+# Here you would actually do an http post.  Just print for now.
+#
+p = os.path.join(logdir, "Log.xml")
+
+f = open(p)
+print f.read() + "\n"
+f.close()
+os.remove(p)
+
Added: branches/CMake/release/tools/build/CMake/xmlize.py.in
==============================================================================
--- (empty file)
+++ branches/CMake/release/tools/build/CMake/xmlize.py.in	2008-06-02 16:59:08 EDT (Mon, 02 Jun 2008)
@@ -0,0 +1,89 @@
+#!/usr/bin/python
+#
+#  copyright (C) 2008  troy d. straszheim  <troy_at_[hidden]>
+#  
+#  Distributed under the Boost Software License, Version 1.0.
+#  See accompanying file LICENSE_1_0.txt or copy at
+#  http://www.boost.org/LICENSE_1_0.txt
+#
+
+#
+#  Compiler driver.  Takes a few arguments describing what is to be done
+#  (used to mark up the output) and executes compiler in a subshell, checking
+#  for errors and xmlizing any output.
+#
+import sys, os.path
+from subprocess import Popen, PIPE
+import xml.etree.ElementTree as ET
+
+log = os.path.join(sys.argv[1], "Log.xml")
+op = sys.argv[2]
+target = sys.argv[3]
+argv = sys.argv[4:]
+expect_fail = op.endswith("fail")
+passthru = op.startswith("passthru")
+
+if not passthru:
+    print "***\n*** Executing op:" + op + "\n*** " + str(argv) + "\n*** log=" + log + "\n***"
+
+#
+#  execute subprocess
+#
+subproc = None
+returncode = None
+ex = None
+try:
+    subproc = Popen(argv, stdout=PIPE, stderr=PIPE)
+    returncode = subproc.wait()
+except EnvironmentError, e:
+    ex = e
+
+#
+#  Collect, possibly xmlize, and print subprocess return info
+#
+
+if not passthru:
+    root = ET.Element(op)
+    ET.SubElement(root, "target").text = target
+
+    ET.SubElement(root, "commandline").text = " ".join(argv)
+
+    if not ex:
+        ET.SubElement(root, "returncode").text = str(returncode)
+        stdout = subproc.stdout.read()
+        stderr = subproc.stderr.read()
+        if returncode != 0 and not expect_fail:
+            print "*** stdout:" + stdout
+            print "*** stderr:" + stderr
+        else:
+            print "*** OK"
+            ET.SubElement(root, "stdout").text = stdout
+            ET.SubElement(root, "stderr").text = stderr
+    
+    else:
+        ET.SubElement(root, "errno").text = str(ex.errno)
+        ET.SubElement(root, "filename").text = ex.filename
+        ET.SubElement(root, "message").text = ex.message
+        ET.SubElement(root, "strerror").text = ex.strerror
+        print "Errno:" + str(ex.errno) + ": " + ex.strerror
+
+    f = open(log, "a")
+    f.write(ET.tostring(root) + "\n")
+else:
+    print subproc.stdout.read(),
+    print subproc.stderr.read(),
+
+if ex:
+    sys.exit(ex.errno)
+else:
+    if expect_fail:
+        if returncode != 0:
+            sys.exit(0)
+        else: 
+            print "UNEXPECTED SUCCESS"
+            sys.exit(1)  # we need an exit status for 'unexpected success'
+    else:
+        sys.exit(returncode)
+
+    
+