[CMake] Re: premake build system

Gonzalo Garramuño ggarra at advancedsl.com.ar
Mon Dec 17 15:33:15 EST 2007


Alexander Neundorf wrote:
>> I have my own UnixPaths and modules to work around most of the above,
> 
> Can you please post it ?
> 

Sure.  It is really two pieces.  FindBuildDir.cmake which is called 
first and Platforms/UnixPaths.cmake.

FindBuildDir does the hard check of setting up a couple of variables. 
It sets CMAKE_NATIVE_ARCH to 32 or 64.

And sets the OS_32_BITS and OS_64_BITS variables to represent whether 
the machine can compile for that.

User calls (optionally) cmake with -DCMAKE_BUILD_ARCH=32 to build in 32 
bits.

Currently, I only have it working for Linux (tested) and Sun (not 
tested).  Windows and OSX are todo, as I don't have access to 64-bit 
versions of them.


UnixPaths.cmake is then set to search for 
/usr/local/lib${CMAKE_BUILD_ARCH} before it searches for any 
/usr/local/lib and other.

This is still kind of screwy now because try-compile will call 
UnixPaths.cmake without calling my FindBuildDir, which is a bug in how 
cmake deals with variables.


-- 
Gonzalo Garramuño
ggarra at advancedsl.com.ar

AMD4400 - ASUS48N-E
GeForce7300GT
Xubuntu Gutsy
-------------- next part --------------
#-*-cmake-*-
#
# This simple CMake extension makes sure that builds get
# created inside a BUILD/os-osversion-arch directory
# and that executables, obj files and lib files get placed
# correctly in subdirectories.
#
#
# Macro to check architecture
#
MACRO( CHECK_ARCHITECTURE )


  IF( NOT CMAKE_BUILD_ARCH )
    SET( CMAKE_BUILD_ARCH $ENV{CMAKE_BUILD_ARCH} )
    IF( NOT CMAKE_BUILD_ARCH )
      SET( CMAKE_BUILD_ARCH "Native" )
    ENDIF( NOT CMAKE_BUILD_ARCH )
  ENDIF( NOT CMAKE_BUILD_ARCH )

  IF( NOT CMAKE_BUILD_ARCH MATCHES "^(Native|64|32)$" )
    MESSAGE( FATAL_ERROR 
      "CMAKE_BUILD_ARCH set but invalid.  "
      "Only Native, 64 and 32 are valid settings" )
  ENDIF( NOT CMAKE_BUILD_ARCH MATCHES "^(Native|64|32)$" )

  #
  # Set Native architecture based on void* size
  #
  INCLUDE(CheckTypeSize)
  CHECK_TYPE_SIZE(void*  SIZEOF_VOID_PTR)

  IF( ${SIZEOF_VOID_PTR} MATCHES "^8$" )
    SET( OS_32_BITS 0 )
    SET( OS_64_BITS 1 )
    SET( CMAKE_NATIVE_ARCH 64 )
  ELSE( ${SIZEOF_VOID_PTR} MATCHES "^8$" )
    SET( OS_32_BITS 1 )
    SET( OS_64_BITS 0 )
    SET( CMAKE_NATIVE_ARCH 32 )
  ENDIF( ${SIZEOF_VOID_PTR} MATCHES "^8$" )

  MESSAGE( FATAL_ERROR "void size: ${SIZEOF_VOID_PTR}" )

  IF( UNIX )
    EXECUTE_PROCESS( 
      COMMAND uname -a
      OUTPUT_VARIABLE OS_ARCH 
      )

    #
    # For Linux
    #
    IF( OS_ARCH MATCHES ".*Linux.*" )
      IF( OS_ARCH MATCHES ".*x86_64.*" )
	SET( OS_32_BITS 1 )
      ELSEIF( OS_ARCH MATCHES ".*ia64.*" )
	SET( OS_32_BITS 0 )
      ELSEIF( OS_ARCH MATCHES ".*i686.*" )
	SET( OS_32_BITS 1 )
      ENDIF( OS_ARCH MATCHES ".*x86_64.*" )
    ENDIF( OS_ARCH MATCHES ".*Linux.*" )

    #
    # For SUN
    #
    IF( OS_ARCH MATCHES ".*SunOS.*" )
      EXECUTE_PROCESS( 
	COMMAND isainfo -v
	OUTPUT_VARIABLE SUNOS_ARCH 
	)

      IF ( SUNOS_ARCH MATCHES ".*64-bit.*" )
	SET( OS_32_BITS 1 )
      ENDIF(  SUNOS_ARCH MATCHES ".*64-bit.*" )

    ENDIF( OS_ARCH MATCHES ".*SunOS.*" )

    IF( APPLE )
      #
      # @todo: add Apple 64-bit OS detection here
      #
    ENDIF( APPLE )

  ELSE( UNIX )

    #
    # @todo: add windows 64-bit OS detection here
    #

  ENDIF( UNIX )


  IF ( CMAKE_BUILD_ARCH STREQUAL "Native" )
    SET( CMAKE_BUILD_ARCH ${CMAKE_NATIVE_ARCH} )
  ENDIF( CMAKE_BUILD_ARCH STREQUAL "Native" )

  IF( CMAKE_BUILD_ARCH EQUAL 32 )

    IF( NOT OS_32_BITS )
      MESSAGE( FATAL_ERROR 
	"Sorry, but this platform cannot compile 32-bit applications" )
    ENDIF( NOT OS_32_BITS )

    IF( NOT CMAKE_NATIVE_ARCH EQUAL 32 )

      IF( WIN32 )
      ELSE( WIN32 )

	IF( CMAKE_COMPILER_IS_GNUCXX )
	  ADD_DEFINITIONS( -m32 )
	  SET( LINK_FLAGS "-m32 ${LINK_FLAGS}" )
	ELSE( CMAKE_COMPILER_IS_GNUCXX )

	  #
	  # @todo: add 32-bit compile flags for non-GNU compilers here
	  #
	  
	ENDIF( CMAKE_COMPILER_IS_GNUCXX )
      ENDIF( WIN32 )

    ENDIF( NOT CMAKE_NATIVE_ARCH EQUAL 32 )

  ENDIF( CMAKE_BUILD_ARCH EQUAL 32 )

