Naram Qashat wrote:
Bill Hoffman wrote:
Naram Qashat wrote:
I have a CMake project that I have been testing with various verisons of CMake 2.4.x and 2.6.x to make sure it works as far back as 2.4.0, due to not knowing what version of CMake our users will be using since a lot of them use shells. In some instances, I have to read lines from a file using a specific regular expression. With CMake 2.6.x, this works fine using the file(STRINGS) command. With CMake 2.4.x, though (I haven't checked what versions specifically), after reading in a lot of files, I notice that a "memory exhausted" error comes up. I'm wondering when CMake cleans up the memory it uses, and if there is a way around this problem. I would prefer not to force our uses to use CMake 2.6.x if their shell provider won't provide them something newer.

There may have been leaks in 2.4.X, not really much we can do about that now.... What does the your cmake code look like that causes the leak?


-Bill

I believe it is within this macro of mine:

macro(read_from_file FILE REGEX STRINGS)
  if(CMAKE26_OR_BETTER)
# For CMake 2.6.x or better, we can just use the STRINGS sub-command to get the lines that match the given regular expression (if one is given, otherwise get all lines)
    if(REGEX STREQUAL "")
      file(STRINGS ${FILE} RESULT)
    else(REGEX STREQUAL "")
      file(STRINGS ${FILE} RESULT REGEX ${REGEX})
    endif(REGEX STREQUAL "")
  else(CMAKE26_OR_BETTER)
# For CMake 2.4.x, we need to do this manually, firstly we read the file in
    file(READ ${FILE} ALL_STRINGS)
    # Next we replace all newlines with semicolons
    string(REGEX REPLACE "\n" ";" ALL_STRINGS ${ALL_STRINGS})
    if(REGEX STREQUAL "")
      # For no regular expression, just set the result to all the lines
      set(RESULT ${ALL_STRINGS})
    else(REGEX STREQUAL "")
      # Clear the result list
      set(RESULT)
      # Iterate through all the lines of the file
      foreach(STRING ${ALL_STRINGS})
        # Check for a match against the given regular expression
        string(REGEX MATCH ${REGEX} STRING_MATCH ${STRING})
        # If we had a match, append the match to the list
        if(STRING_MATCH)
          append_to_list(RESULT ${STRING})
        endif(STRING_MATCH)
      endforeach(STRING)
    endif(REGEX STREQUAL "")
  endif(CMAKE26_OR_BETTER)
  # Set the given STRINGS variable to the result
  set(${STRINGS} ${RESULT})
endmacro(read_from_file)

I had done this so I could call the macro and have it work with either 2.6.x or 2.4.x.

The only thing I can think of is to call a new cmake process in the loop that does the string match, that way the leak will be contained in that process.

execute_process(COMMAND ${CMAKE_COMMAND} -DFILE="${FILE}"-P myscript.cmake OUTPUT_VARIABLE OUT)

myscript.cmake
 file(READ ${FILE} ALL_STRINGS)
...
  message(${RESULT})

-Bill
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to