c++boostboost-buildboost-dynamic-bitset

Is boost dynamic_bitset header-only


By all initial indications, boost dynamic_bitset is header only.

The documentation implies that it is header only:

The class dynamic_bitset is defined in the header boost/dynamic_bitset.hpp. Also, there is a forward declaration for dynamic_bitset in the header boost/dynamic_bitset_fwd.hpp.

The library does not appear in the list of "non header-only" libraries in the Getting Started documentation:

Boost Getting Started

Finally, the bootstrap.sh --show-libraries command on my local system with Boost 1.70.0 doesn't list dynamic_bitset as among those requiring separate build and installation:

The Boost libraries requiring separate building and installation are:
    - atomic
    - chrono
    - container
    - context
    - contract
    - coroutine
    - date_time
    - exception
    - fiber
    - filesystem
    - graph
    - graph_parallel
    - headers
    - iostreams
    - locale
    - log
    - math
    - mpi
    - program_options
    - python
    - random
    - regex
    - serialization
    - stacktrace
    - system
    - test
    - thread
    - timer
    - type_erasure
    - wave

However, when I use bcp --list to list the dependencies in order to use only this library, .cpp files are included:

CAUTION: don't know how to trace depenencies through macro: " <memory>" in file: boost/exception/exception.hpp
CAUTION: don't know how to trace depenencies through macro: "PP1" in file: boost/type_traits/detail/is_function_ptr_helper.hpp
CAUTION: don't know how to trace depenencies through macro: "PP1" in file: boost/type_traits/detail/is_function_ptr_helper.hpp
CAUTION: don't know how to trace depenencies through macro: "PP1" in file: boost/type_traits/detail/is_function_ptr_helper.hpp
CAUTION: don't know how to trace depenencies through macro: "PP1" in file: boost/type_traits/detail/is_function_ptr_tester.hpp
CAUTION: don't know how to trace depenencies through macro: "PP2" in file: boost/type_traits/detail/is_function_ptr_tester.hpp
CAUTION: don't know how to trace depenencies through macro: "PP3" in file: boost/type_traits/detail/is_function_ptr_tester.hpp
CAUTION: don't know how to trace depenencies through macro: "PPI" in file: boost/type_traits/detail/is_mem_fun_pointer_impl.hpp
CAUTION: don't know how to trace depenencies through macro: "PPI" in file: boost/type_traits/detail/is_mem_fun_pointer_impl.hpp
CAUTION: don't know how to trace depenencies through macro: "PPI" in file: boost/type_traits/detail/is_mem_fun_pointer_impl.hpp
CAUTION: don't know how to trace depenencies through macro: "PPI" in file: boost/type_traits/detail/is_mem_fun_pointer_tester.hpp
CAUTION: don't know how to trace depenencies through macro: "PPI" in file: boost/type_traits/detail/is_mem_fun_pointer_tester.hpp
CAUTION: don't know how to trace depenencies through macro: "PPI" in file: boost/type_traits/detail/is_mem_fun_pointer_tester.hpp
CAUTION: don't know how to trace depenencies through macro: "BOOST_TYPE_INDEX_USER_TYPEINDEX" in file: boost/type_index.hpp
CAUTION: don't know how to trace depenencies through macro: " <memory>" in file: boost/exception/detail/shared_ptr.hpp
CAUTION: dependent file libs/filesystem/v2 does not exist.
   Found while scanning file boost/filesystem.hpp
CAUTION: dependent file libs/filesystem/v3 does not exist.
   Found while scanning file boost/filesystem.hpp
