Wireshark-dev: Re: [Wireshark-dev] CMake for Windows

From: Graham Bloice <graham.bloice@xxxxxxxxxxxxx>
Date: Wed, 26 Jun 2013 10:35:26 +0100

On 26 June 2013 10:10, Roland Knall <rknall@xxxxxxxxx> wrote:
Hi

As I am somewhat converse in cmake, I can give you a few pointers, if you like.

In general for each package a cmake system should look for, a
Find<PackageName>.cmake file should exist in either one of two places:

- The local directory (in wireshark underneath <src>/cmake/modules/Find....
- Or the global cmake directory <cmake_install_dir>/Modules/Find...

Those packages usually comply to a definition, where you can provide a
searchpath by setting a directory before including the package.

So if you have a CMakeLists.txt with the following context:


........
INCLUDE(Findzlib)
IF(ZLIB_FOUND)

   ...

ENDIF(ZLIB_FOUND)
....


then you can set a search path by using:

...
IF(WIN32)
    SET(ZLIB_INCLUDE_DIRS "c:\\wireshark-win32-libs\\zlib125\\include")
    SET(ZLIB_LIBRARY_DIRS "c:\\wireshark-win32-libs\\zlib125\\bin"
"c:\\wireshark-win32-libs\\zlib125\\lib" )
ENDIF(WIN32)
INCLUDE(Findzlib)
....

But setting static routes should be avoided, so better set a relative
path (aka ${PROJECT_BINARY_DIR}/../..) or
using a system variable.

If you have to call a script, you should do this by using either
EXECUTE_PROCESS or better create a CUSTOM_TARGET which you can depend
on, so that the right libraries will allways be downloaded, if they
cannot be found.

Finally, if you include user-editable scripts, they should start with
CMake...... and end in .txt. Something like config.CMake should be
avoided, as it is nmake specific.

kind regards,
Roland


I've been attempting that sort of thing but success eludes me.

Take cares for instance.  The path to the include dir is $(PROJECT_LIB_DIR)/c-ares-1.9.1.1-win32ws/include.

I don't want to hard-code the library version suffix so I'd like to get CMake to search within $(PROJECT_LIB_DIR) for a directory that begins "c-ares-".

My current attempt is (with hard-coded paths and debugging messages):

IF (WIN32)
  MESSAGE("Searching wireshark libs for c-ares")
  FILE(GLOB subdir "W:/Wireshark/wireshark-win32-libs/*")
  FOREACH(dir $(subdir))
    MESSAGE("Found: $(dir)")
    IF(IS_DIRECTORY $(dir))
      MESSAGE("Found: $(dir)")
      IF("$(dir)" MATCHES "^c-ares-.*")
        SET(CARES_HINTS $(dir))
      ENDIF()    
    ENDIF()
  ENDFOREACH()
ENDIF(WIN32)

This fails to find any subdirectories at all.  I've also tried GLOB_RECURSE with no change.

Graham