This documentation explains how to compile Capstone with CMake, focus on
using Microsoft Visual C as the compiler.

To compile Capstone on *nix, see COMPILE.TXT.

To compile Capstone on Windows using Visual Studio, see COMPILE_MSVC.TXT.

                        *-*-*-*-*-*

This documentation requires CMake & Windows SDK or MS Visual Studio installed on
your machine.

Get CMake for free from http://www.cmake.org.



(0) Tailor Capstone to your need.

  Out of architectures supported by Capstone, if you just need several selected archs,
  run "cmake" with the unwanted archs disabled (set to 0) as followings.

  - CAPSTONE_ARM_SUPPORT: support ARM. Run cmake with -DCAPSTONE_ARM_SUPPORT=0 to remove ARM.
  - CAPSTONE_AARCH64_SUPPORT: support AARCH64. Run cmake with -DCAPSTONE_AARCH64_SUPPORT=0 to remove AARCH64.
  - CAPSTONE_ALPHA_SUPPORT: support Alpha. Run cmake with -DCAPSTONE_ALPHA_SUPPORT=0 to remove Alpha.
  - CAPSTONE_HPPA_SUPPORT: support HPPA. Run cmake with -DCAPSTONE_HPPA_SUPPORT=0 to remove HPPA.
  - CAPSTONE_M680X_SUPPORT: support M680X. Run cmake with -DCAPSTONE_M680X_SUPPORT=0 to remove M680X.
  - CAPSTONE_M68K_SUPPORT: support M68K. Run cmake with -DCAPSTONE_M68K_SUPPORT=0 to remove M68K.
  - CAPSTONE_MIPS_SUPPORT: support Mips. Run cmake with -DCAPSTONE_MIPS_SUPPORT=0 to remove Mips.
  - CAPSTONE_MOS65XX_SUPPORT: support MOS65XX. Run cmake with -DCAPSTONE_MOS65XX_SUPPORT=0 to remove MOS65XX.
  - CAPSTONE_PPC_SUPPORT: support PPC. Run cmake with -DCAPSTONE_PPC_SUPPORT=0 to remove PPC.
  - CAPSTONE_SPARC_SUPPORT: support Sparc. Run cmake with -DCAPSTONE_SPARC_SUPPORT=0 to remove Sparc.
  - CAPSTONE_SYSZ_SUPPORT: support SystemZ. Run cmake with -DCAPSTONE_SYSZ_SUPPORT=0 to remove SystemZ.
  - CAPSTONE_XCORE_SUPPORT: support XCore. Run cmake with -DCAPSTONE_XCORE_SUPPORT=0 to remove XCore.
  - CAPSTONE_TRICORE_SUPPORT: support TriCore. Run cmake with -DCAPSTONE_TRICORE_SUPPORT=0 to remove TriCore.
  - CAPSTONE_X86_SUPPORT: support X86. Run cmake with -DCAPSTONE_X86_SUPPORT=0 to remove X86.
  - CAPSTONE_TMS320C64X_SUPPORT: support TMS320C64X. Run cmake with -DCAPSTONE_TMS320C64X_SUPPORT=0 to remove TMS320C64X.
  - CAPSTONE_M680X_SUPPORT: support M680X. Run cmake with -DCAPSTONE_M680X_SUPPORT=0 to remove M680X.
  - CAPSTONE_EVM_SUPPORT: support EVM. Run cmake with -DCAPSTONE_EVM_SUPPORT=0 to remove EVM.
  - CAPSTONE_WASM_SUPPORT: support Web Assembly. Run cmake with -DCAPSTONE_WASM_SUPPORT=0 to remove WASM.
  - CAPSTONE_BPF_SUPPORT: support BPF. Run cmake with -DCAPSTONE_BPF_SUPPORT=0 to remove BPF.
  - CAPSTONE_RISCV_SUPPORT: support RISCV. Run cmake with -DCAPSTONE_RISCV_SUPPORT=0 to remove RISCV.
  - CAPSTONE_ARCHITECTURE_DEFAULT: Whether architectures are enabled by default.
      Set this of OFF with -DCAPSTONE_ARCHITECTURE_DEFAULT=OFF to disable all architectures by default.
      You can then enable them again with one of the CAPSTONE_<ARCH>_SUPPORT options.

  By default, all architectures are compiled in. If you're building a static library that you intend to link into
  multiple consumers, and they have differing architecture requirements, you may want -DCAPSTONE_USE_ARCH_REGISTRATION=1
  and call cs_arch_register_*() for the architectures you need in each particular consumer. In this way you only pay
  footprint size for the architectures you're actually using in each consumer, without having to compile Capstone
  multiple times.

  Besides, Capstone also allows some more customization via following macros.

  - CAPSTONE_USE_SYS_DYN_MEM: change this to OFF to use your own dynamic memory management.
  - CAPSTONE_BUILD_DIET: change this to ON to make the binaries more compact.
  - CAPSTONE_X86_REDUCE: change this to ON to make X86 binary smaller.
  - CAPSTONE_X86_ATT_DISABLE: change this to ON to disable AT&T syntax on x86.
  - CAPSTONE_DEBUG: change this to ON to enable extra debug assertions.

  By default, Capstone use system dynamic memory management, and both DIET and X86_REDUCE
  modes are disabled. To use your own memory allocations, turn ON both DIET &
  X86_REDUCE, run "cmake" with: -DCAPSTONE_USE_SYS_DYN_MEM=0 -DCAPSTONE_BUILD_DIET=1 -DCAPSTONE_X86_REDUCE=1


  For each option, refer to docs/README for more details.



(1) CMake allows you to generate different generators to build Capstone. Below is
    some examples on how to build Capstone on Windows with CMake.

  (*) You can let CMake select a generator for you. Do:
  
      mkdir build
      cd build
      cmake ..
      
    This last command is also where you can pass additional CMake configuration flags
    using `-D<key>=<value>`.
    For a debug build add `-DCMAKE_BUILD_TYPE=Debug`.
    To export `compile_commands.json` add `-DCMAKE_EXPORT_COMPILE_COMMANDS=ON`.
    
    Then to build use:
    
      cmake --build . --config [Release/Debug]
      

  (*) To build Capstone using Nmake of Windows SDK, do:

      mkdir build
      cd build
      ..\nmake.bat

  After this, find the samples test*.exe, capstone.lib & capstone.dll
  in the same directory.



  (*) To build Capstone using Visual Studio, choose the generator accordingly to the
  version of Visual Studio on your machine. For example, with Visual Studio 2013, do:

      mkdir build
      cd build
      cmake -G "Visual Studio 12" ..

  After this, find capstone.sln in the same directory. Open it with Visual Studio
  and build the solution including libraries & all test as usual.



(2) You can make sure the prior steps successfully worked by launching one of the
  testing binary (test*.exe).

(3) You can also enable just one specific architecture by passing the architecture name
  to either the cmake.sh or nmake.bat scripts. e.g.:
  
    ../cmake.sh x86

  Will just target the x86 architecture. The list of available architectures is: ARM,
  AARCH64, M68K, MIPS, PowerPC, Sparc, SystemZ, XCore, x86, TMS320C64x, M680x, EVM, MOS65XX,
  WASM, BPF, RISCV, Alpha, HPPA.
  
(4) You can also create an installation image with cmake, by using the 'install' target.
  Use:

    cmake --build . --config Release --target install

  This will normally install an image in a default location (`C:\Program Files` on Windows),
  so it's good to explicitly set this location when configuring CMake. Use: `-DCMAKE_INSTALL_PREFIX=image`
  for instance, to put the installation in the 'image' subdirectory of the build directory.
