[CMake] autoheader-like functionality?
Michael Jackson
mike.jackson at bluequartz.net
Thu Jul 29 18:40:13 EDT 2010
Well luckily there are a whole slew of projects to take a look at.
HDF5 is one. CMake, VTK, ITK, ParaView are some others. Basically you
have a .cmake file that runs all the tests like looking for headers,
structs, functions and stuff like that. Each result is put into a
cmake variable. Then after all of that is completed you
"configure_file(...)" using your .h.in file as input.
# test.cmake example
# --------------------------------------------------------------------
# Now check for needed Header files
# --------------------------------------------------------------------
INCLUDE (${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake)
macro (CORE_CHECK_INCLUDE_FILE header var prefix)
CHECK_INCLUDE_FILE("${header}" ${prefix}_${var} )
endmacro()
CORE_CHECK_INCLUDE_FILE("stddef.h" HAVE_STDDEF_H MXA)
CORE_CHECK_INCLUDE_FILE("stdint.h" HAVE_STDINT_H MXA)
CORE_CHECK_INCLUDE_FILE("stdlib.h" HAVE_STDLIB_H MXA)
CORE_CHECK_INCLUDE_FILE("setjmp.h" HAVE_SETJMP_H MXA)
CORE_CHECK_INCLUDE_FILE("string.h" HAVE_STRING_H MXA)
CORE_CHECK_INCLUDE_FILE("stdio.h" HAVE_STDIO_H MXA)
CORE_CHECK_INCLUDE_FILE("math.h" HAVE_MATH_H MXA)
CORE_CHECK_INCLUDE_FILE("time.h" HAVE_TIME_H MXA)
CORE_CHECK_INCLUDE_FILE("sys/time.h" HAVE_SYS_TIME_H MXA)
CORE_CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H MXA)
CORE_CHECK_INCLUDE_FILE("sys/socket.h" HAVE_SYS_SOCKET_H MXA)
CORE_CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H MXA)
CORE_CHECK_INCLUDE_FILE("netinet/in.h" HAVE_NETINET_IN_H MXA)
CORE_CHECK_INCLUDE_FILE("arpa/inet.h" HAVE_ARPA_INET_H MXA)
CORE_CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H MXA)
CORE_CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_H MXA)
CORE_CHECK_INCLUDE_FILE("errno.h" HAVE_ERRNO_H MXA)
configure_file (Conf.h.in Conf.h @ONLY)
#--- End test.cmake file
// Example Conf.h.in file
/* Define to 1 if you have the <stddef.h> header file. */
#cmakedefine MXA_HAVE_STDDEF_H @MXA_HAVE_STDDEF_H@
/* Define to 1 if you have the <stdint.h> header file. */
#cmakedefine MXA_HAVE_STDINT_H @MXA_HAVE_STDINT_H@
/* Define to 1 if you have the <stdlib.h> header file. */
#cmakedefine MXA_HAVE_STDLIB_H @MXA_HAVE_STDLIB_H@
/* Define to 1 if you have the <setjmp.h> header file. */
#cmakedefine MXA_HAVE_SETJMP_H @MXA_HAVE_SETJMP_H@
/* Define to 1 if you have the <string.h> header file. */
#cmakedefine MXA_HAVE_STRING_H @MXA_HAVE_STRING_H@
/* Define to 1 if you have the <stdio.h> header file. */
#cmakedefine MXA_HAVE_STDIO_H @MXA_HAVE_STDIO_H@
/* Define to 1 if you have the <math.h> header file. */
#cmakedefine MXA_HAVE_MATH_H @MXA_HAVE_MATH_H@
/* Define to 1 if you have the <time.h> header file. */
#cmakedefine MXA_HAVE_TIME_H @MXA_HAVE_TIME_H@
/* Define to 1 if you have the <sys/time.h> header file. */
#cmakedefine MXA_HAVE_SYS_TIME_H @MXA_HAVE_SYS_TIME_H@
/* Define to 1 if you have the <sys/types.h> header file. */
#cmakedefine MXA_HAVE_SYS_TYPES_H @MXA_HAVE_SYS_TYPES_H@
/* Define to 1 if you have the <sys/socket.h> header file. */
#cmakedefine MXA_HAVE_SYS_SOCKET_H @MXA_HAVE_SYS_SOCKET_H@
/* Define to 1 if you have the <netinet/in.h> header file. */
#cmakedefine MXA_HAVE_NETINET_IN_H @MXA_HAVE_NETINET_IN_H@
/* Define to 1 if you have the <arpa/inet.h> header file. */
#cmakedefine MXA_HAVE_ARPA_INET_H @MXA_HAVE_ARPA_INET_H@
/* Define to 1 if you have the <unistd.h> header file. */
#cmakedefine MXA_HAVE_UNISTD_H @MXA_HAVE_UNISTD_H@
/* Define to 1 if you have the <fcntl.h> header file. */
#cmakedefine MXA_HAVE_FCNTL_H @MXA_HAVE_FCNTL_H@
/* Define to 1 if you have the <errno.h> header file. */
#cmakedefine MXA_HAVE_ERRNO_H @MXA_HAVE_ERRNO_H@
at least that is how I do it.
___________________________________________________________
Mike Jackson www.bluequartz.net
Principal Software Engineer mike.jackson at bluequartz.net
BlueQuartz Software Dayton, Ohio
On Jul 29, 2010, at 6:25 PM, Clifford Yapp wrote:
> I'm now at the point in writing CMake logic where I need to handle the
> config.h.in situation, and either have missed the autoheader
> equivalent functionality in CMake or it doesn't exist yet. Can
> anybody point me to the "right" approach to this? I have so-far
> found:
>
> The #cmakedefine mechanism and the various CHECK_* functions, which
> work fine but aren't autogenerated a.l.a autoheader
>
> A 2009 discussion about autoheader-style functionality:
> http://www.cmake.org/pipermail/cmake/2009-March/028293.html
> http://www.cmake.org/pipermail/cmake/2009-April/028417.html
>
> and a still-open item in the tracker from 2008:
> http://www.cmake.org/Bug/view.php?id=6438&nbn=1
>
> Has there been any recent work on this that I missed? Our project has
> quite a slew of these #defines created by autoheader, most of which
> are apparently actually needed, so manually maintaining a list is
> gonna be a bit of a tough sell.
>
> Cheers, and any help appreciated,
>
> CY
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake
More information about the CMake
mailing list