Hi all On 10/06/16 14:05, Sergey Spiridonov wrote:
> To debug and fix our applications/libraries we often need to recompile > single source file in a debug mode. With the our current build system it > is as simple, as touching a file an starting make with debug option. It > will then recompile that single file with -O0 -g and with -DDEBUG and > relink target application/library. I implemented following solution (proposed by Elizabeth A. Fischer elizabeth.fisc...@columbia.edu): 1. Create a wrapper script ggcc/gg++ around the gcc/g++. It checks if env variable PDL has "d" and if true, then removes release options and inserts debug options instead. 2. The very first time cmake must be started like "CC=ggcc CXX=gg++ cmake" (it is not enough just to rerun cmake, you must clean everything first) 3. To recompile some of the source files in debug mode, one has to touch them and run "make PDL=d" Here is the wrapper script (inspired by [1]) [1] https://github.com/gawen947/gcc-wrapper/ #!/bin/bash # This is a wrapper around gcc compiler to allow switching to debug mode "on the fly" # you can enable debugging by executing "make PDL=d" # # # (may be also trigger debug mode by creating empty sourcefile.cc.debug in the same directory?) # TODO: pass this from cmake(CMakeList.txt)->make GAM_DEBUG_FLAGS="-Og -g -DGAM_DEBUG -ggdb -fno-inline -fno-default-inline" GAM_REMOVE_DEBUG_FLAGS="-O3 -finline-functions -fexpensive-optimizations" # what is cheaper, call external program or use bash instead of sh? newcmd="" if [ ${0##*/} == "ggcc" ]; then TOOL="gcc" elif [ ${0##*/} == "gg++" ]; then TOOL="g++" else echo "wrapper for gcc or g++" exit 120 fi if [[ "$PDL" == *"d"* ]]; then # add GAM_DEBUG_FLAGS, remove GAM_REMOVE_DEBUG_FLAGS INSERTED=0 for arg in $*; do if [ "-O3" == "$arg" ]; then INSERTED=1 newcmd="$newcmd $GAM_DEBUG_FLAGS" continue fi # note spaces around env variables, they are essential if [[ " $GAM_DEBUG_FLAGS $GAM_REMOVE_FLAGS " == *" $arg "* ]]; then continue fi newcmd="$newcmd $arg" done if [ "$INSERTED" == 1 ]; then echo $TOOL $newcmd exec $TOOL $newcmd else exec $TOOL "$@" fi else exec $TOOL "$@" fi Hope this can be useful for somebody else... -- Best regards, Sergey Spiridonov -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/cmake