[ 
https://issues.apache.org/jira/browse/ZOOKEEPER-2841?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16090704#comment-16090704
 ] 

ASF GitHub Bot commented on ZOOKEEPER-2841:
-------------------------------------------

GitHub user andschwa opened a pull request:

    https://github.com/apache/zookeeper/pull/311

    ZOOKEEPER-2841: ZooKeeper public include files leak porting change

    This patch primarily adds a cross-platform CMake build system. This is in
    addition to the Autotools system on Linux, until it can be deprecated, and 
this
    replaces the existing committed Visual Studio Solutions for Windows.
    
    As this commit deprecates (and breaks) the previously existing Visual Studio
    solutions and projects, they've been removed. Building on Windows now 
requires
    CMake, but this enables the support of any code-supported Visual Studio 
version.
    Support for Visual Studio 2017 was explicitly added by this patch, and 
support
    for future versions, barring software bugs, should be available 
automatically
    through CMake.
    
    The notable features lacking in comparison to Autotools are Solaris support,
    shared library builds, whitelisted symbol exports, libtool integration, and
    doxygen document generation. Almost everything else from Autotools has been
    ported, including header/function/library checks, and all targets 
(zookeeper,
    hashtable, cli, load_gen, and tests).
    
    The primary work involved for CMake (other than the writing of 
`CMakeLists.txt`)
    was transitioning the hand-written `winconfig.h` to an auto-generated 
`config.h`
    file, and guarding code with `#ifdef HAVE_FEATURE`. The `cmake_config.h.in`
    template was modeled after the Autotools config file so that the feature 
guards
    share the same names.
    
    This patch also refactors the Windows port of the C client. Notably, it 
moves as
    much porting code as possible out of the publicly included `winconfig.h` 
header
    and into the relevant source files, or the private `winport.h` header.
    
    While `load_gen.c` looks at first glance as if it were ported to Windows, it
    never actually was, so the erroneous `#include "win32port.h"` was removed, 
and
    the target is not built on Windows.
    
    The `include/winstdint.h` header was removed as it has been replaced by
    `<stdint.h>`. This might break very old versions of Visual Studio; but in 
those
    cases, previous versions of the client are available.
    
    A bug for upstream libraries including the ZooKeeper headers was fixed by
    removing `#undef AF_INET6` entirely, and removing `#include <windows.h>`, 
as it
    "pulls in the world" and should not be included publicly.
    
    A guard was placed around `#define snprintf` in order to enable compiling 
with
    modern versions of MSVC, including Visual Studio 2015.
    
    A problem with `DLL_EXPORT` and `USE_STATIC_LIB` being redefined was fixed.
    
    There are existent warnings which this patch did not attempt to fix.
    
    Building tests on Windows is not supported, but was not previously 
supported.
    The tests need to be ported.
    
    Future work should resolve the `ACL` / `ZKACL` conflict, and potentially 
remove
    `include/winconfig.h` altogether.

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/andschwa/zookeeper cmake-backport-3.5

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/zookeeper/pull/311.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #311
    
----
commit 081833e9899afd4937075038f78bb4faff446ef4
Author: Andrew Schwartzmeyer <[email protected]>
Date:   2017-04-10T23:12:40Z

    ZOOKEEPER-2756: Add CMake build system for better cross-platform support
    
    This notably lacks Solaris and libtool support.
    
    Almost everything else from Autotools has been ported,
    including header/function/library checks, and all targets
    (zookeeper, hashtable, cli, load_gen, and tests).
    
    Both Linux and Windows are supported.
    
    The primary work involved (other than the writing of `CMakeLists.txt`)
    was transitioning the hand-written `winconfig.h` to an
    auto-generated `config.h` file, and guarding code with `#ifdef
    HAVE_FEATURE`. The `cmake_config.h.in` template was modeled after
    the Autotools config file so that the feature guards share the same
    names.
    
    While `load_gen.c` looks at first glance as if it were ported to Windows,
    it never actually was, so the erroneous `#include "win32port.h"` was
    removed, and the target is not built on Windows.
    
    There are existent warnings which this patch did not attempt to fix.
    
    A guard was placed around `#define snprintf` in order to enable
    compiling with modern versions of MSVC.
    
    Fixed DLL_EXPORT and USE_STATIC_LIB redefinition.
    
    As this commit deprecates (and breaks) the previously existing Visual
    Studio solutions and projects, they've been removed.
    
    Building tests on Windows is still not supported.

