# =============================================================================
# Build a Windows setup.exe distribution.
# =============================================================================

# ~~~
#  The prerequisite for 'make setup_exe' is 'make install'.
#  -DCMAKE_INSTALL_PREFIX=/C/marshalnrn/nrn is recommended.
#  ... because nrnmingwenv.sh checks for the optional existence of
#  ${CMAKE_INSTALL_PREFIX}/../nrnhtml
#
#  A setup.exe is generally built using the configuration
#  /mingw64/bin/cmake .. -G "Unix Makefiles" \
#    -DCMAKE_INSTALL_PREFIX=/C/marshalnrn/nrn \
#    -DIV_DIR=/home/hines/neuron/ivcmake/build/install \
#    -DPYTHON_EXECUTABLE=/e/python37/python \
#    -DNRN_ENABLE_PYTHON_DYNAMIC=ON \
#    -DNRN_PYTHON_DYNAMIC="e:/python37/python;e:/python38/python;e:/python39/python" \
#    -DNRN_ENABLE_MPI_DYNAMIC=ON \
#    -DCMAKE_PREFIX_PATH="/c/ms-mpi" \
#    -DNRN_ENABLE_CORENEURON=Off
#  make -j install
#  make setup_exe
# ~~~

if(MINGW)
  set(mswinsrc ${CMAKE_CURRENT_SOURCE_DIR})
  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/nrnicon.rc "id ICON \"${mswinsrc}/nrniv10.ico\"\n")
  add_custom_command(
    OUTPUT nrnicon.res
    COMMAND windres nrnicon.rc -O coff -o nrnicon.res
    DEPENDS ${mswinsrc}/nrniv10.ico)
  set_source_files_properties(${mswinsrc}/extra/neuron.cpp ${mswinsrc}/extra/mos2nrn.cpp
                              ${mswinsrc}/extra/nrnbinstr.cpp PROPERTIES COMPILE_DEFINITIONS MINGW)
  add_executable(neuron ${mswinsrc}/extra/neuron.cpp nrnicon.res)
  add_executable(mos2nrn ${mswinsrc}/extra/mos2nrn.cpp)
  add_executable(nrnbinstr ${mswinsrc}/extra/nrnbinstr.cpp)

  # ~~~
  # Presumes previous 'make install'
  # Invoke after 'make install' by 'make setup_exe'.
  # ~~~
  set(MAKENSIS_EXE "c:/Program Files (x86)/NSIS/makensis")

  # ~~~
  # Target used for building installer
  # nrnmingwenv.sh:
  #    - copy enough mingw tool chain for mknrndll to work
  # pre_setup_exe.sh:
  #    - Copy mpi. Reduce size by removing inadvertently installed files,
  #      some huge test data files, and strip binary executables and libraries.
  #    - Create the nrnmech.dll for neurondemo.
  # nrnsetupmingw.nsi:
  #    - make the setup.exe
  # ~~~
  add_custom_target(
    setup_exe
    COMMAND bash ${PROJECT_SOURCE_DIR}/mingw_files/nrnmingwenv.sh ${CMAKE_INSTALL_PREFIX}
    COMMAND bash ${PROJECT_BINARY_DIR}/src/mswin/pre_setup_exe.sh
    COMMAND ${MAKENSIS_EXE} ${PROJECT_BINARY_DIR}/src/mswin/nrnsetupmingw.nsi
    DEPENDS ${PROJECT_SOURCE_DIR}/mingw_files/nrnmingwenv.sh
            ${PROJECT_BINARY_DIR}/src/mswin/pre_setup_exe.sh
            ${PROJECT_BINARY_DIR}/src/mswin/nrnsetupmingw.nsi
    COMMENT "Copy mknrndll tool chain to ${CMAKE_INSTALL_PREFIX} and build setup.exe ")

  # install mswin specfic. See cmake/NeuronFileLists.cmake for MSWIN... lists.
  install(FILES ${MSWIN_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX})
  install(FILES ${MSWIN_BIN_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
  install(FILES ${MSWIN_LIB_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
  install(TARGETS neuron mos2nrn nrnbinstr DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
endif()
