Cpack + NSIS - Not using custom NSIS configuration template

119 views Asked by At

I'm CPack to build a package for a Software and I'd like to use a custom template (a NSIS.template.in to replace CPack's default). Still Cpack is not using my template. I'm Using Clion bundled cmake (version 3.25.2). Here is my CMakeList.txt. It's not pretty yet, but it'll come.

cmake_minimum_required(VERSION 3.25)
project(prigo_parcours VERSION 0.1.1)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)


find_package(Qt6 REQUIRED COMPONENTS
        Core
        Gui
        Widgets
        )


add_subdirectory(OpenXLSX)
include_directories(src/)

add_executable(prigo_parcours resources/resources.qrc main.cpp forms/cursusgen.cpp forms/cursusgen.h forms/cursusgen.ui forms/yearform.cpp forms/yearform.h forms/yearform.ui src/parcours.h src/excelio.cpp src/excelio.h forms/appsettings.cpp forms/appsettings.h forms/appsettings.ui)

if(CMAKE_BUILD_TYPE STREQUAL "Release")
    set_property(TARGET prigo_parcours PROPERTY WIN32_EXECUTABLE true)
    message("BUILDING AS RELEASE")
endif()

target_link_libraries(prigo_parcours
        PRIVATE
        Qt::Core
        Qt::Gui
        Qt::Widgets
        OpenXLSX::OpenXLSX
        )

if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
    set(DEBUG_SUFFIX)
    if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
        set(DEBUG_SUFFIX "d")
    endif ()
    set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
    if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
        set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
            set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        endif ()
    endif ()
    if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E make_directory
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
    endif ()
    foreach (QT_LIB Core Gui Widgets)
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/bin/Qt6${QT_LIB}${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
    endforeach (QT_LIB)
endif ()


file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/data/formulas-update.vbs DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/data/)
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/data/template.xlsx DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/data/)

install(TARGETS prigo_parcours
        BUNDLE  DESTINATION .
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        )

qt_generate_deploy_app_script(
        TARGET prigo_parcours
        OUTPUT_SCRIPT deploy_script
        NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})

install(FILES data/formulas-update.vbs data/template.xlsx data/prigo.ini DESTINATION bin/data/)

include(CPack)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_MODULE_PATH}")


message(NOTICE "${CMAKE_MODULE_PATH}")

set(CPACK_PACKAGE_NAME "prigo-parcours")
set(APP_ICON ${CMAKE_CURRENT_SOURCE_DIR}/resources/HELB_ICON.ico)
set(APP_ICON_UNI ${CMAKE_CURRENT_SOURCE_DIR}/resources/HELB_ICON_UNI.ico)


configure_file ("${PROJECT_SOURCE_DIR}/package-options.cmake.in"
        "${PROJECT_BINARY_DIR}/package-options.cmake"
        @ONLY)
set(CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/package-options.cmake")


if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    message(NOTICE "BUILDING AS DEBUG")
endif()

add_custom_target(prigo_parcours_package COMMAND ${CMAKE_CPACK_COMMAND} -C $<CONFIGURATION> --config ${CMAKE_CURRENT_BINARY_DIR}/package-options.cmake DEPENDS prigo_parcours)
message(NOTICE ${PROJECT_VERSION})

also the configuration input file for CPack

include(CPackConfig.cmake)


set(CPACK_PACKAGE_NAME @CPACK_PACKAGE_NAME@)
set(CPACK_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR})
set(CPACK_PACKAGE_VERSION_MAJOR @CMAKE_PROJECT_VERSION_MAJOR@)
set(CPACK_PACKAGE_VERSION_MINOR @CMAKE_PROJECT_VERSION_MINOR@)
set(CPACK_PACKAGE_VERSION_PATCH @CMAKE_PROJECT_VERSION_PATCH@)
set(CPACK_PACKAGE_VERSION @CMAKE_PROJECT_VERSION@)
#set(CPACK_PACKAGE_ICON @APP_ICON@)
set(CPACK_NSIS_MUI_ICON @APP_ICON@)
set(CPACK_NSIS_MUI_UNIICON @APP_ICON_UNI@)
set(CPACK_NSIS_INSTALL_ROOT "'$LocalAppData'")

set(CPACK_NSIS_CREATE_ICONS_EXTRA
    "CreateShortCut '$LocalAppData\\\\$STARTMENU_FOLDER\\\\Prigo Parcours.lnk' '$INSTDIR\\\\bin\\\\prigo_parcours.exe'"
)
set(CPACK_NSIS_DELETE_ICONS_EXTRA
    "Delete '$LocalAppData\\\\$START_MENU\\\\Prigo Parcours.lnk'"
)

set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-Win-${CPACK_PACKAGE_ARCHITECTURE}-@CMAKE_BUILD_TYPE@)

Any ideas?

I've tried adding the path to that custom template inside the CMAKE_MODULE_PATH variable as seen on forums.

1

There are 1 answers

0
Mathieu Monfort On

As stated in the question's comments, I had put my NSIS Template in CMAKE_MODULE_PATH after the call to CPack. Since CPack checks CMAKE_MODULE_PATH when it's included, it checked for a template in a variable I hadn't touched yet. Makes sense.