Boost logo

Boost :

Subject: Re: [boost] [log] Boost.Log formal review closing down
From: vicente.botet (vicente.botet_at_[hidden])
Date: 2010-03-18 18:14:04


----- Original Message -----
From: "Andrey Semashev" <andrey.semashev_at_[hidden]>
To: <boost_at_[hidden]>
Sent: Thursday, March 18, 2010 8:24 PM
Subject: Re: [boost] [log] Boost.Log formal review closing down

>
> On 03/18/2010 10:12 PM, Zachary Turner wrote:
>>>>>> It is the Message Compiler. It is required for the Event Log backend on
>>>>>> Windows.
>>>>>
>>>>> Could this be used conditionaly?
>>>>
>>>> Not right now, I'm afraid. But I have plans of improving configurability
>>>> of the library.
>>>
>>> Great. Let me know when the library will be able to run on platforms not
>>> supporting wide chars, without dependencies to external tools (mc) and in
>>> single thread.
>
> You already can disable wide character support.

Can you tell me how? Do I need to download a new version?

I have placed the log file on the directory for /boost_1_41_0

I do

$ bjam --with-log threading=multi define=BOOST_LOG_USE_CHAR > mt.2.log
lib.jam: No such file or directory

The Jamfile on build contains
import lib
that seems to fail.

Next, here it is the log:
gcc.compile.c++ ../../../bin.v2/libs/log/test/util_string_literal.test/gcc-3.4.4/debug/threading-multi/run/util_string_literal.o
run\util_string_literal.cpp: In member function `void string_literal_ctors::test_method()':
run\util_string_literal.cpp:48: error: `wstring_literal' is not a member of `logging'

I have needed to add all the lines following //BUG WCHAR

***********************************************
//BUG WCHAR
#ifdef BOOST_LOG_USE_WCHAR_T
    // Copying
    {
        logging::wstring_literal lit1 = L"Hello";
        logging::wstring_literal lit2 = lit1;
        BOOST_CHECK(wcscmp(lit2.c_str(), L"Hello") == 0);
        BOOST_CHECK(wcscmp(lit1.c_str(), lit2.c_str()) == 0);
    }
