lib/mix/tasks/cmake/config.ex

defmodule  Mix.Tasks.Cmake.Config do
  use Mix.Task

  alias Mix.Tasks.Cmake
  require Cmake

  @shortdoc "Generate build scripts based on the CMakeLists.txt"
  @moduledoc """
  Generate build scripts based on the 'CMakeLists.txt'.
  
  $ mix cmake.config [opt] [build_dir] [source_dir] [++ CMake options]
  
  ## Command line options
  
  * `--generator` - specify generator
  
  ## Configuration

  * `:build_dir`  - working directory
  * `:source_dir` - source directory
  * `:generator`  - specify generator
  """
  @switches [
    generator: :string,
    platform:  :string,
  ]
  
  @doc false
  def run(argv) do
    with {:ok, opts, dirs, cmake_args} <- Cmake.parse_argv(argv, strict: @switches),
      do: cmd(dirs, opts, cmake_args)
  end
  
  @doc false
  def cmd(), do: cmd([], [], [])
  @doc false
  def cmd(dirs, opts, cmake_args \\ []) do
    cmake_config = Cmake.get_config()

    [build_dir, source_dir] = Cmake.get_dirs(dirs, cmake_config)

    cmake_args = cmake_args
      |> Cmake.conj_front(opts[:generator], ["-G", "#{opts[:generator]}"])
      |> Cmake.conj_front(opts[:platform], ["-A", "#{opts[:platform]}"])
      |> Cmake.conj_front(cmake_config[:platform], ["-A", "#{cmake_config[:platform]}"])

    cmake_env = Cmake.default_env()
      |> Cmake.add_env("CMAKE_GENERATOR", cmake_config[:generator])

    # construct cmake args

    cmake_args = if build_dir == :global,
      do:   ["-UCMAKE_HOME_DIRECTORY", "-UCONFU_DEPENDENCIES_SOURCE_DIR" | cmake_args], # add options to remove some cache entries

      else: cmake_args

    # invoke cmake

    Cmake.cmake(build_dir, cmake_args ++ [Path.expand(source_dir)], cmake_env)
  end
end