Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Building a library using autotools from cmake

This is my first try with cmake and I would like to have, if possible, some feedbacks about what I did since some problems remain.

In the CMakeLists.txt of the library folder, I created two makefile targets: configure-antlr3c and antlr3c. The first target runs the autotools configuration shell script, the second one runs the make executable to build the library:

# CMakeLists.txt in libantlr3c-3.1.3  add_custom_target(   configure-antlr3c   ${SHELL_EXECUTABLE} configure   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )  add_custom_target(   antlr3c    ${MAKE}    DEPENDS configure-antlr3c    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) 

The main problem is thatconfigure-antlr3c target is always "out of date", so it will always be executed even if no changes happened. Moreover, I necessarily need to generate my cmake makefiles in a separate directory (not in the root directory of my project) to avoid overriding the autotools Makefile of the library...

Has anyone had this problem (building autotools projects with cmake) ? And if so, what have been your solutions ?

Thank you.

EDIT : Solution In the root CMakeLists.txt:

include(ExternalProject) ExternalProject_Add(   libantlr3c   SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3   CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3/configure --prefix=${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3   PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3   BUILD_COMMAND make   BUILD_IN_SOURCE 1 ) 
like image 915
Julio Guerra Avatar asked May 12 '11 00:05

Julio Guerra


People also ask

What is Autotools configure?

Autotools configurationThis file is used by autoconf to create the configure shell script that users run before building. The file must contain, at the very least, the AC_INIT and AC_OUTPUT M4 macros.

How do I use autoconf?

To create a configure script with Autoconf, you need to write an Autoconf input file configure.ac (or configure.in ) and run autoconf on it. If you write your own feature tests to supplement those that come with Autoconf, you might also write files called aclocal. m4 and acsite. m4 .

Can I use CMake instead of make?

So, what is the real difference? CMake is much more high-level. It's tailored to compile C++, for which you write much less build code, but can be also used for general purpose build. make has some built-in C/C++ rules as well, but they are useless at best.


1 Answers

I think that you'd be better off using the ExternalProject feature of cmake. I guess you have your project and have libantrl in a sub directory?

project       +- libantlr       +- mysrc   ---- etc ---- 

If that's the case, you can do something like this in the top level CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) project(test) include(ExternalProject) ExternalProject_Add(libantlr     SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libantlr     CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/libantlr/configure --prefix=<INSTALL_DIR>     BUILD_COMMAND ${MAKE}) 

The <INSTALL_DIR> is expanded to something like libantlr-prefix, so things are installed in your build tree rather than in /usr/local, which is what autotools would do without a prefix.

like image 178
richq Avatar answered Sep 27 '22 20:09

richq