From 6b3b8b2e9ddcfd61c88a4b61e0d4e10fcb996ce6 Mon Sep 17 00:00:00 2001 From: Micah Snyder Date: Wed, 11 Nov 2020 23:36:09 -0800 Subject: [PATCH] CMake: CPack generate Windows installer with WIX Also creates a ZIP for non-Admin (per-user) installs. WIX requires the license file to have a .txt or .rtf extension so I added the .txt extension. I've taken the opportunity to migrate the 3rd party licenses to a COPYING subdirectory and have added licensing details to the README.md file. To build the installer, install WIX and simply run `cpack -C Release` Also removed the explicit --config option from the clamav-clamonacc.service file because it should not be required and isn't being generated correctly when using autotools anyways, especially after changes in this commit. --- CMakeLists.txt | 15 ++++++++- CMakeOptions.cmake | 8 ++--- COPYING => COPYING.txt | 0 COPYING.LGPL => COPYING/COPYING.LGPL | 0 COPYING.YARA => COPYING/COPYING.YARA | 0 COPYING.bzip2 => COPYING/COPYING.bzip2 | 0 COPYING.curl => COPYING/COPYING.curl | 0 COPYING.file => COPYING/COPYING.file | 0 COPYING.getopt => COPYING/COPYING.getopt | 0 COPYING.llvm => COPYING/COPYING.llvm | 0 COPYING.lzma => COPYING/COPYING.lzma | 14 ++++---- COPYING.pcre => COPYING/COPYING.pcre | 0 COPYING.regex => COPYING/COPYING.regex | 0 COPYING.unrar => COPYING/COPYING.unrar | 0 COPYING.zlib => COPYING/COPYING.zlib | 0 INSTALL.cmake.md | 8 +++++ Makefile.am | 2 +- README.md | 40 +++++++++++++++++++++++ clamav-config.h.cmake.in | 4 +-- clambc/CMakeLists.txt | 2 +- clamconf/CMakeLists.txt | 2 +- clamd/CMakeLists.txt | 4 +-- clamdscan/CMakeLists.txt | 4 +-- clamdtop/CMakeLists.txt | 4 +-- clamonacc/CMakeLists.txt | 2 +- clamonacc/clamav-clamonacc.service.in | 2 +- clamscan/CMakeLists.txt | 4 +-- clamsubmit/CMakeLists.txt | 4 +-- freshclam/CMakeLists.txt | 4 +-- libclamav/CMakeLists.txt | 4 +-- libclammspack/CMakeLists.txt | 4 +-- libclamunrar/CMakeLists.txt | 4 +-- libclamunrar_iface/CMakeLists.txt | 4 +-- libfreshclam/CMakeLists.txt | 8 ++--- sigtool/CMakeLists.txt | 4 +-- win32/wix_ui_banner.bmp | Bin 0 -> 85962 bytes win32/wix_ui_dialog.bmp | Bin 0 -> 461882 bytes 37 files changed, 106 insertions(+), 45 deletions(-) rename COPYING => COPYING.txt (100%) rename COPYING.LGPL => COPYING/COPYING.LGPL (100%) rename COPYING.YARA => COPYING/COPYING.YARA (100%) rename COPYING.bzip2 => COPYING/COPYING.bzip2 (100%) rename COPYING.curl => COPYING/COPYING.curl (100%) rename COPYING.file => COPYING/COPYING.file (100%) rename COPYING.getopt => COPYING/COPYING.getopt (100%) rename COPYING.llvm => COPYING/COPYING.llvm (100%) rename COPYING.lzma => COPYING/COPYING.lzma (96%) rename COPYING.pcre => COPYING/COPYING.pcre (100%) rename COPYING.regex => COPYING/COPYING.regex (100%) rename COPYING.unrar => COPYING/COPYING.unrar (100%) rename COPYING.zlib => COPYING/COPYING.zlib (100%) create mode 100644 win32/wix_ui_banner.bmp create mode 100644 win32/wix_ui_dialog.bmp diff --git a/CMakeLists.txt b/CMakeLists.txt index 70df1e483..9b99d8f57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -187,6 +187,19 @@ endif() # Find Library Dependencies # if (WIN32) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION .) + include(InstallRequiredSystemLibraries) + + set(CPACK_GENERATOR "ZIP;WIX") + SET(CPACK_WIX_UPGRADE_GUID D9F136C1-3691-47E3-9079-4FE9C9C5EB32) + SET(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/COPYING.txt) + SET(CPACK_WIX_PRODUCT_ICON ${CMAKE_CURRENT_SOURCE_DIR}/win32/res/clam.ico) + SET(CPACK_WIX_UI_BANNER ${CMAKE_CURRENT_SOURCE_DIR}/win32/wix_ui_banner.bmp) + SET(CPACK_WIX_UI_DIALOG ${CMAKE_CURRENT_SOURCE_DIR}/win32/wix_ui_dialog.bmp) + SET(CPACK_WIX_CMAKE_PACKAGE_REGISTRY ClamAV) + set(CPACK_PACKAGE_INSTALL_DIRECTORY "ClamAV") + include(CPack) + find_package(PThreadW32) set(HAVE_PTHREAD_H 1) set(_REENTRANT 1) @@ -633,7 +646,7 @@ set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}") set(VERSION "${PACKAGE_VERSION}") # DBDIR for systemd service.in files -set(DBDIR "${DATABASE_DIRECTORY}") +set(DBDIR "${CMAKE_INSTALL_PREFIX}/${DATABASE_DIRECTORY}") if(ENABLE_DEBUG) set(CL_DEBUG 1) diff --git a/CMakeOptions.cmake b/CMakeOptions.cmake index c23d0218f..54bca51fe 100644 --- a/CMakeOptions.cmake +++ b/CMakeOptions.cmake @@ -2,17 +2,17 @@ if (WIN32) set(APP_CONFIG_DIRECTORY - "${CMAKE_INSTALL_PREFIX}" CACHE STRING + "." CACHE STRING "App Config directory.") set(DATABASE_DIRECTORY - "${CMAKE_INSTALL_PREFIX}/database" CACHE STRING + "database" CACHE STRING "Database directory.") else() set(APP_CONFIG_DIRECTORY - "${CMAKE_INSTALL_PREFIX}/etc" CACHE STRING + "etc" CACHE STRING "App Config directory.") set(DATABASE_DIRECTORY - "${CMAKE_INSTALL_PREFIX}/share/clamav" CACHE STRING + "share/clamav" CACHE STRING "Database directory.") endif() diff --git a/COPYING b/COPYING.txt similarity index 100% rename from COPYING rename to COPYING.txt diff --git a/COPYING.LGPL b/COPYING/COPYING.LGPL similarity index 100% rename from COPYING.LGPL rename to COPYING/COPYING.LGPL diff --git a/COPYING.YARA b/COPYING/COPYING.YARA similarity index 100% rename from COPYING.YARA rename to COPYING/COPYING.YARA diff --git a/COPYING.bzip2 b/COPYING/COPYING.bzip2 similarity index 100% rename from COPYING.bzip2 rename to COPYING/COPYING.bzip2 diff --git a/COPYING.curl b/COPYING/COPYING.curl similarity index 100% rename from COPYING.curl rename to COPYING/COPYING.curl diff --git a/COPYING.file b/COPYING/COPYING.file similarity index 100% rename from COPYING.file rename to COPYING/COPYING.file diff --git a/COPYING.getopt b/COPYING/COPYING.getopt similarity index 100% rename from COPYING.getopt rename to COPYING/COPYING.getopt diff --git a/COPYING.llvm b/COPYING/COPYING.llvm similarity index 100% rename from COPYING.llvm rename to COPYING/COPYING.llvm diff --git a/COPYING.lzma b/COPYING/COPYING.lzma similarity index 96% rename from COPYING.lzma rename to COPYING/COPYING.lzma index d97053743..fff698c87 100644 --- a/COPYING.lzma +++ b/COPYING/COPYING.lzma @@ -1,7 +1,7 @@ -The original lzma.txt license file, a small portion of which is reproduced below, -is available under libclamav/7z/lzma.txt. - -LICENSE -------- - -LZMA SDK is written and placed in the public domain by Igor Pavlov. +The original lzma.txt license file, a small portion of which is reproduced below, +is available under libclamav/7z/lzma.txt. + +LICENSE +------- + +LZMA SDK is written and placed in the public domain by Igor Pavlov. diff --git a/COPYING.pcre b/COPYING/COPYING.pcre similarity index 100% rename from COPYING.pcre rename to COPYING/COPYING.pcre diff --git a/COPYING.regex b/COPYING/COPYING.regex similarity index 100% rename from COPYING.regex rename to COPYING/COPYING.regex diff --git a/COPYING.unrar b/COPYING/COPYING.unrar similarity index 100% rename from COPYING.unrar rename to COPYING/COPYING.unrar diff --git a/COPYING.zlib b/COPYING/COPYING.zlib similarity index 100% rename from COPYING.zlib rename to COPYING/COPYING.zlib diff --git a/INSTALL.cmake.md b/INSTALL.cmake.md index b0a6b64d1..781cfde65 100644 --- a/INSTALL.cmake.md +++ b/INSTALL.cmake.md @@ -430,6 +430,14 @@ _Tip_: If you're having include-path issues, try building with detailed verbosit cmake --build . --config Release --target install -- /verbosity:detailed ``` +To build the installer, you must have WIX Toolset installed. If you're using +Chocolatey, you can install it simply with `choco install wixtoolset` and then +open a new terminal so that WIX will be in your PATH. + +```ps1 +cpack -C Release +``` + ### External Depedencies The CMake tooling is good about finding installed dependencies on POSIX systems. diff --git a/Makefile.am b/Makefile.am index 12e7fcc28..7ff5d3d3d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -26,7 +26,7 @@ bin_SCRIPTS=clamav-config else SUBDIRS = libltdl libclamav shared libfreshclam clamscan clamd clamdscan freshclam sigtool clamconf database docs etc clamav-milter test clamdtop clambc unit_tests -EXTRA_DIST = examples shared libclamav.pc.in COPYING.bzip2 COPYING.lzma COPYING.unrar COPYING.LGPL COPYING.llvm COPYING.file COPYING.zlib COPYING.getopt COPYING.regex COPYING.YARA COPYING.pcre platform.h.in libclamunrar libclamunrar_iface libclammspack clamdscan/clamdscan.map win32 ChangeLog.md INSTALL.cmake.md INSTALL.autotools.md NEWS.md README.md cmake CMakeLists.txt CMakeOptions.cmake $(top_srcdir)/**/CMakeLists.txt libclammspack/config.h.in.cmake clamav-config.h.cmake.in target.h.cmake.in autogen.sh +EXTRA_DIST = examples shared libclamav.pc.in COPYING.txt COPYING platform.h.in libclamunrar libclamunrar_iface libclammspack clamdscan/clamdscan.map win32 ChangeLog.md INSTALL.cmake.md INSTALL.autotools.md NEWS.md README.md cmake CMakeLists.txt CMakeOptions.cmake $(top_srcdir)/**/CMakeLists.txt libclammspack/config.h.in.cmake clamav-config.h.cmake.in target.h.cmake.in autogen.sh bin_SCRIPTS=clamav-config diff --git a/README.md b/README.md index b18aab61b..82cc6329a 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,46 @@ The ClamAV development team welcomes improvements to [our documentation](https://github.com/Cisco-Talos/clamav-faq), and also [bug reports](https://bugzilla.clamav.net/). Thanks for joining us! +## Licensing + +ClamAV is licensed for public/open source use under the GNU General Public +License, Version 2 (GPLv2). + +See `COPYING.txt` for a copy of the license. + +### 3rd Party Code + +ClamAV contains a number of components that include code copied in part or in +whole from 3rd party projects and whose code is not owned by Cisco and which +are licensed differently than ClamAV. These include: + +- tomsfastmath: public domain +- LLVM: Illinois Open Source License (BSD-like) +- Yara: Apache 2.0 license + - Yara has since switched to the BSD 3-Clause License; + Our source is out-of-date and needs to be updated. +- 7z / lzma: public domain +- libclamav's NSIS/NulSoft parser includes: + - zlib: permissive free software license + - bzip2 / libbzip2: BSD-like license +- OpenBSD's libc/regex: BSD license +- file: BSD license +- str.c: Contains BSD licensed modified-implementations of strtol(), stroul() + functions, Copyright (c) 1990 The Regents of the University of California. +- pngcheck (png.c): MIT/X11-style license +- getopt.c: MIT license +- Curl: license inspired by MIT/X, but not identical +- libmspack: LGPL license +- UnRAR (libclamunrar): a non-free/restricted open source license + - Note: The UnRAR license is incompatible with GPLv2 because it contains a + clause that prohibits reverse engineering a RAR compression algorithm from + the UnRAR decompression code. + For this reason, libclamunrar/libclamunrar_iface is not linked at all with + libclamav. It is instead loaded at run-time. If it fails to load, ClamAV + will continue running without RAR support. + +See the `COPYING` directory for a copy of the 3rd party project licenses. + ## Credits [The ClamAV Team](https://www.clamav.net/about.html#credits) diff --git a/clamav-config.h.cmake.in b/clamav-config.h.cmake.in index 93cef0a61..9d4fe42f9 100644 --- a/clamav-config.h.cmake.in +++ b/clamav-config.h.cmake.in @@ -74,10 +74,10 @@ #ifndef _WIN32 /* Path to virus database directory. */ -#define DATADIR "@DATABASE_DIRECTORY@" +#define DATADIR "@CMAKE_INSTALL_PREFIX@/@DATABASE_DIRECTORY@" /* where to look for the config file */ -#define CONFDIR "@APP_CONFIG_DIRECTORY@" +#define CONFDIR "@CMAKE_INSTALL_PREFIX@/@APP_CONFIG_DIRECTORY@" #endif /* Have sys/fanotify.h */ diff --git a/clambc/CMakeLists.txt b/clambc/CMakeLists.txt index e34fb7653..44d01d85d 100644 --- a/clambc/CMakeLists.txt +++ b/clambc/CMakeLists.txt @@ -28,7 +28,7 @@ target_link_libraries( clambc ClamAV::libclamav ClamAV::shared ) if(WIN32) - install(TARGETS clambc DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS clambc DESTINATION .) else() install(TARGETS clambc DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() diff --git a/clamconf/CMakeLists.txt b/clamconf/CMakeLists.txt index 8bd53cac7..7803040af 100644 --- a/clamconf/CMakeLists.txt +++ b/clamconf/CMakeLists.txt @@ -28,7 +28,7 @@ target_link_libraries( clamconf ClamAV::libclamav ClamAV::shared ) if(WIN32) - install(TARGETS clamconf DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS clamconf DESTINATION .) else() install(TARGETS clamconf DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() diff --git a/clamd/CMakeLists.txt b/clamd/CMakeLists.txt index 34ce27f0a..a1c2c3491 100644 --- a/clamd/CMakeLists.txt +++ b/clamd/CMakeLists.txt @@ -43,9 +43,9 @@ target_link_libraries( clamd ClamAV::libclamav ClamAV::shared ) if(WIN32) - install(TARGETS clamd DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS clamd DESTINATION .) else() - install(TARGETS clamd DESTINATION ${CMAKE_INSTALL_SBINDIR}) + install(TARGETS clamd DESTINATION sbin) endif() if(SYSTEMD_FOUND) diff --git a/clamdscan/CMakeLists.txt b/clamdscan/CMakeLists.txt index 562e080ee..fb382fb2a 100644 --- a/clamdscan/CMakeLists.txt +++ b/clamdscan/CMakeLists.txt @@ -32,7 +32,7 @@ target_link_libraries( clamdscan ClamAV::libclamav ClamAV::shared ) if(WIN32) - install(TARGETS clamdscan DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS clamdscan DESTINATION .) else() - install(TARGETS clamdscan DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(TARGETS clamdscan DESTINATION bin) endif() diff --git a/clamdtop/CMakeLists.txt b/clamdtop/CMakeLists.txt index 7f5219041..0eec636d9 100644 --- a/clamdtop/CMakeLists.txt +++ b/clamdtop/CMakeLists.txt @@ -29,7 +29,7 @@ target_link_libraries( clamdtop ClamAV::shared Curses::curses ) if(WIN32) - install(TARGETS clamdtop DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS clamdtop DESTINATION .) # Also install shared library (DLL) dependencies install(CODE [[ file(GET_RUNTIME_DEPENDENCIES @@ -54,5 +54,5 @@ if(WIN32) #message("UNRESOLVED_DEPENDENCIES_VAR: ${_u_deps}") ]]) else() - install(TARGETS clamdtop DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(TARGETS clamdtop DESTINATION bin) endif() diff --git a/clamonacc/CMakeLists.txt b/clamonacc/CMakeLists.txt index 13caf8d7a..2086e4992 100644 --- a/clamonacc/CMakeLists.txt +++ b/clamonacc/CMakeLists.txt @@ -49,7 +49,7 @@ target_link_libraries( clamonacc ClamAV::libclamav ClamAV::shared CURL::libcurl ) -install(TARGETS clamonacc DESTINATION ${CMAKE_INSTALL_SBINDIR}) +install(TARGETS clamonacc DESTINATION sbin) if(SYSTEMD_FOUND) configure_file( diff --git a/clamonacc/clamav-clamonacc.service.in b/clamonacc/clamav-clamonacc.service.in index c031db3eb..3712ca58c 100644 --- a/clamonacc/clamav-clamonacc.service.in +++ b/clamonacc/clamav-clamonacc.service.in @@ -11,7 +11,7 @@ After=clamav-daemon.service syslog.target network.target Type=simple User=root ExecStartPre=/bin/bash -c "while [ ! -S /run/clamav/clamd.ctl ]; do sleep 1; done" -ExecStart=@prefix@/sbin/clamonacc -F --config-file=@APP_CONFIG_DIRECTORY@/clamd.conf --log=/var/log/clamav/clamonacc.log --move=/root/quarantine +ExecStart=@prefix@/sbin/clamonacc -F --log=/var/log/clamav/clamonacc.log --move=/root/quarantine [Install] WantedBy=multi-user.target diff --git a/clamscan/CMakeLists.txt b/clamscan/CMakeLists.txt index 0b5bc2ab7..86a5d5977 100644 --- a/clamscan/CMakeLists.txt +++ b/clamscan/CMakeLists.txt @@ -31,7 +31,7 @@ target_link_libraries( clamscan ClamAV::libclamav ClamAV::shared ) if(WIN32) - install(TARGETS clamscan DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS clamscan DESTINATION .) else() - install(TARGETS clamscan DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(TARGETS clamscan DESTINATION bin) endif() diff --git a/clamsubmit/CMakeLists.txt b/clamsubmit/CMakeLists.txt index d751c631e..e0a4cf445 100644 --- a/clamsubmit/CMakeLists.txt +++ b/clamsubmit/CMakeLists.txt @@ -36,7 +36,7 @@ if(APPLE) ${APPLE_SECURITY} ) endif() if(WIN32) - install(TARGETS clamsubmit DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS clamsubmit DESTINATION .) # Also install shared library (DLL) dependencies install(CODE [[ file(GET_RUNTIME_DEPENDENCIES @@ -62,5 +62,5 @@ if(WIN32) #message("UNRESOLVED_DEPENDENCIES_VAR: ${_u_deps}") ]]) else() - install(TARGETS clamsubmit DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(TARGETS clamsubmit DESTINATION bin) endif() diff --git a/freshclam/CMakeLists.txt b/freshclam/CMakeLists.txt index b2fd5d2ac..d32b08a73 100644 --- a/freshclam/CMakeLists.txt +++ b/freshclam/CMakeLists.txt @@ -30,9 +30,9 @@ target_link_libraries(freshclam-bin ClamAV::libclamav ClamAV::shared ) if(WIN32) - install(TARGETS freshclam-bin DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS freshclam-bin DESTINATION .) else() - install(TARGETS freshclam-bin DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(TARGETS freshclam-bin DESTINATION bin) endif() # Install an empty database directory diff --git a/libclamav/CMakeLists.txt b/libclamav/CMakeLists.txt index be2ebd626..fd7778cb6 100644 --- a/libclamav/CMakeLists.txt +++ b/libclamav/CMakeLists.txt @@ -566,7 +566,7 @@ if(ENABLE_SHARED_LIB) target_link_libraries( clamav PUBLIC ICONV::Iconv ) endif() if(WIN32) - install( TARGETS clamav DESTINATION ${CMAKE_INSTALL_PREFIX} ) + install( TARGETS clamav DESTINATION . ) # Also install shared library (DLL) dependencies install( CODE [[ @@ -641,7 +641,7 @@ if(ENABLE_STATIC_LIB) VERSION ${LIBCLAMAV_VERSION} SOVERSION ${LIBCLAMAV_SOVERSION} ) target_compile_definitions( clamav_static PUBLIC clamav_staticLIB ) if(WIN32) - install( TARGETS clamav_static DESTINATION ${CMAKE_INSTALL_PREFIX} ) + install( TARGETS clamav_static DESTINATION . ) else() install( TARGETS clamav_static DESTINATION ${CMAKE_INSTALL_LIBDIR} ) endif() diff --git a/libclammspack/CMakeLists.txt b/libclammspack/CMakeLists.txt index d48a0004c..cca033527 100644 --- a/libclammspack/CMakeLists.txt +++ b/libclammspack/CMakeLists.txt @@ -74,9 +74,9 @@ if(ENABLE_SHARED_LIB) PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/mspack/mspack.h ) if(WIN32) - install(TARGETS mspack DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS mspack DESTINATION .) else() - install(TARGETS mspack DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS mspack DESTINATION lib) endif() # Public (forwarded) dependencies. diff --git a/libclamunrar/CMakeLists.txt b/libclamunrar/CMakeLists.txt index c7df99dd9..5d28e3352 100644 --- a/libclamunrar/CMakeLists.txt +++ b/libclamunrar/CMakeLists.txt @@ -90,9 +90,9 @@ if(ENABLE_SHARED_LIB) unrar_obj ) if(WIN32) - install(TARGETS clamunrar DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS clamunrar DESTINATION .) else() - install(TARGETS clamunrar DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS clamunrar DESTINATION lib) endif() add_library( ClamAV::libunrar ALIAS clamunrar ) diff --git a/libclamunrar_iface/CMakeLists.txt b/libclamunrar_iface/CMakeLists.txt index 8b01dbd4d..302e7d5e7 100644 --- a/libclamunrar_iface/CMakeLists.txt +++ b/libclamunrar_iface/CMakeLists.txt @@ -64,9 +64,9 @@ if(ENABLE_UNRAR) ClamAV::libunrar_iface_iface) if(WIN32) - install(TARGETS clamunrar_iface DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS clamunrar_iface DESTINATION .) else() - install(TARGETS clamunrar_iface DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS clamunrar_iface DESTINATION lib) endif() add_library( ClamAV::libunrar_iface ALIAS clamunrar_iface ) diff --git a/libfreshclam/CMakeLists.txt b/libfreshclam/CMakeLists.txt index 13129dd68..3a7e55f68 100644 --- a/libfreshclam/CMakeLists.txt +++ b/libfreshclam/CMakeLists.txt @@ -67,7 +67,7 @@ if(ENABLE_SHARED_LIB) COMPILE_FLAGS "${WARNCFLAGS}" VERSION ${LIBFRESHCLAM_VERSION} SOVERSION ${LIBFRESHCLAM_SOVERSION}) if(WIN32) - install(TARGETS freshclam DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS freshclam DESTINATION .) # Also install shared library (DLL) dependencies install(CODE [[ file(GET_RUNTIME_DEPENDENCIES @@ -94,7 +94,7 @@ if(ENABLE_SHARED_LIB) #message("UNRESOLVED_DEPENDENCIES_VAR: ${_u_deps}") ]]) else() - install(TARGETS freshclam DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS freshclam DESTINATION lib) endif() add_library( ClamAV::libfreshclam ALIAS freshclam ) @@ -115,9 +115,9 @@ if(ENABLE_STATIC_LIB) VERSION ${LIBFRESHCLAM_VERSION} SOVERSION ${LIBFRESHCLAM_SOVERSION}) target_compile_definitions(freshclam_static PUBLIC freshclam_staticLIB) if(WIN32) - install(TARGETS freshclam_static DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS freshclam_static DESTINATION .) else() - install(TARGETS freshclam_static DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS freshclam_static DESTINATION lib) endif() add_library( ClamAV::libfreshclam_static ALIAS freshclam_static ) diff --git a/sigtool/CMakeLists.txt b/sigtool/CMakeLists.txt index 42c21c5d3..50d773c67 100644 --- a/sigtool/CMakeLists.txt +++ b/sigtool/CMakeLists.txt @@ -30,7 +30,7 @@ target_link_libraries( sigtool ClamAV::libclamav ClamAV::shared ) if(WIN32) - install(TARGETS sigtool DESTINATION ${CMAKE_INSTALL_PREFIX}) + install(TARGETS sigtool DESTINATION .) else() - install(TARGETS sigtool DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(TARGETS sigtool DESTINATION bin) endif() diff --git a/win32/wix_ui_banner.bmp b/win32/wix_ui_banner.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8dd113b77ec467c9873160850c8daec664b1bca8 GIT binary patch literal 85962 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 literal 0 HcmV?d00001