Hi,

the appended patch fixes an issue I have with recent cmake (3.2.3) with
cross compiling an mingw32 application. The applications requires bzip2
library which is handled by cmake provided FindBZip2.cmake. The problem
is that  BZIP2_NEED_PREFIX  is not set where it should be and results
into linker failure not finding bzip2 related symbols.

Some details:

FindBZip2.cmake uses BZ2_bzCompressInit to detect if BZIP2_NEED_PREFIX
should be set.

   CHECK_LIBRARY_EXISTS("${BZIP2_LIBRARIES}" BZ2_bzCompressInit ""
BZIP2_NEED_PREFIX)

The check is performed with CheckFunctionExists.c, which converts the
function name into a prototype of the form 'char BZ2_bzCompressInit()',
while in real it is

int BZ2_bzCompressInit ( bz_stream *strm, 
                         int blockSize100k, 
                         int verbosity,
                         int workFactor );


The compiler converts this function to the symbol '_BZ2_bzCompressInit',
which is not in the related import library. 
Taking a look into the related import library shows that there is

objdump -x /usr/i686-w64-mingw32/sys-root/mingw/lib/libbz2.dll.a  | grep
CompressInit
[  6](sec  1)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000
_BZ2_bzCompressInit@16
[  7](sec  3)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000
__imp__BZ2_bzCompressInit@16

The  '@16' indicates the size of the parameter list
(https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx) with does match
the used prototype 'char BZ2_bzCompressInit().'

The fix is to use a function which do not have parameters like
BZ2_decompress.

objdump -x /usr/i686-w64-mingw32/sys-root/mingw/lib/libbz2.dll.a  | grep
decompress
[  6](sec  1)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 _BZ2_decompress
[  7](sec  3)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000
__imp__BZ2_decompress

The appended patch fixes this issue.

Regards
 Ralf

--- /usr/share/cmake/Modules/FindBZip2.cmake.orig	2015-07-19 20:22:50.312758104 +0200
+++ /usr/share/cmake/Modules/FindBZip2.cmake	2015-07-19 20:23:30.849124798 +0200
@@ -60,7 +60,7 @@
    include(${CMAKE_CURRENT_LIST_DIR}/CMakePushCheckState.cmake)
    cmake_push_check_state()
    set(CMAKE_REQUIRED_QUIET ${BZip2_FIND_QUIETLY})
-   CHECK_LIBRARY_EXISTS("${BZIP2_LIBRARIES}" BZ2_bzCompressInit "" BZIP2_NEED_PREFIX)
+   CHECK_LIBRARY_EXISTS("${BZIP2_LIBRARIES}" BZ2_decompress "" BZIP2_NEED_PREFIX)
    cmake_pop_check_state()
 endif ()
 
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers

Reply via email to