--- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -448,7 +448,7 @@ endif() # libclamav feature dependencies if(NOT WIN32) - find_package(Iconv REQUIRED) + find_package(Iconv) # Set variable required by libclamav to use iconv set(HAVE_ICONV 1) endif() --- a/libclamav/CMakeLists.txt +++ b/libclamav/CMakeLists.txt @@ -536,10 +536,39 @@ if(ENABLE_SHARED_LIB) ClamAV::win32_compat wsock32 ws2_32 ) else() + if(Iconv_FOUND) + if(NOT Iconv_IS_BUILT_IN) + target_link_libraries(clamav PRIVATE Iconv::Iconv) + set(CMAKE_REQUIRED_LIBRARIES "Iconv::Iconv") + endif() + else() + # Sometime the build environment is not setup + # in a way CMake can find Iconv on its own by default. + # But if we simply link against iconv (-liconv), the build may succeed + # due to other compiler/link flags. + set(CMAKE_REQUIRED_LIBRARIES "iconv") + check_c_source_compiles(" + #include + #include + int main() { + char *a, *b; + size_t i, j; + iconv_t ic; + ic = iconv_open(\"to\", \"from\"); + iconv(ic, &a, &i, &b, &j); + iconv_close(ic); + } + " + Iconv_EXPLICITLY_AT_ENV) + if(Iconv_EXPLICITLY_AT_ENV) + target_link_libraries(clamav PRIVATE iconv) + else() + message(FATAL_ERROR "Iconv is not found, make sure to provide it in the build environment") + endif() + endif() target_link_libraries( clamav PUBLIC Threads::Threads - Iconv::Iconv ${CMAKE_DL_LIBS} m ) endif() @@ -556,8 +585,6 @@ if(ENABLE_SHARED_LIB) if(WIN32) set_target_properties( clamav PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON ) - else() - target_link_libraries( clamav PUBLIC Iconv::Iconv ) endif() if(WIN32) install( TARGETS clamav DESTINATION . COMPONENT libraries )