Remove extra files added after installation when uninstall with a Wix package generated by cpack

10 Views Asked by At

I made an installer with CPack and Wix for my software, but I got a problem. My software will download some extra font files to the install directory, after installation. Now I want to remove them when I uninstall this software, but it seems that Wix won't remove any files which are not included in the package.

Here is my CMakeLists:

cmake_minimum_required(VERSION 3.10)
project(figlet4win VERSION 2.2.5 LANGUAGES C CXX)

option(FIGLET_ENABLE_TLF_FONTS "Enable support for Sam Hocevar's TOIlet fonts" ON)

if(DEFINED DEFAULT_FONT_FILE)
    set(FIGLET_DEFAULT_FONT_FILE ${DEFAULT_FONT_FILE})
else()
    set(FIGLET_DEFAULT_FONT_FILE "standard")
endif()
if(DEFINED DEFAULT_FONT_DIR)
    set(FIGLET_DEFAULT_FONT_DIR ${DEFAULT_FONT_DIR})
else()
    set(FIGLET_DEFAULT_FONT_DIR "fonts")
endif()

file(
    WRITE ${CMAKE_SOURCE_DIR}/VERSION
    ${PROJECT_VERSION}
)

set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-unused-value")

set(FIGLET_SRC_LIST
    figlet.c
    zipio.c
    crc.c
    inflate.c
)

find_package(OpenSSL REQUIRED)
if(NOT OPENSSL_FOUND)
    message(FATAL "Cannot find OpenSSL, please check environment")
endif()
get_filename_component(OPENSSL_ROOT_DIR ${OPENSSL_INCLUDE_DIR} DIRECTORY)
set(OPENSSL_BIN_DIR "${OPENSSL_ROOT_DIR}/bin")
# get openssl bin dir to search dynamic libs
file(GLOB OPENSSL_CRYPTO_DLL "${OPENSSL_BIN_DIR}/libcrypto*.dll")
file(GLOB OPENSSL_SSL_DLL "${OPENSSL_BIN_DIR}/libssl*.dll")
# get target dlls with special name tags
find_package(Python3 REQUIRED)
if(NOT PYTHON3_FOUND)
    message(FATAL "Cannot find Python3, cannot do tests")
endif()

set(CURL_ZLIB OFF CACHE STRING "" FORCE)
set(CURL_USE_LIBPSL OFF CACHE STRING "" FORCE)
set(CURL_USE_LIBSSH2 OFF CACHE STRING "" FORCE)
set(CURL_USE_LIBSSH OFF CACHE STRING "" FORCE)
set(CURL_ENABLE_SSL ON CACHE INTERNAL "" FORCE)
set(CURL_USE_OPENSSL ON CACHE STRING "" FORCE)
set(CURL_ENABLE_EXPORT_TARGET OFF CACHE STRING "" FORCE)
set(CURL_DISABLE_INSTALL ON CACHE STRING "" FORCE)
# force disable curl install function
set(BUILD_CURL_EXE OFF CACHE INTERNAL "" FORCE)
set(BUILD_TESTING OFF)
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
    cmake_policy(SET CMP0010 NEW)
    cmake_policy(SET CMP0135 NEW)
endif()
include(FetchContent)
FetchContent_Declare(curl
    URL https://github.com/curl/curl/releases/download/curl-8_5_0/curl-8.5.0.tar.xz
    URL_HASH SHA256=42ab8db9e20d8290a3b633e7fbb3cec15db34df65fd1015ef8ac1e4723750eeb
    USES_TERMINAL_DOWNLOAD TRUE
)
FetchContent_MakeAvailable(curl)
# download and unpack curl 8.5.0 src package

if(${FIGLET_ENABLE_TLF_FONTS})
    add_definitions(-DTLF_FONTS)
    set(FIGLET_SRC_LIST
        ${FIGLET_SRC_LIST}
        utf8.c
    )
endif()
add_definitions(-DUNICODE)
add_definitions(-D_UNICODE)
add_definitions(-DDEFAULTFONTDIR="${FIGLET_DEFAULT_FONT_DIR}")
add_definitions(-DDEFAULTFONTFILE="${FIGLET_DEFAULT_FONT_FILE}")

include_directories(${CMAKE_SOURCE_DIR})
add_subdirectory(fonts)

add_executable(figlet
    ${FIGLET_SRC_LIST}
)
if(${FIGLET_ENABLE_TLF_FONTS})
    target_link_libraries(figlet
        ws2_32
    )
