we should not hardwire the include path to the fmt submodule,
there is chance that we are using libfmt installed in system.
in my case, crimson fails to link because the the ABI of libfmt
is not compatible with that of libfmt included as a submodule
: && ccache /usr/bin/g++-9 .... \
-o bin/crimson-osd -Wl,-rpath,::::::::::::::::::: lib/libcrimson-common.a lib/libcrimson-os.a lib/libcrimson.a \
.... \
/usr/lib/x86_64-linux-gnu/libfmt.a \
...
/usr/bin/ld: src/crimson/osd/CMakeFiles/crimson-osd.dir/main.cc.o: in function `void fmt::v5::basic_writer<fmt::v5::back_insert_range<fmt::v5::internal::basic_buffer<char> >
>::write_double<double>(double, fmt::v5::basic_format_specs<char
> const&)':
/var/ssd/ceph/build/../src/fmt/include/fmt/format.h:2822: undefined reference to `bool fmt::v5::internal::grisu2_format<double, 0>(double, fmt::v5::internal::basic_buffer<char>&, int, bool, int&)'
/usr/bin/ld: src/crimson/osd/CMakeFiles/crimson-osd.dir/main.cc.o: in function `void fmt::v5::basic_writer<fmt::v5::back_insert_range<fmt::v5::internal::basic_buffer<char> > >::write_double<long
double>(long double, fmt::v5::basic_format_
specs<char> const&)':
/var/ssd/ceph/build/../src/fmt/include/fmt/format.h:2822: undefined reference to `bool fmt::v5::internal::grisu2_format<double, 0>(double, fmt::v5::internal::basic_buffer<char>&, int, bool, int&)'
/usr/bin/ld: src/crimson/osd/CMakeFiles/crimson-osd.dir/osd.cc.o: in function `void fmt::v5::basic_writer<fmt::v5::output_range<std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >, char>
>::write_double<double>(double, fmt::
v5::basic_format_specs<char> const&)':
/var/ssd/ceph/build/../src/fmt/include/fmt/format.h:2822: undefined reference to `bool fmt::v5::internal::grisu2_format<double, 0>(double, fmt::v5::internal::basic_buffer<char>&, int, bool, int&)'
/usr/bin/ld: src/crimson/osd/CMakeFiles/crimson-osd.dir/osd.cc.o: in function `void fmt::v5::basic_writer<fmt::v5::output_range<std::back_insert_iterator<fmt::v5::internal::basic_buffer<char> >, char>
>::write_double<long double>(long dou
ble, fmt::v5::basic_format_specs<char> const&)':
/var/ssd/ceph/build/../src/fmt/include/fmt/format.h:2822: undefined reference to `bool fmt::v5::internal::grisu2_format<double, 0>(double, fmt::v5::internal::basic_buffer<char>&, int, bool, int&)'
collect2: error: ld returned 1 exit status
Signed-off-by: Kefu Chai <kchai@redhat.com>
include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/src/rapidjson/include")
find_package(fmt 5.2.1 QUIET)
-if(NOT fmt_FOUND)
+if(fmt_FOUND)
+ include_directories(SYSTEM "${fmt_INCLUDE_DIR}")
+else()
message(STATUS "Could not find fmt, will build it")
add_subdirectory(fmt)
+ include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/src/fmt/include")
endif()
-include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/src/fmt/include")
if(WITH_SEASTAR)
find_package(c-ares 1.13.0 QUIET)