views:

370

answers:

2

I'm wondering how i can make a portable build system (step-by-step), i currently use cmake because it was easy to set up in the first place, with only one arch target, but now that i have to package the library I'm developing I'm wondering how is the best way to make it portable for arch I'm testing.

I know I need a config.h to define things depending on the arch but I don't know how automatic this can be.

Any other way to have a build system are warmly welcome!

+2  A: 

I have been using the GNU autoconf/automake toolchain which has worked well for me so far. I am only really focussed on Linux/x86 (and 64bit) and the Mac, which is important if you are building on a PowerPC, due to endian issues.

With autoconf you can check the host platform with the macro:

AC_CANONICAL_HOST

And check the endianness using:

AC_C_BIGENDIAN

Autoconf will then add definitions to config.h which you can use in your code.

I am not certain (have never tried) how well the GNU autotools work on Windows, so if Windows is one of your targets then you may be better off finding similar functionality with your existing cmake build system.

For a good primer on the autotools, have a look here:

http://www.freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtool

MichaelM
windows will never be a target for me i hope ;)
claferri
+9  A: 

You can just use CMake, it's pretty straightforward.

You need these things:

First, means to find out the configuration specifics. For example, if you know that some function is named differently on some platform, you can use TRY_COMPILE to discover that:

TRY_COMPILE(HAVE_ALTERNATIVE_FUNC 
    ${CMAKE_BINARY_DIR}
    ${CMAKE_SOURCE_DIR}/alternative_function_test.cpp
    CMAKE_FLAGS -DINCLUDE_DIRECTORIES=xxx
)

where alternative_function_test.cpp is a file in your source directory that compiles only with the alternative definition.

This will define variable HAVE_ALTERNATIVE_FUNC if the compile succeeds.

Second, you need to make this definition affect your sources. Either you can add it to compile flags

IF(HAVE_TR1_RANDOM)
    ADD_DEFINITIONS(-DHAVE_TR1_RANDOM)
ENDIF(HAVE_TR1_RANDOM)

or you can make a config.h file. Create config.h.in with the following line

#cmakedefine HAVE_ALTERNATIVE_FUNCS

and create a config.h file by this line in CMakeLists.txt (see CONFIGURE_FILE)

CONFIGURE_FILE(config.h.in config.h @ONLY)

the #cmakedefine will be translated to #define or #undef depending on the CMake variable.

BTW, for testing edianness, see this mail

jpalecek