endif()
add_executable(chkfont
    chkfont.c
)
add_executable(figinstall
    figinstall.cpp
)
target_link_libraries(figinstall
    CURL::libcurl
    OpenSSL::Crypto
)
target_include_directories(figinstall
    PRIVATE
        ${CURL_INCLUDE_DIR}
        ${OPENSSL_INCLUDE_DIR}
)

enable_testing()
add_subdirectory(tests)

install(
    TARGETS figlet chkfont figinstall libcurl_shared
    RUNTIME DESTINATION .
)
# if using curl-8.5.0 src package directly, the name of the shared curl lib is libcurl_shared
install(
    FILES ${FIGLET_FONT_CONTROL_FILES} ${FIGLET_FONT_FILES}
    DESTINATION ${FIGLET_DEFAULT_FONT_DIR}
)
install(
    FILES ${CMAKE_SOURCE_DIR}/figlist.bat ${CMAKE_SOURCE_DIR}/showfigfonts.bat
    DESTINATION .
)
execute_process(
    COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/find_mingw_libgcc_s_seh.py
    TIMEOUT 5
    OUTPUT_VARIABLE MINGW_LIBGCC_S_SEH_PATH
    OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
    COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/find_mingw_libstdc++.py
    TIMEOUT 5
    OUTPUT_VARIABLE MINGW_LIBSTDCPP_PATH
    OUTPUT_STRIP_TRAILING_WHITESPACE
)
install(
    FILES ${MINGW_LIBGCC_S_SEH_PATH} ${MINGW_LIBSTDCPP_PATH} ${OPENSSL_CRYPTO_DLL} ${OPENSSL_SSL_DLL}
    DESTINATION .
)
if(EXISTS ${CMAKE_SOURCE_DIR}/doc/figlet4win.chm)
    install(
        FILES ${CMAKE_SOURCE_DIR}/figman.bat
        DESTINATION .
    )
    install(
        FILES ${CMAKE_SOURCE_DIR}/doc/figlet4win.chm
        DESTINATION doc
    )
endif()

set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_VENDOR "Ace-Radom")
set(CPACK_PACKAGE_INSTALL_DIRECTORY ${PROJECT_NAME})
set(CPACK_PACKAGE_DISCRIPTION_SUMMARY "FIGlet for Windows")
set(CPACK_WIX_UPGRADE_GUID "CC11CD4A-3AEC-4D65-81ED-65790266A448")
set(CPACK_WIX_PRODUCT_GUID "CC11CD4A-3AEC-4D65-81ED-65790266A448")
set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE.txt)
set(CPACK_WIX_PATCH_FILE ${CMAKE_SOURCE_DIR}/wix-patch.xml)
include(CPack)

and the Wix patch file:

<CPackWiXPatch>
    <CPackWiXFragment Id="#PRODUCT">
        <Upgrade Id="CC11CD4A-3AEC-4D65-81ED-65790266A448">
            <UpgradeVersion OnlyDetect="yes" Property="PREVIOUSFOUND"
                Minimum="1.0.0" IncludeMinimum="yes"
                Maximum="2.2.5" IncludeMaximum="no"/>
            <UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND"
                Minimum="2.2.6" IncludeMinimum="yes" />
            <UpgradeVersion OnlyDetect="yes" Property="SELFFOUND"
                Minimum="2.2.5" IncludeMinimum="yes"
                Maximum="2.2.5" IncludeMaximum="yes"/>
        </Upgrade>
        <CustomAction Id="Cleanup_FontDir" Directory="INSTALL_ROOT"
            ExeCommand="cmd /C &quot;rmdir fonts&quot;"
            Execute="deferred" Return="ignore" HideTarget="no" Impersonate="no"/>
        <InstallExecuteSequence>
            <Custom Action="Cleanup_FontDir" Before="RemoveFiles">
                REMOVE="ALL"
            </Custom>
        </InstallExecuteSequence>
    </CPackWiXFragment>
    <CPackWiXFragment Id="CM_CP_figlet.exe">
        <Environment Id="FIGLET4WIN_BIN_DIR" Action="set" Part="last"
            Name="PATH" Value="[INSTALL_ROOT]"
            System="yes"/>
    </CPackWiXFragment>
</CPackWiXPatch>

You can see I added a CustomAction and an InstallExecuteSequence in my patch, but they do not work. Do anyone know what should I do?

0

There are 0 best solutions below