//BUG WCHAR
#endif
    // Generator functions
    {
        logging::string_literal lit1 = logging::str_literal("Wow!");
        BOOST_CHECK(strcmp(lit1.c_str(), "Wow!") == 0);

//BUG WCHAR
#ifdef BOOST_LOG_USE_WCHAR_T
        logging::wstring_literal lit2 = logging::str_literal(L"Wow!");
        BOOST_CHECK(wcscmp(lit2.c_str(), L"Wow!") == 0);
//BUG WCHAR
#endif
***********************************************

More errors
gcc.compile.c++ ../../../bin.v2/libs/log/build/gcc-3.4.4/debug/threading-multi/code_conversion.o
In file included from C:\cygwin\boost_1_41_0\libs\log\src\code_conversion.cpp:20:
../../../boost/log/detail/code_conversion.hpp:107: error: variable or field `code_convert' declared void

I have needed to add all the lines following //BUG WCHAR

***********************************************
// BUG WCHAR
#ifdef BOOST_LOG_USE_WCHAR_T
//! The function converts one string to the character type of another
inline void code_convert(std::wstring const& str1, std::string& str2)
{
    converting_ostringstreambuf< wchar_t > buf(str2);
    buf.sputn(str1.data(), static_cast< std::streamsize >(str1.size()));
    buf.pubsync();
}
//! The function converts one string to the character type of another
inline void code_convert(std::wstring const& str1, std::wstring& str2)
{
    str2 = str1;
}
//! The function converts one string to the character type of another
inline void code_convert(std::string const& str1, std::wstring& str2)
{
    converting_ostringstreambuf< char > buf(str2);
    buf.sputn(str1.data(), static_cast< std::streamsize >(str1.size()));
    buf.pubsync();
}
// BUG WCHAR
#endif

//! The function converts the passed string to the narrow-character encoding
inline std::string const& to_narrow(std::string const& str)
{
    return str;
}

// BUG WCHAR
#ifdef BOOST_LOG_USE_WCHAR_T
//! The function converts the passed string to the narrow-character encoding
inline std::string to_narrow(std::wstring const& str)
{
    std::string res;
    aux::code_convert(str, res);
    return res;
}

//! The function converts the passed string to the wide-character encoding
inline std::wstring const& to_wide(std::wstring const& str)
{
    return str;
}

//! The function converts the passed string to the wide-character encoding
inline std::wstring to_wide(std::string const& str)
{
    std::wstring res;
    aux::code_convert(str, res);
    return res;
}
// BUG WCHAR
#endif
***********************************************
More
gcc.compile.c++ ../../../bin.v2/libs/log/build/gcc-3.4.4/debug/threading-multi/text_file_backend.o
C:\cygwin\boost_1_41_0\libs\log\src\text_file_backend.cpp:150: error: ISO C++ forbids declaration of `wstring' with no type
C:\cygwin\boost_1_41_0\libs\log\src\text_file_backend.cpp:150: error: invalid use of `::'

***********************************************
//BUG WCHAR
#ifdef BOOST_LOG_USE_WCHAR_T
    template< >
    struct file_char_traits< wchar_t >
    {
        typedef wchar_t char_type;

        static const char_type percent = L'%';
        static const char_type number_placeholder = L'N';
        static const char_type day_placeholder = L'd';
        static const char_type month_placeholder = L'm';
        static const char_type year_placeholder = L'y';
        static const char_type full_year_placeholder = L'Y';
        static const char_type frac_sec_placeholder = L'f';
        static const char_type seconds_placeholder = L'S';
        static const char_type minutes_placeholder = L'M';
        static const char_type hours_placeholder = L'H';
        static const char_type space = L' ';
        static const char_type plus = L'+';
        static const char_type minus = L'-';
        static const char_type zero = L'0';
        static const char_type dot = L'.';
        static const char_type newline = L'\n';

        static bool is_digit(wchar_t c) { return (iswdigit(c) != 0); }
        static std::wstring default_file_name_pattern() { return L"%5N.log"; }
    };
#ifndef BOOST_LOG_BROKEN_STATIC_CONSTANTS_LINKAGE
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::percent;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::number_placeholder;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::day_placeholder;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::month_placeholder;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::year_placeholder;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::full_year_placeholder;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::frac_sec_placeholder;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::seconds_placeholder;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::minutes_placeholder;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::hours_placeholder;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::space;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::plus;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::minus;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::zero;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::dot;
    const file_char_traits< wchar_t >::char_type file_char_traits< wchar_t >::newline;
#endif // BOOST_LOG_BROKEN_STATIC_CONSTANTS_LINKAGE
//BUG WCHAR
#endif
***********************************************

I have added in file prologue.hpp

//BUG WCHAR
#ifdef BOOST_NO_STD_WSTRING
//BUG WCHAR
# undef BOOST_LOG_USE_WCHAR_T
//BUG WCHAR
#endif

So the user don't needs to state that he wants only use CHAR when WCHAR is not available.

=========================

After modifying these files:

gcc.compile.c++ ../../../bin.v2/libs/log/build/gcc-3.4.4/debug/threading-multi/syslog_backend.o
In file included from ../../../boost/asio/detail/io_control.hpp:25,
                 from ../../../boost/asio/socket_base.hpp:25,
                 from C:\cygwin\boost_1_41_0\libs\log\src\syslog_backend.cpp:25:
../../../boost/asio/detail/socket_types.hpp:37:5: warning: #warning Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately.
../../../boost/asio/detail/socket_types.hpp:38:5: warning: #warning For example, add -D_WIN32_WINNT=0x0501 to the compiler command line.
../../../boost/asio/detail/socket_types.hpp:39:5: warning: #warning Assuming _WIN32_WINNT=0x0501 (i.e. Windows XP target).
../../../boost/asio/detail/socket_types.hpp:73:5: #error You must add -D__USE_W32_SOCKETS to your compiler options.
In file included from ../../../boost/asio/detail/socket_types.hpp:79,
                 from ../../../boost/asio/detail/io_control.hpp:25,
                 from ../../../boost/asio/socket_base.hpp:25,
                 from C:\cygwin\boost_1_41_0\libs\log\src\syslog_backend.cpp:25:
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/winsock2.h:103:2: warning: #warning "fd_set and associated macros have been defined in sys/types. This may cause runtime problems with W32 sockets"
In file included from ../../../boost/asio/detail/socket_types.hpp:79,
                 from ../../../boost/asio/detail/io_control.hpp:25,
                 from ../../../boost/asio/socket_base.hpp:25,
                 from C:\cygwin\boost_1_41_0\libs\log\src\syslog_backend.cpp:25:
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api/winsock2.h:635: error: declaration of C function `int gethostname(char*, int)' conflicts with
/usr/include/sys/unistd.h:206: error: previous declaration `int gethostname(char*, size_t)' here
In file included from ../../../boost/asio/detail/fd_set_adapter.hpp:25,
                 from ../../../boost/asio/detail/select_reactor.hpp:32,
                 from ../../../boost/asio/impl/io_service.ipp:27,
                 from ../../../boost/asio/io_service.hpp:641,
                 from C:\cygwin\boost_1_41_0\libs\log\src\syslog_backend.cpp:26:
../../../boost/asio/detail/win_fd_set_adapter.hpp: In member function `bool boost::asio::detail::win_fd_set_adapter::is_set(boost::asio::detail::socket_type) const':
../../../boost/asio/detail/win_fd_set_adapter.hpp:56: error: `__WSAFDIsSet' undeclared (first use this function)
../../../boost/asio/detail/win_fd_set_adapter.hpp:56: error: (Each undeclared identifier is reported only once for each function it appears in.)

I have comment
        #syslog_backend.cpp

=================
Next

gcc.compile.c++ ../../../bin.v2/libs/log/build/gcc-3.4.4/debug/threading-multi/trivial.o
../../../boost/log/formatters/wrappers.hpp: In instantiation of `boost::log_mt_posix::formatters::wrap_if<char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::mpl::not_<boost::log_mt_posix::formatters::is_formatter<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >':
../../../boost/log/formatters/wrappers.hpp:148: instantiated from `boost::log_mt_posix::formatters::wrap_if_not_formatter<char, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >'
C:\cygwin\boost_1_41_0\libs\log\src\trivial.cpp:134: instantiated from here
../../../boost/log/formatters/wrappers.hpp:141: error: base `boost::log_mt_posix::formatters::wrap_if_c<char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, true>' with only non-default constructor in class without a constructor
../../../boost/log/formatters/wrappers.hpp: In instantiation of `boost::log_mt_posix::formatters::wrap_if_not_formatter<char, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >':
C:\cygwin\boost_1_41_0\libs\log\src\trivial.cpp:134: instantiated from here
../../../boost/log/formatters/wrappers.hpp:148: error: base `boost::log_mt_posix::formatters::wrap_if<char, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::mpl::not_<boost::log_mt_posix::formatters::is_formatter<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >' with only non-default constructor in class without a constructor
C:\cygwin\boost_1_41_0\libs\log\src\trivial.cpp: In function `void boost::log_mt_posix::trivial::aux::init()':
C:\cygwin\boost_1_41_0\libs\log\src\trivial.cpp:134: error: no match for 'operator<<' in 'boost::log_mt_posix::formatters::stream_placeholder<CharT>::operator<<(const T&) const [with T = boost::log_mt_posix::formatters::fmt_attr<char, unsigned int, boost::log_mt_posix::formatters::throw_policy>, CharT = char](((const boost::log_mt_posix::formatters::fmt_attr<char, unsigned int, boost::log_mt_posix::formatters::throw_policy>&)((const boost::log_mt_posix::formatters::fmt_attr<char, unsigned int, boost::log_mt_posix::formatters::throw_policy>*)(&boost::log_mt_posix::formatters::attr(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) [with AttributeValueTypesT = unsigned int]())))) << " ["'

Here I have stopped for cygcin-gcc-3.4, as I don't thisk this is related toWCHAR.

As you can say your library was not able to work only with CHAR on cygcin-gcc-3.4.

Let me know if you want we continue to remove the other compile errors.

>> Unless I'm mistaken, you can already use it without dependency on external
>> tools if you're not using the event log backend. If you are using the event
>> log backend, the the mc compiler isn't a requirement of boost.log, it's a
>> requirement of windows itself so I don't see any obvious ways around it.
>
> Well, order to build without mc, the event log sink would have to be
> removed from the Jamfile.

Can you tell me how? I didn't see which define is needed to do that. Do I need to download a new version?

Best,
Vicente


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk