[CMake] Splitting directory and file.

Pablo Zurita pzurita at gmail.com
Fri Mar 4 11:45:53 EST 2011


Yeah I was aware of that, I forgot to state that on the comment for the function. This was made on purpose since I don't want the pain of adding every file to CMake and I certainly don't want CMake running automatically.

Thanks,
Pablo Zurita.

PS: the sourceFiles argument must be removed from the function or else the first file of each directory won't be in the right filter.

Sent from my iPhone

On Mar 3, 2011, at 2:54 AM, Michael Wild <themiwi at gmail.com> wrote:

> On 03/03/2011 05:00 AM, Pablo Zurita wrote:
>> Thanks for the help guys. With that I was able to write the following
>> function that allows me to deal with my source as I want.
>> 
>>    # create_source_group(relativeSourcePath sourceGroupName files)
>>    #
>>    # Creates a source group with the specified name relative to the relative path
>>    # specified.
>>    #
>>    # Parameters:
>>    #    - sourceGroupName: Name of the source group to create.
>>    #    - relativeSourcePath: Relative path to the files.
>>    #    - sourceFiles: Files to add to the source group.
>>    #
>>    # For example if you have the following directory structure:
>>    #
>>    #    - ExampleApplication
>>    #        - include
>>    #            - Main.h
>>    #                - Window
>>    #                    Window.h
>>    #        - source
>>    #            - Main.cpp
>>    #                - Window
>>    #                    Window.cpp
>>    #
>>    # You can get your list of files and call create_source_group the following way
>>    #
>>    #    file(GLOB_RECURSE my_source_files ${CMAKE_CURRENT_SOURCE_DIR}/source/*)
>>    #    create_source_group("Source Files"
>> "${CMAKE_CURRENT_SOURCE_DIR}/source" ${my_source_files})
>>    #    file(GLOB_RECURSE my_header_files ${CMAKE_CURRENT_SOURCE_DIR}/include/*)
>>    #    create_source_group("Header Files"
>> "${CMAKE_CURRENT_SOURCE_DIR}/include" ${my_header_files})
>>    #    add_executable(ExampleApplication ${my_source_files} ${my_header_files})
>>    #
>>    # Then the generated solution would look like this
>>    #
>>    #    - ExampleApplication (project)
>>    #        - Header Files
>>    #            - Main.h
>>    #                - Window
>>    #                    Window.h
>>    #        - Source Files
>>    #            - Main.cpp
>>    #                - Window
>>    #                    Window.cpp
>>    #
>>    function(create_source_group sourceGroupName relativeSourcePath sourceFiles)
>>        FOREACH(currentSourceFile ${ARGN})
>>            FILE(RELATIVE_PATH folder ${relativeSourcePath} ${currentSourceFile})
>>            get_filename_component(filename ${folder} NAME)
>>            string(REPLACE ${filename} "" folder ${folder})
>>            if(NOT folder STREQUAL "")
>>                string(REGEX REPLACE "/+$" "" folderlast ${folder})
>>                string(REPLACE "/" "\\" folderlast ${folderlast})
>>                SOURCE_GROUP("${sourceGroupName}\\${folderlast}" FILES ${currentSourceFile})
>>            endif(NOT folder STREQUAL "")
>>        ENDFOREACH(currentSourceFile ${ARGN})
>>    endfunction(create_source_group)
>> 
>> 
>> Thanks,
>> Pablo Zurita.
>> 
>> On Wed, Mar 2, 2011 at 12:17 AM, Pablo Zurita <pzurita at gmail.com> wrote:
>>> Hello everybody,
>>> 
>>> I'm just getting started and I need some help dealing with strings in
>>> CMake. Basically what I have a bunch of strings such as the ones
>>> below:
>>> 
>>> "Main.cpp"
>>> "Window/Example/Example.cpp"
>>> "Window/Window.cpp"
>>> 
>>> What I need to do is create two strings for each, one is going to be
>>> the directory, so the output in order for the list above is:
>>> 
>>> ""
>>> "Window/Example"
>>> "Window"
>>> 
>>> And the other string I need is the file itself. So the output for that would be
>>> 
>>> "Main.cpp"
>>> "Example.cpp"
>>> "Window.cpp"
>>> 
>>> Since I'm processing each one by one it doesn't matter if there are collisions.
>>> 
>>> As you can see all I need to is find the first forward slash on the
>>> string reading from right to left, and then put what's on the left of
>>> that string on one variable, and what is to the right in another.
>>> 
>>> Does anybody know how I can do that?
>>> 
>>> Thanks,
>>> Pablo Zurita.
>>> 
> 
> 
> Using file(GLOB) or file(GLOB_RECURSE) to assemble a list of source
> files is usually a bad idea. If you add or remove a source file, you
> will have to re-run CMake manually. If you listed all sources
> explicitly, there would be no such problem, as the build system would
> notice that the CMakeLists.txt has been modified, and then re-run CMake.
> 
> Michael
> _______________________________________________
> 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


More information about the CMake mailing list