Tobi Akinyemi
Tobi Akinyemi

Reputation: 942

How can I convert a configure script to a CMakeLists file?

I'm wanting to use this library in my cmake project, however it comes with a configure file instead of CMakeLists.txt

#! /bin/sh
# waf configure wrapper
# based on http://code.google.com/p/waf/source/browse/configure

CUR_DIR=$PWD

#possible relative path
WORKINGDIR=`dirname $0`
cd $WORKINGDIR
#abs path
WORKINGDIR=`pwd`
cd $CUR_DIR
WAF=$WORKINGDIR/tools/waf

# Generates a Makefile. Requires that $WAF is set.
#
generateMakefile()
{
    cat > Makefile << EOF
#!/usr/bin/make -f
# Waf Makefile wrapper
WAF_HOME=$CUR_DIR

all:
    @$WAF build

all-debug:
    @$WAF -v build

all-progress:
    @$WAF -p build

install:
    $WAF install --yes;

uninstall:
    $WAF uninstall

clean:
    @$WAF clean

distclean:
    @$WAF distclean
    @-rm -rf build
    @-rm -f Makefile

check:
    @$WAF check

dist:
    @$WAF dist

.PHONY: clean dist distclean check uninstall install all

EOF
}

generateMakefile

"${WAF}" configure $*
exit $?

Are there automated tools for the conversion? Does CMake supoprt the use of configure files? Is there a rule of thumb for conversion - i.e. replace ... with add_library?

Upvotes: 0

Views: 906

Answers (2)

RAM
RAM

Reputation: 2769

You don't need to convert an upstream library to cmake to be able to use it in cmake projects. As long as you're able to install and/or link to that library, you can configure your cmake project to use it.

A common pattern to consume third-party libraries with cmake is to use cmake's find_package() function by supplying your own special-purpose cmake module files to find and configure the library.

Say, you're hoping to load libfoo. Here are the steps:

  • create a directory within your project tree to store your custom cmake modules (say, ./cmake/modules)

  • in that directory create a text file named FindFoo.cmake.

  • Within FindFoo.cmake add checks to determine if foo is actually present in the system. If it is then set the relevant variables. Otherwise, throw an error. The ideal thing is to create a build target for that library, which you can simply add as dependencies to other cmake targets.

  • Configure your cmake project to use your local modules by adding set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/"),

  • Finally, configure your cmake project to include your Foo library by calling find_package(Foo REQUIRED).

Upvotes: 2

Jesper Juhl
Jesper Juhl

Reputation: 31458

The way to do the conversion is to read the configure script and understand what it does and how/why. Then write a CMakeLists.txt file that achieves the same.

There are no shortcuts.

Upvotes: 0

Related Questions