ENDMACRO( CHECK_ARCHITECTURE )


CHECK_ARCHITECTURE()

#
# Store build type
#
IF(NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE Release CACHE STRING
      "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
      FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)

IF( CMAKE_BUILD_TYPE STREQUAL "Debug" )
  ADD_DEFINITIONS( -DDEBUG )
ENDIF( CMAKE_BUILD_TYPE STREQUAL "Debug" )

IF( NOT CMAKE_SYSTEM )
  MESSAGE( FATAL_ERROR "CMAKE_SYSTEM was not set" )
ENDIF( NOT CMAKE_SYSTEM )

#
# @bug in cmake2.5 in windows (workaround)
#
IF( NOT CMAKE_SYSTEM_VERSION )
  SET( CMAKE_SYSTEM_VERSION "5.1" )
  SET( CMAKE_SYSTEM "${CMAKE_SYSTEM}-${CMAKE_SYSTEM_VERSION}" )
ENDIF( NOT CMAKE_SYSTEM_VERSION )


IF( NOT CMAKE_BUILD_TYPE )
  MESSAGE( FATAL_ERROR "CMAKE_BUILD_TYPE was not set" )
ENDIF( NOT CMAKE_BUILD_TYPE )

IF( NOT CMAKE_BUILD_ARCH )
  MESSAGE( FATAL_ERROR "CMAKE_BUILD_ARCH was not set" )
ENDIF( NOT CMAKE_BUILD_ARCH )


SET( BUILD_DIR "${CMAKE_SOURCE_DIR}/BUILD/${CMAKE_SYSTEM}-${CMAKE_BUILD_ARCH}/${CMAKE_BUILD_TYPE}" )

SET( PROJECT_BINARY_DIR "${BUILD_DIR}" )
SET( EXECUTABLE_OUTPUT_PATH "${BUILD_DIR}/bin" )
# SET( CMAKE_BINARY_DIR "${BUILD_DIR}/obj" )
SET( LIBRARY_OUTPUT_PATH "${BUILD_DIR}/lib" )
SET( CMAKE_LIBRARY_PATH ${LIBRARY_OUTPUT_PATH} ${CMAKE_LIBRARY_PATH} )

