From: Thomas W. <tho...@us...> - 2007-12-22 22:03:55
|
Update of /cvsroot/octaviz/octaviz In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv2044 Modified Files: CMakeLists.txt Log Message: Revamped build system Interface to the WRAP macro simplified. Parallel builds should work now; out-of-source build should work as well. A pre-compiled header file can be used (alas, it doesn't seem to speed the build up that much). Index: CMakeLists.txt =================================================================== RCS file: /cvsroot/octaviz/octaviz/CMakeLists.txt,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- CMakeLists.txt 12 Oct 2007 10:09:32 -0000 1.14 +++ CMakeLists.txt 22 Dec 2007 22:03:54 -0000 1.15 @@ -14,10 +14,21 @@ ## OPTION(USE_PREC_HEADERS "Use precompiled headers" OFF) -STRING(COMPARE EQUAL ${USE_PREC_HEADERS} "OFF" PCH_ON) -IF(PCH_ON) - SET(CXX_COMPILER_PCH "g++" CACHE STRING "CMake overides compiler environment varibles. Put the compiler name here.") -ENDIF(PCH_ON) + +OPTION(WARN_ABOUT_DEPRECATED "Set -Wno-deprecated. If using precompiled headers, this must be set to the same value that was used when compiling VTK." ON ) +IF(WARN_ABOUT_DEPRECATED) + SET(WNODEPRECATED "-Wno-deprecated" CACHE STRING "Pass -Wno-deprecated to gcc.") +ENDIF(WARN_ABOUT_DEPRECATED) + + +# If the octaviz library is put outside Octave's library path, the +# .oct file need an rpath +# +# This is mainly for packagers who want to put the library into a path +# independent of the current Octave version, ie /usr/lib/octaviz +SET(OCTAVIZ_RPATH "" CACHE PATH "rpath for inclusion into the compiled .oct files") +MARK_AS_ADVANCED(OCTAVIZ_RPATH) + SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} /usr/local/lib/vtk /usr/lib/vtk) @@ -52,6 +63,15 @@ MESSAGE(FATAL_ERROR "mkoctfile was not found. If you installed Octave from a distribution package, please check if there are any devel packages for it (normally named '-dev' or '-devel')") ENDIF(NOT MKOCTFILE) EXEC_PROGRAM(${MKOCTFILE} ARGS "-p ALL_CXXFLAGS" OUTPUT_VARIABLE ALL_CXXFLAGS) +EXEC_PROGRAM(${MKOCTFILE} ARGS "-p XTRA_CXXFLAGS" OUTPUT_VARIABLE XTRA_CXXFLAGS) +# -mieee-fp +EXEC_PROGRAM(${MKOCTFILE} ARGS "-p CXXPICFLAG" OUTPUT_VARIABLE CXXPICFLAG) +# -fPIC +EXEC_PROGRAM(${MKOCTFILE} ARGS "-p CXXFLAGS" OUTPUT_VARIABLE CXXFLAGS) +# -O2 +EXEC_PROGRAM(${MKOCTFILE} ARGS "-p CXX" OUTPUT_VARIABLE OCTAVE_CXX) +SET(CMAKE_CXX_COMPILER ${OCTAVE_CXX}) + # Make the values accessible from other CMakeLists.txt files # Also, this allows packagers to override the default values @@ -59,13 +79,12 @@ SET(OCTAVIZ_M_DIR ${M_SITE_DIR}/octaviz CACHE PATH ".m files from Octaviz") SET(OCTAVIZ_EXAMPLES_DIR ${OCTAVIZ_M_DIR}/Examples CACHE PATH "Example .m files from Octaviz") SET(OCTAVIZ_SHARED_DIR ${OCTLIBDIR} CACHE PATH "shared libraries from Octaviz") -SET(ALL_CXXFLAGS ${ALL_CXXFLAGS} CACHE STRING "ALL_CXXFLAGS from mkoctfile") # Build the vtkOctave wrapping utility first. ADD_SUBDIRECTORY(Wrapping) # Macro to create Octave wrapper functions -MACRO(OCTAVE_WRAP_VTK kit deps) +MACRO(OCTAVE_WRAP_VTK kit) STRING(TOUPPER ${kit} ukit) INCLUDE(${VTK_KITS_DIR}/vtk${kit}Kit.cmake) @@ -74,72 +93,117 @@ # this is an ugly hack[TM] and should be fixed by e.g. # including a list of not-to-be-built-functions shipped with # Octaviz - SET(VTK_CLASS_WRAP_EXCLUDE_vtkLongLongArray 1) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkSignedCharArray 1) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkUnsignedLongLongArray 1) - # Mac OS X will not compile these as well. Will exclude until a better solution is determined + # see http://public.kitware.com/pipermail/vtkusers/2004-November/077447.html + SET(CANNOT_BUILD vtkLongLongArray vtkSignedCharArray vtkUnsignedLongLongArray) IF(APPLE) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkStreamTracer 1) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkTensorGlyph 1) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkDEMReader 1) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkTIFFWriter 1) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkCameraInterpolator 1) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkQuaternionInterpolator 1) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkTransformInterpolator 1) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkProjectedTerrainPath 1) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkImagePlaneWidget 1) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkDistributedStreamTracer 1) - SET(VTK_CLASS_WRAP_EXCLUDE_vtkPStreamTracer 1) + # Mac OS X will not compile these as well. Will exclude until a better + # solution is determined + SET(CANNOT_BUILD ${CANNOT_BUILD} + vtkStreamTracer vtkTensorGlyph vtkDEMReader vtkTIFFWriter + vtkCameraInterpolator vtkQuaternionInterpolator vtkTransformInterpolator + vtkProjectedTerrainPath vtkImagePlaneWidget vtkDistributedStreamTracer + vtkPStreamTracer) ENDIF(APPLE) + FOREACH(class ${CANNOT_BUILD}) + SET(VTK_CLASS_WRAP_EXCLUDE_${class} 1 CACHE INTERNAL "We can't build ${class}" FORCE) + ENDFOREACH(class) - # SET(all_oct) - # FOREACH(class ${VTK_${ukit}_CLASSES}) - # IF(NOT VTK_CLASS_WRAP_EXCLUDE_${class}) - # SET(all_oct ${all_oct} ${class}.oct) - # ENDIF(NOT VTK_CLASS_WRAP_EXCLUDE_${class}) - # ENDFOREACH(class) - # ADD_CUSTOM_TARGET(vtk${kit}.cc ALL cat ${all_ccs} > vtk${kit}.cc) - - SET(oct_flags -I${VTK_${ukit}_HEADER_DIR} -I../Common) - SET(oct_link_flags -L${X11_LIBRARY_DIR} -lX11 -lXt -L${VTK_LIBRARY_DIRS} -lvtkCommon -lvtk${kit} -lvtkFiltering -lvtkGraphics) - # ADD_CUSTOM_TARGET(vtk${kit}.oct ALL sleep 0\; mkoctfile ${oct_flags} ${oct_link_flags} -L../Common -loctaviz vtk${kit}.cc) + # There are some header files in the Common/ directory that we need + # Add binary directory before source directory for the precompiled headers + SET(INCLUDE_FLAGS -I${VTK_${ukit}_HEADER_DIR} -I${CMAKE_BINARY_DIR}/Common -I${CMAKE_SOURCE_DIR}/Common) + SET(LINK_FLAGS -L${X11_LIBRARY_DIR} -lX11 -lXt + -L${VTK_LIBRARY_DIRS} -lvtkCommon -lvtk${kit} -lvtkFiltering -lvtkGraphics + -L${CMAKE_BINARY_DIR}/Common -loctaviz) + + SET(COMPILERFLAGS ${CXXFLAGS} ${XTRA_CXXFLAGS} ${WNODEPRECATED} + -I${OCTINCLUDEDIR} -I${OCTINCLUDEDIR}/octave + ${INCLUDE_FLAGS}) + SEPARATE_ARGUMENTS(COMPILERFLAGS) + # Combine all flags, so that each compiler run gets them in the same + # order; this seems necessary for precompiled headers + # SEPARATE_ARGUMENTS is necessary, otherwise cmake combines the flag into one + # long string and escapes it when passing to g++ later => bug # Precompiled headers IF(USE_PREC_HEADERS) # Which flags will mkoctfile use? - SET (PCHFLAGS "") - - STRING(REGEX MATCHALL "[^ ]+" MKOCT_FLAGS_LIST ${ALL_CXXFLAGS}) - FOREACH (flag ${MKOCT_FLAGS_LIST}) - SET (PCHFLAGS ${PCHFLAGS} ${flag}) - ENDFOREACH (flag ${MKOCT_FLAGS_LIST}) + SET (PCHFLAGS "-Winvalid-pch") - # MESSAGE(${PCHFLAGS}) + SET(GCH_HEADER ${OCTAVIZ_BINARY_DIR}/Common/OctavizCommon.h.gch) + # type path of file only once - ADD_CUSTOM_TARGET(OctavizCommon.h.gch ALL ${CXX_COMPILER_PCH} "-c" ${PCHFLAGS} ${oct_flags} ../Common/OctavizCommon.h) + ADD_CUSTOM_COMMAND(OUTPUT ${GCH_HEADER} + COMMAND ${CMAKE_CXX_COMPILER} + ARGS -c ${PCHFLAGS} ${COMPILERFLAGS} + "-o" ${GCH_HEADER} + ${OCTAVIZ_SOURCE_DIR}/Common/OctavizCommon.h + VERBATIM) ENDIF(USE_PREC_HEADERS) - # Remove prefix from oct install dir - STRING(REGEX REPLACE "${CMAKE_INSTALL_PREFIX}" "" OCT_INST_DIR ${OCT_SITE_DIR}) - + SET ( all_o "" ) SET ( all_oct "" ) + # track compiled object and .oct files for dependencies + FOREACH(class ${VTK_${ukit}_CLASSES}) - # LIST( GET VTK_${ukit}_CLASSES 10 class ) SET(full_name "${VTK_${ukit}_HEADER_DIR}/${class}.h") IF(NOT VTK_CLASS_WRAP_EXCLUDE_${class}) - ADD_CUSTOM_COMMAND( OUTPUT ${class}.cc COMMAND ../Wrapping/vtkWrapOctave ${full_name} ../Wrapping/hints 1 ${class}.cc ) - ADD_CUSTOM_COMMAND( OUTPUT ${class}.oct COMMAND ${MKOCTFILE} ${oct_flags} -Wno-deprecated ${oct_link_flags} -L../Common -loctaviz ${class}.cc DEPENDS ${class}.cc ) - SET ( all_oct ${all_oct} ${class}.oct ) - # ADD_CUSTOM_TARGET(${class}.cc ALL ../Wrapping/vtkWrapOctave ${full_name} ../Wrapping/hints 1 ${class}.cc) - # ADD_CUSTOM_TARGET(${class}.oct ALL sleep 0 \; mkoctfile ${oct_flags} ${oct_link_flags} -L../Common -loctaviz ${class}.cc) - # ADD_DEPENDENCIES(vtk${kit}.cc ${class}.cc) + # create individual .cc files + + ADD_CUSTOM_COMMAND( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${class}.cc + DEPENDS vtkWrapOctave + COMMAND ${CMAKE_BINARY_DIR}/Wrapping/vtkWrapOctave + ARGS ${full_name} ${CMAKE_SOURCE_DIR}/Wrapping/hints 1 ${CMAKE_CURRENT_BINARY_DIR}/${class}.cc + COMMENT "Generating ${CMAKE_CURRENT_BINARY_DIR}/${class}.cc from ${full_name}" + VERBATIM) + + # compile individual .cc files into object files + ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${class}.o + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${class}.cc octaviz ${GCH_HEADER} + # octaviz is the target from the shared lib in Common/ directory + # COMMAND ${CMAKE_CXX_COMPILER} + COMMAND ${CMAKE_CXX_COMPILER} + ARGS -c ${PCHFLAGS} ${COMPILERFLAGS} + -o ${CMAKE_CURRENT_BINARY_DIR}/${class}.o + ${CMAKE_CURRENT_BINARY_DIR}/${class}.cc + COMMENT "Compiling ${class}.cc to ${class}.o" + VERBATIM) + SET (all_o ${all_o} ${CMAKE_CURRENT_BINARY_DIR}/${class}.o ) + + # link object files into .oct files + ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${class}.oct + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${class}.o octaviz ${GCH_HEADER} + # octaviz is the target from the shared lib in Common/ directory + # COMMAND ${CMAKE_CXX_COMPILER} + COMMAND ${MKOCTFILE} + ARGS ${PCHFLAGS} ${LINK_FLAGS} + -o ${CMAKE_CURRENT_BINARY_DIR}/${class}.oct + -Wl,-rpath=${OCTAVIZ_RPATH} + ${CMAKE_CURRENT_BINARY_DIR}/${class}.o + COMMENT "Linking ${class}.o to ${class}.oct" + VERBATIM) + + SET (all_oct ${all_oct} ${CMAKE_CURRENT_BINARY_DIR}/${class}.oct ) + ENDIF(NOT VTK_CLASS_WRAP_EXCLUDE_${class}) ENDFOREACH(class) + + # add custom target for the current kit + ADD_CUSTOM_TARGET( ${kit} ALL + COMMAND echo ${all_oct} + DEPENDS ${all_oct} vtkWrapOctave octaviz + COMMENT "Building VTK kit ${kit} in ${CMAKE_CURRENT_BINARY_DIR}." + VERBATIM) + + # INSTALL rule for the current .oct files + INSTALL(PROGRAMS ${all_oct} DESTINATION ${OCTAVIZ_OCT_DIR}) + + ADD_DEPENDENCIES(${kit} OctavizCommonFiles) ENDMACRO(OCTAVE_WRAP_VTK) -# MARK_AS_ADVANCED(CMAKE_INSTALL_PREFIX) + # Build octave wrappers for VTK kits. ADD_SUBDIRECTORY(Common) |