colorizing and output tweaks
[boost:zeuners-boost-cmake.git] / libs / CMakeLists.txt
1 #
2 # Copyright Troy D. Straszheim
3 #
4 # Distributed under the Boost Software License, Version 1.0.
5 # See http://www.boost.org/LICENSE_1_0.txt
6 #
7 # Find each subdirectory containing a CMakeLists.txt file, and include
8 # it. This avoids the need to manually list which libraries in Boost
9 # have CMakeLists.txt files.
10
11 # return a list of directories that we should add_subdirectory()
12 macro(BOOST_COLLECT_SUBPROJECT_DIRECTORY_NAMES dirname varname filename)
13   file(GLOB globbed RELATIVE "${dirname}" "${dirname}/*/${filename}")
14   foreach(file ${globbed})
15     get_filename_component(dir ${file} PATH)
16     set(${varname} ${${varname}} ${dir})
17   endforeach()
18 endmacro()
19
20 # Find all of the subdirectories with .cmake files in them. These are
21 # the libraries with dependencies.
22 boost_collect_subproject_directory_names(${BOOST_LIBS_PARENT_DIR} BOOST_MODULE_DIRS "module.cmake")
23 foreach(subdir ${BOOST_MODULE_DIRS})
24   include("${BOOST_LIBS_PARENT_DIR}/${subdir}/module.cmake")
25 endforeach(subdir)
26
27 # Find all of the subdirectories with CMakeLists.txt files in
28 # them. This contains all of the Boost libraries.
29 boost_collect_subproject_directory_names(${BOOST_LIBS_PARENT_DIR} BOOST_SUBPROJECT_DIRS "CMakeLists.txt")
30
31 # Add all of the Boost projects in reverse topological order, so that
32 # a library's dependencies show up before the library itself.
33 set(CPACK_INSTALL_CMAKE_COMPONENTS_ALL)
34 list(SORT BOOST_SUBPROJECT_DIRS)
35 topological_sort(BOOST_SUBPROJECT_DIRS BOOST_ _DEPENDS)
36
37 #
38 # Sanity-check for typos: all projects in BUILD_PROJECTS must exist
39 #
40 if ((NOT BUILD_PROJECTS STREQUAL "ALL") AND (NOT BUILD_PROJECTS STREQUAL "NONE"))
41   foreach(project ${BUILD_PROJECTS})
42     list(FIND BOOST_SUBPROJECT_DIRS ${project} THIS_SUBPROJECT_DIRS_INDEX)
43     if (THIS_SUBPROJECT_DIRS_INDEX LESS 0)
44       message(FATAL_ERROR "Nonexistant project \"${project}\" specified in BUILD_PROJECTS.  These project names should be all lowercase.")
45     endif()
46   endforeach()
47 endif()
48
49 set(BOOST_TEST_PROJECTS "" CACHE INTERNAL "hi" FORCE)
50
51 #
52 # include only directories of projects in BUILD_PROJECTS
53 #
54 message(STATUS "")
55 colormsg(_HIBLUE_ "Reading boost project directories (per BUILD_PROJECTS)")
56 message(STATUS "")
57 set(BOOST_ALL_COMPONENTS "")
58
59 foreach(subdir ${BOOST_SUBPROJECT_DIRS})
60   list(FIND BUILD_PROJECTS ${subdir} THIS_BUILD_PROJECTS_INDEX)
61   if ((THIS_BUILD_PROJECTS_INDEX GREATER -1) OR (BUILD_PROJECTS STREQUAL "ALL"))
62     message(STATUS "+ ${subdir}")
63     add_subdirectory(${BOOST_LIBS_PARENT_DIR}/${subdir} ${CMAKE_BINARY_DIR}/libs/${subdir})
64   endif()
65 endforeach()
66
67 #
68 #  If we're doing selftests, add those selftest dirs
69 #
70 foreach(project 
71     ${BOOST_CMAKE_SELFTEST_PROJECTS})
72   colormsg(RED "* ${project}")
73   add_subdirectory(${CMAKE_SOURCE_DIR}/tools/build/CMake/selftest_projects/${project}
74     ${CMAKE_BINARY_DIR}/libs/${project})
75 endforeach()
76
77
78 set(BOOST_ALL_COMPONENTS ${BOOST_ALL_COMPONENTS} PARENT_SCOPE)
79
80 if(BUILD_TESTS AND NOT BUILD_TESTS STREQUAL "NONE")
81   message(STATUS "")
82   colormsg(_HIBLUE_ "Traversing project test directories (per BUILD_TESTS)")
83   message(STATUS "")
84 else()
85   message(STATUS "")
86   colormsg(RED "BUILD_TESTS is NONE: skipping test directories.")
87   message(STATUS "")
88 endif()
89
90 foreach(PROJ ${BOOST_TEST_PROJECTS})
91   string(TOLOWER ${PROJ} proj)
92   project(${proj})
93   set(BOOST_PROJECT_NAME ${proj})
94   foreach(dir ${BOOST_${PROJ}_TESTDIRS})
95     message(STATUS "+ ${proj}")
96     add_subdirectory(${dir} ${CMAKE_BINARY_DIR}/libs/${proj}/test)
97   endforeach()
98 endforeach()
99
100 # Write out a GraphViz file containing inter-library dependencies. 
101 set(BOOST_DEPENDENCY_GRAPHVIZ_FILE "${Boost_BINARY_DIR}/dependencies.dot")
102 file(WRITE ${BOOST_DEPENDENCY_GRAPHVIZ_FILE} "digraph boost {\n")
103 foreach(SUBDIR ${BOOST_SUBPROJECT_DIRS})
104   string(TOUPPER "BOOST_${SUBDIR}_COMPILED_LIB" BOOST_COMPILED_LIB_VAR)
105   if (${BOOST_COMPILED_LIB_VAR})
106     file(APPEND ${BOOST_DEPENDENCY_GRAPHVIZ_FILE} "  \"${SUBDIR}\" [style=\"filled\" fillcolor=\"#A3A27C\" shape=\"box\"];\n ")
107   endif (${BOOST_COMPILED_LIB_VAR})
108   string(TOUPPER "BOOST_${SUBDIR}_DEPENDS" DEPENDS_VAR)
109   if(DEFINED ${DEPENDS_VAR})
110     foreach(DEP ${${DEPENDS_VAR}})
111       file(APPEND ${BOOST_DEPENDENCY_GRAPHVIZ_FILE} 
112         "  \"${SUBDIR}\" -> \"${DEP}\";\n")
113     endforeach()
114   endif()
115 endforeach()
116 file(APPEND ${BOOST_DEPENDENCY_GRAPHVIZ_FILE} "  \"test\" [style=\"filled\" fillcolor=\"#A3A27C\" shape=\"box\"];\n ")
117 file(APPEND ${BOOST_DEPENDENCY_GRAPHVIZ_FILE} "}\n")