commit 49f9558dea6504e5f082edd0d4d5191503c54235
Author: Andrew Schwartzmeyer <[email protected]>
Date:   2017-07-07T22:35:37Z

    ZOOKEEPER-2841: ZooKeeper public include files leak porting changes
    
    This patch refactors the Windows port of the C client. Notably, it moves
    as much porting code as possible out of the publicly included
    `winconfig.h` header and into the relevant source files. This also
    removes `winstdint.h` as it has been replaced by `<stdint.h>`. It fixes
    problems for upstream libraries by removing `#undef AF_INET6` and
    `#include <windows.h>`.
    
    Future work should resolve the `ACL` / `ZKACL` conflict, and potentially
    remove `include/winconfig.h` altogether.

----


> ZooKeeper public include files leak porting changes
> ---------------------------------------------------
>
>                 Key: ZOOKEEPER-2841
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2841
>             Project: ZooKeeper
>          Issue Type: Bug
>          Components: c client
>         Environment: Windows 10 with Visual Studio 2017
>            Reporter: Andrew Schwartzmeyer
>            Assignee: Andrew Schwartzmeyer
>              Labels: windows
>
> The fundamental problem is that the port of the C client to Windows is now 
> close to six years old, with very few updates. This port leaks a lot of 
> changes that should be internal to ZooKeeper, and many of those changes are 
> simply no longer relevant. The correct thing to do is attempt to refactor the 
> Windows port for new versions of ZooKeeper, removing dead/unneeded porting 
> code, and moving dangerous porting code to C files instead of public headers.
> Two primary examples of this problem are 
> [ZOOKEEPER-2491|https://issues.apache.org/jira/browse/ZOOKEEPER-2491] and 
> [MESOS-7541|https://issues.apache.org/jira/browse/MESOS-7541].
> The first issue stems from this ancient porting code:
> {noformat}
> #define snprintf _snprintf
> {noformat}
>  in 
> [winconfig.h|https://github.com/apache/zookeeper/blob/ddf0364903bf7ac7cd25b2e1927f0d9d3c7203c4/src/c/include/winconfig.h#L179].
>  Newer versions of Windows C libraries define {{snprintf}} as a function, and 
> so it cannot be redefined.
> The second issue comes from this undocumented change:
> {noformat}
> #undef AF_INET6
> {noformat}
> again in 
> [winconfig.h|https://github.com/apache/zookeeper/blob/ddf0364903bf7ac7cd25b2e1927f0d9d3c7203c4/src/c/include/winconfig.h#L169]
>  which breaks any library that uses IPv6 and {{winsock2.h}}.
> Furthermore, the inclusion of the following defines and headers causes 
> terrible problems for consuming libraries, as they leak into ZooKeeper's 
> public headers:
> {noformat}
> #define _CRT_SECURE_NO_WARNINGS
> #define WIN32_LEAN_AND_MEAN
> #include <Windows.h>
> #include <Winsock2.h>
> #include <winstdint.h>
> #include <process.h>
> #include <ws2tcpip.h>
> {noformat}
> Depending on the order that a project includes or compiles files, this may or 
> may not cause {{WIN32_LEAN_AND_MEAN}} to become unexpectedly defined, and 
> {{windows.h}} to be unexpectedly included. This problem is exacberated by the 
> fact that the {{winsock2.h}} and {{windows.h}} headers are order-dependent 
> (if you read up on this, you'll see that defining {{WIN32_LEAN_AND_MEAN}} was 
> meant to work-around this).
> Going forward, porting changes should live next to where they are used, 
> preferably in source files, not header files, so they remain contained.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to