boost/config/compiler/vacpp.hpp
boost/config/compiler/xlcpp.hpp
boost/config/compiler/xlcpp_zos.hpp
boost/config/stdlib/libcpp.hpp
boost/config/stdlib/libstdcpp3.hpp
boost/config/stdlib/vacpp.hpp
boost/config/stdlib/xlcpp_zos.hpp
boost/predef/language/stdcpp.h
boost/predef/library/std/stdcpp3.h
boost/predef/library/std/vacpp.h
boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp
boost/test/impl/cpp_main.ipp
libs/chrono/src/chrono.cpp
libs/chrono/src/process_cpu_clocks.cpp
libs/chrono/src/thread_clock.cpp
libs/dynamic_bitset/example/example1.cpp
libs/dynamic_bitset/example/example2.cpp
libs/dynamic_bitset/example/example3.cpp
libs/dynamic_bitset/example/timing_tests.cpp
libs/dynamic_bitset/test/dyn_bitset_unit_tests1.cpp
libs/dynamic_bitset/test/dyn_bitset_unit_tests2.cpp
libs/dynamic_bitset/test/dyn_bitset_unit_tests3.cpp
libs/dynamic_bitset/test/dyn_bitset_unit_tests4.cpp
libs/dynamic_bitset/test/dyn_bitset_unit_tests5.cpp
libs/dynamic_bitset/test/test_ambiguous_set.cpp
libs/dynamic_bitset/test/test_lowest_bit.cpp
libs/filesystem/src/codecvt_error_category.cpp
libs/filesystem/src/operations.cpp
libs/filesystem/src/path.cpp
libs/filesystem/src/path_traits.cpp
libs/filesystem/src/portability.cpp
libs/filesystem/src/unique_path.cpp
libs/filesystem/src/utf8_codecvt_facet.cpp
libs/filesystem/src/windows_file_codecvt.cpp
libs/serialization/src/archive_exception.cpp
libs/serialization/src/basic_archive.cpp
libs/serialization/src/basic_iarchive.cpp
libs/serialization/src/basic_iserializer.cpp
libs/serialization/src/basic_oarchive.cpp
libs/serialization/src/basic_oserializer.cpp
libs/serialization/src/basic_pointer_iserializer.cpp
libs/serialization/src/basic_pointer_oserializer.cpp
libs/serialization/src/basic_serializer_map.cpp
libs/serialization/src/basic_text_iprimitive.cpp
libs/serialization/src/basic_text_oprimitive.cpp
libs/serialization/src/basic_text_wiprimitive.cpp
libs/serialization/src/basic_text_woprimitive.cpp
libs/serialization/src/basic_xml_archive.cpp
libs/serialization/src/binary_iarchive.cpp
libs/serialization/src/binary_oarchive.cpp
libs/serialization/src/binary_wiarchive.cpp
libs/serialization/src/binary_woarchive.cpp
libs/serialization/src/codecvt_null.cpp
libs/serialization/src/extended_type_info.cpp
libs/serialization/src/extended_type_info_no_rtti.cpp
libs/serialization/src/extended_type_info_typeid.cpp
libs/serialization/src/polymorphic_binary_iarchive.cpp
libs/serialization/src/polymorphic_binary_oarchive.cpp
libs/serialization/src/polymorphic_iarchive.cpp
libs/serialization/src/polymorphic_oarchive.cpp
libs/serialization/src/polymorphic_text_iarchive.cpp
libs/serialization/src/polymorphic_text_oarchive.cpp
libs/serialization/src/polymorphic_text_wiarchive.cpp
libs/serialization/src/polymorphic_text_woarchive.cpp
libs/serialization/src/polymorphic_xml_iarchive.cpp
libs/serialization/src/polymorphic_xml_oarchive.cpp
libs/serialization/src/polymorphic_xml_wiarchive.cpp
libs/serialization/src/polymorphic_xml_woarchive.cpp
libs/serialization/src/stl_port.cpp
libs/serialization/src/text_iarchive.cpp
libs/serialization/src/text_oarchive.cpp
libs/serialization/src/text_wiarchive.cpp
libs/serialization/src/text_woarchive.cpp
libs/serialization/src/utf8_codecvt_facet.cpp
libs/serialization/src/void_cast.cpp
libs/serialization/src/xml_archive_exception.cpp
libs/serialization/src/xml_grammar.cpp
libs/serialization/src/xml_iarchive.cpp
libs/serialization/src/xml_oarchive.cpp
libs/serialization/src/xml_wgrammar.cpp
libs/serialization/src/xml_wiarchive.cpp
libs/serialization/src/xml_woarchive.cpp
libs/system/src/error_code.cpp
libs/test/src/compiler_log_formatter.cpp
libs/test/src/cpp_main.cpp
libs/test/src/debug.cpp
libs/test/src/decorator.cpp
libs/test/src/execution_monitor.cpp
libs/test/src/framework.cpp
libs/test/src/junit_log_formatter.cpp
libs/test/src/plain_report_formatter.cpp
libs/test/src/progress_monitor.cpp
libs/test/src/results_collector.cpp
libs/test/src/results_reporter.cpp
libs/test/src/test_framework_init_observer.cpp
libs/test/src/test_main.cpp
libs/test/src/test_tools.cpp
libs/test/src/test_tree.cpp
libs/test/src/unit_test_log.cpp
libs/test/src/unit_test_main.cpp
libs/test/src/unit_test_monitor.cpp
libs/test/src/unit_test_parameters.cpp
libs/test/src/xml_log_formatter.cpp
libs/test/src/xml_report_formatter.cpp
libs/timer/src/auto_timers_construction.cpp
libs/timer/src/cpu_timer.cpp

Therefore I conclude that bcp copy won't include only header files.

Is Boost dynamic_bitset really header-only and if so, how do I include only the relevant headers in my project?


Solution

  • From the docs:

    It should be noted that in practice bcp can produce a rather "fat" list of dependencies, reasons for this include:

    • It searches for library names first, so using "regex" as a name will give you everything in the libs/regex directory and everything that depends on. This can be a long list as all the regex test and example programs will get scanned for their dependencies. If you want a more minimal list, then try using the names of the headers you are actually including, or use the --scan option to scan your source code.

    • ...

    So, you are getting a fat list of dependencies because the search includes the tests and examples which are themselves not header-only, and have further non-header-only dependencies.

    Is Boost dynamic_bitset really header-only

    I see no reason to doubt that.

    if so, how do I include only the relevant headers in my project?

    As per the quoted suggestion, you might attempt instead: bcp --list boost/dynamic_bitset.hpp for a leaner list.