Annotation of embedaddon/libnet/README.win32, revision 1.1

1.1     ! misho       1: Information, Recommendations and Build Instructions for Windows
        !             2: **************************************************************************
        !             3: 
        !             4: _____________________________ IMPORTANT _____________________________
        !             5: The execution of the currently shipped msvcbuild.bat batch script will
        !             6: causes ANY subsequent none-MSVC build to fail. It has been wrongly set
        !             7: up to copy several MSVC-specific header files from <libnet-root>/win32/
        !             8: to <libnet-root>/include/ and <libnet-root>/include/libnet/ during the
        !             9: build process. This is a high priority issue and will be taken care of
        !            10: ASAP. If you ever have to make use of this file, consider compiling all
        !            11: other builds from a separate tarball.
        !            12: _____________________________________________________________________
        !            13: 
        !            14: This file list additional steps and suggestions for Windows users.
        !            15: Please see INSTALL for a more general overview and doc/PORTED for
        !            16: other platforms.
        !            17: 
        !            18: Unless you know what you are doing, you should follow the recommendations
        !            19: below. Notice that there are plenty of other (sometimes better) ways
        !            20: to build libnet, but these steps and suggestions are known to work.
        !            21: If the build breaks, please re-read this guide carefully.
        !            22: 
        !            23: Contents
        !            24: ========
        !            25: 
        !            26: 1. Introduction
        !            27:     1.1 Microsoft Visual C++ and GCC/MinGW
        !            28:     1.2 WinPcap/Npcap
        !            29:     1.3 Supported Operating Systems
        !            30: 
        !            31: 2. MinGW Compiler
        !            32:     2.1 Native
        !            33:     2.2 Cross-Compiling
        !            34: 
        !            35: 3. Microsoft Visual C++
        !            36: 
        !            37: 
        !            38: 
        !            39: 1. Introduction
        !            40: ===============
        !            41: 
        !            42: 
        !            43: 1.1 Microsoft Visual C++ and GCC/MinGW
        !            44: --------------------------------------------------------------
        !            45: 
        !            46: The Microsoft Visual C++ compiler (aka MSVC) and the GCC Windows port
        !            47: (aka MinGW) are unfortunately not fully compatible. Although MSVC is a
        !            48: great compiler, libnet has been developed with the GNU toolchain in mind.
        !            49: So building libnet with the Visual C++ Build Tools will always have its
        !            50: flaws, even while it might work in some points.
        !            51: 
        !            52: Most of libnet’s development is therefore done with GCC and its MinGW
        !            53: Windows port.
        !            54: In other words, if this this all new to you, I recommended you to use
        !            55: MinGW for building libnet on Windows.
        !            56: 
        !            57: 
        !            58: On the other hand, the two can work well together:
        !            59: 
        !            60: If you for instance build libnet with MinGW, and you want to use it
        !            61: with MSVC too (or vice versa), you can use the DLL and the supplied
        !            62: "libnet*.def" file located in <libnet-root>/win32/ (this file is always
        !            63: rebuild at the end of every successful build on windows) to create an
        !            64: MSVC compatible import library that you can use to link your projects
        !            65: with without the need of rebuilding libnet again.
        !            66: 
        !            67: To produce a MinGW compatible import library from any libnet DLL:
        !            68: 
        !            69: $ dlltool -D path/to/libnet*.dll -d path/to/libnet*.def -l libnet.dll.a
        !            70: 
        !            71: To produce a MSVC compatible import library from any libnet DLL:
        !            72: 
        !            73: $ lib /machine:X64 /def:example.def (for x64)
        !            74: or
        !            75: $ lib /machine:X86 /def:example.def (for x86)
        !            76: 
        !            77: Note 1: If you have removed any or all symbol information from the DLL
        !            78: (aka "stripped" it), during build, by for example running configure
        !            79: with "--enable-fast", then this obviously won't work.
        !            80: 
        !            81: 
        !            82: 1.2 WinPcap/Npcap
        !            83: -----------------
        !            84: 
        !            85: Currently, the supported method of sending packets under Windows is with
        !            86: WinPcap (http://www.winpcap.org). However, libnet's support for
        !            87: Npcap (http://www.npcap.org), an update of WinPcap sponsored by the
        !            88: Nmap Project, is being seriously considered.
        !            89: Windows users should know that with the switch to Npcap, WinPcap compatibility
        !            90: is expected to be deprecated.
        !            91: 
        !            92: Please be sure to install the WinPcap/Npcap driver/DLL and make sure
        !            93: that the content of the Wpdpack's/Npcap SDK's Include and Lib directories
        !            94: are somewhat reachable by your compiler.
        !            95: 
        !            96: Note 2: Remember that you cannot use MSVC-generated .lib files to create
        !            97: shared libraries with MinGW, you have to use the lib*.a files.
        !            98: WinPcap development came to a standstill before the Developer's Pack ever
        !            99: provided x64 compatible lib*.a files for use with MinGW/Cygwin. And since
        !           100: libnet depends on WinPcap, you would have to compile 64-bit lib*.a libraries
        !           101: yourself if you want to be able to produce 64-bit compatible libnet builds
        !           102: with MinGW/Cygwin.
        !           103: 
        !           104: Luckily for you, this has been taken care of by me. 64-bit compatible
        !           105: WinPcap libraries as well as DIY instructions can be found in
        !           106: <libnet-root>/win32/wpdpack/.
        !           107: 
        !           108: 1.3 Supported Operating Systems
        !           109: -------------------------------
        !           110: 
        !           111: At the latest with the switch to Npcap, libnet support for Windows XP,
        !           112: Windows Server 2003 and earlier will be dropped.
        !           113: I can think of too many better things to do than to continuously deal with
        !           114: error handling and backwards compatibility (msvcrt vs crtdll) for EOL systems.
        !           115: 
        !           116: Remnants in the source suggests that building libnet with Cygwin must have
        !           117: been possible at some point. This may or may not be the case these days.
        !           118: If it still works, let me know. If you get it to work (again), let me know.
        !           119: And if you need to get it to work, let me know.
        !           120: 
        !           121: 
        !           122: 2. MinGW Compiler
        !           123: =================
        !           124: 
        !           125: Both native and cross compilation are possible, and there are quite a
        !           126: few possibilities and options to choose from. If you just want to get
        !           127: over with it, follow these steps:
        !           128: 
        !           129: Known traps are:
        !           130: - Setting the wrong (or no) prefix. (important when running 'make install')
        !           131: - Using incompatible WinPcap libraries for x64 (see Note 2)
        !           132: - Not having said WinPcap libraries and header files in your compiler's path
        !           133: 
        !           134: Note 3: If you're building with MinGW, and want to install libnet to your
        !           135: compiler's lib and include directories, you almost always want to set your
        !           136: prefix manually. If you don't know what that means, run "gcc -v", look for
        !           137: "--prefix=/some/path" and use that.
        !           138: 
        !           139: Note 4: If you're using a multilib MinGW-w64 GCC compiler, make sure to add
        !           140: the -m32 or -m64 CFLAGS to instruct the compiler to build for your desired
        !           141: architecture.
        !           142: 
        !           143: 
        !           144: 2.1 Native
        !           145: ----------
        !           146: 
        !           147: The recommended MinGW distribution for building libnet is Msys2.
        !           148: First, follow the installation instructions for Msys2 available at
        !           149: msys2.github.io. Then, depending on your desired target architecture,
        !           150: open a mingw32 or mingw64 shell, navigate to the source directory,
        !           151: and execute the following commands:
        !           152: 
        !           153: 1. If you want to produce 32 bit binaries:
        !           154: 
        !           155: $ CFLAGS="-O2 -Wall -I$(pwd)/win32/wpdpack/Include" LDFLAGS="-L$(pwd)/win32/wpdpack/Lib/" ./configure --prefix=/mingw64
        !           156: 
        !           157: If you want to produce 64 bit binaries:
        !           158: 
        !           159: $ CFLAGS="-O2 -Wall -I$(pwd)/win32/wpdpack/Include" LDFLAGS="-L$(pwd)/win32/wpdpack/Lib/x64" ./configure --prefix=/mingw64
        !           160: 
        !           161: 2. $ make
        !           162: 
        !           163: 3. $ make install (optional)
        !           164: 
        !           165: 
        !           166: 2.2 Cross-Compiling
        !           167: -------------------
        !           168: 
        !           169: Note 5: During sample building, you may see a warning similar this:
        !           170: 
        !           171:             Could not determine the host path corresponding to
        !           172:                         `... a path ...'
        !           173:             Continuing, but uninstalled executables may not work.
        !           174: 
        !           175: This, among other things, means that the samples will depend on
        !           176: a shared version of libgcc (aka libgcc_s_sjlj-1.dll). If no shared
        !           177: version of libgcc was built when the compiler was configured, you
        !           178: most likely won't be able to execute them.
        !           179: In that case, your best bet is to link with the static version
        !           180: of libgcc by disabling shared libraries altogether
        !           181: (./configure --disable-shared).
        !           182: 
        !           183: 
        !           184: In general, you should know what you're doing and what your host, target
        !           185: and compiler are all about beforehand.
        !           186: These steps have been successfully tested on Ubuntu and the default
        !           187: mingw32-w32 toolchain (GCC 4.8).
        !           188: The recommended steps to build libnet therefore are:
        !           189: 
        !           190: 1. If you're targeting x86:
        !           191: $ CFLAGS="-O2 -Wall -I$(pwd)/win32/wpdpack/Include" LDFLAGS="-L$(pwd)/win32/wpdpack/Lib" ./configure --host=i686-w64-mingw32 --prefix=/usr/i686-w64-mingw32
        !           192: 
        !           193: If you're targeting x64:
        !           194: $ CFLAGS="-O2 -Wall -I$(pwd)/win32/wpdpack/Include" LDFLAGS="-L$(pwd)/win32/wpdpack/Lib/x64" ./configure --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32
        !           195: 
        !           196: 2. make
        !           197: 
        !           198: 3. (optionally) sudo make install
        !           199: 
        !           200: Notice that the --host option is usually all you need for cross-compiling.
        !           201: 
        !           202: Note 6: Although the steps should be very similar, if you're using any
        !           203: other distribution of MinGW (cross or native), you're pretty much on
        !           204: your own.  Suggestions, bug reports/fixes, and pull requests, see:
        !           205: https://github.com/libnet/libnet/issues
        !           206: 
        !           207: 
        !           208: 3. Microsoft Visual C++
        !           209: =======================
        !           210: Known traps are:
        !           211: - Not using the correct (x86 or x64) version of the Visual Studio command prompt
        !           212: - Using incompatible WinPcap libraries for x64 (see Note 2)
        !           213: - Not having said WinPcap libraries and header files in your compiler's path
        !           214: 
        !           215: Until the issue described at the top of this document is completely
        !           216: resolved, MSVC support should be considered a work in progress and unsafe.
        !           217: And that’s why I won't even go into it, and instead leave you with these
        !           218: old but still perfectly fine instructions:
        !           219: 
        !           220: 
        !           221: 
        !           222: Run msvcbuild.bat to build for Win32 with MSVC
        !           223: ----------------------------------------------
        !           224: 
        !           225: The batch file takes arguments and sets the appropriate path and environment
        !           226: variables for the desired built by running either vsvars32.bat (for x86),
        !           227: vcvars64.bat (for x64) or vcvarsall.bat (for Cross development).
        !           228: Type "msvcbuild.bat help" for a description of all available options.
        !           229: If no argument is specified, x86 is assumed.
        !           230: 
        !           231: The batch file copies pre-prepared headers out of win32/, avoiding the
        !           232: requirement for a gnu (Cygwin or MinGW) build environment.
        !           233: 
        !           234: The batch file hard-codes the location of the WinPcap developer's tools.
        !           235: You may have to modify it for your environment, or install the developer's
        !           236: pack in the expected location.
        !           237: 
        !           238: Although not required, it is advisable to execute the batch file from a
        !           239: VS2015 Developer Command Prompt.
        !           240: 
        !           241: For Visual Studio 2015, the shell can be found at:
        !           242: 
        !           243:     Program Files (x86) >> Microsoft Visual Studio 14.0 >> Common7 >> Tools >> VsDevCmd.bat
        !           244: 
        !           245: After building, libnet libraries and .obj files are found in newly created
        !           246: "<libnet-root>\libnet\src\[Win32|Win64]\" "<libnet-root>\libnet\lib\[x86|x64]\"
        !           247: respectively.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>