FILE( MAKE_DIRECTORY "${BUILD_DIR}" )
FILE( MAKE_DIRECTORY "${PROJECT_BINARY_DIR}" )
FILE( MAKE_DIRECTORY "${EXECUTABLE_OUTPUT_PATH}" )
FILE( MAKE_DIRECTORY "${LIBRARY_OUTPUT_PATH}" )


#
# Turn off crappy cmake's use of RPATH, which prevents the proper use
# of LD_LIBRARY_PATH
#
SET( CMAKE_SKIP_RPATH "ON" )


#
# If compiling in 32-bits mode on a 64-bits machine, place 32-bits
# libraries first
#
IF( ${CMAKE_CXX_FLAGS} MATCHES "-m32" )

  #
  # Remove 64-bits paths
  #
  LIST( REMOVE_ITEM CMAKE_SYSTEM_LIBRARY_PATH 
    /usr/local/lib /opt/local/lib /usr/X11R6/lib /usr/lib/X11 
    /usr/lib64 /lib64 /lib /usr/lib )


ENDIF( ${CMAKE_CXX_FLAGS} MATCHES "-m32" )


#
# Macro used to easily add linker flags to a target
#
MACRO( TARGET_LINK_FLAGS TARGET FLAGS )
  GET_TARGET_PROPERTY( OLD_FLAGS ${TARGET} LINK_FLAGS )
  SET_TARGET_PROPERTIES( 
    ${TARGET}
    PROPERTIES 
    LINK_FLAGS "${FLAGS} ${OLD_FLAGS}"
    )
ENDMACRO( TARGET_LINK_FLAGS )

-------------- next part --------------
SET(UNIX 1)

# also add the install directory of the running cmake to the search directories
# CMAKE_ROOT is CMAKE_INSTALL_PREFIX/share/cmake, so we need to go two levels up
GET_FILENAME_COMPONENT(_CMAKE_INSTALL_DIR "${CMAKE_ROOT}" PATH)
GET_FILENAME_COMPONENT(_CMAKE_INSTALL_DIR "${_CMAKE_INSTALL_DIR}" PATH)

SET(CMAKE_SYSTEM_INCLUDE_PATH ${CMAKE_SYSTEM_INCLUDE_PATH}
  # Locals first
  /usr/local/include /opt/local/include 
 
  # Windows API on Cygwin
  /usr/include/w32api

  # X11
  /usr/X11R6/include /usr/include/X11

  # Other
  /opt/local/include /usr/pkg/include
  /opt/csw/include /opt/include  
  /usr/openwin/include
  "${_CMAKE_INSTALL_DIR}/include"
  "${CMAKE_INSTALL_PREFIX}/include"

  # Standard
  /usr/include /include 
  )

SET(CMAKE_SYSTEM_LIBRARY_PATH ${CMAKE_SYSTEM_LIBRARY_PATH}

  # Platforms first
  /usr/local/lib${CMAKE_BUILD_ARCH}
  /opt/local/lib${CMAKE_BUILD_ARCH}
  /opt/lib${CMAKE_BUILD_ARCH}
  /usr/lib${CMAKE_BUILD_ARCH}
  /lib${CMAKE_BUILD_ARCH}

  # Locals first
  /usr/local/lib /opt/local/lib 

  # Windows API on Cygwin
  /usr/lib/w32api

  # X11
  /usr/X11R6/lib /usr/lib/X11

  # Other
  /opt/local/lib /usr/pkg/lib
  /opt/csw/lib /opt/lib 
  /usr/openwin/lib
  "${_CMAKE_INSTALL_DIR}/lib"
  "${CMAKE_INSTALL_PREFIX}/lib"

  # Standard
  /usr/lib /lib
  )

SET(CMAKE_SYSTEM_PROGRAM_PATH ${CMAKE_SYSTEM_PROGRAM_PATH}
  /usr/local/bin /usr/pkg/bin /usr/bin /sbin /bin
  "${_CMAKE_INSTALL_DIR}/bin"
  "${CMAKE_INSTALL_PREFIX}/bin"
  )

SET(CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES
  ${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}
  /usr/lib64 /usr/lib32 /usr/lib /lib 
  )

# Enable use of lib64 search path variants by default.
SET_PROPERTIES(GLOBAL PROPERTIES FIND_LIBRARY_USE_LIB64_PATHS TRUE)



More information about the CMake mailing list