On Nov 27, 2008, at 1:12 AM, Robert Dailey wrote:

On Wed, Nov 26, 2008 at 7:27 PM, Bill Hoffman <[EMAIL PROTECTED] > wrote:
Robert Dailey wrote:
Hi,

I have about 20 directories that contain source files. However, the FILE() call I make to each directory will have a different glob expression. I need to be able to do FILE( GLOB ..... ) about 20 times and each time have it append to the existing variable I give it. Is this possible? What would be the recommended way of accumulating a list of files in all 20 directories?


find . -name "*.c" > source_files.txt
edit source_files.txt and put that list of files exiplicitly into a CMakeLists.txt file.

file(GLOB is a bad way to get source lists for CMake. CMake has no way of knowing when new files have been put in the directory.

But unless I am missing a fundamental feature somewhere, GLOB still seems to be the better alternative. While it may not intrinsically know when new files have appeared on the filesystem, the programmer can simply re-run the CMake command to get an updated project with the newly added source files without editing the CMakeLists.txt file directly. This is better than the alternative, which is a hard-coded list of project files in the CMake script.

I'll pull from my experience in the last few projects I have worked on and agree with Bill on this one. There is more up front work but the pay off in the end are more predictable results when you build your project.

And to take this one step further if you hard code the files into your cmake files then you can also "act" on those lists to make your Visual Studio projects have a better structure.

For example in my project in each sub folder I have a "Sources.cmake" file. This file is included from the higher up CMakeLists.txt file (sometimes conditionally based on options). During the inclusion process I call a macro that also sets installation properties of the files (headers get installed) and also set up source groups for the files so that the Visual Studio and Xcode projects are more organized that just having a single "folder" with all the files and headers mixed in.

EXAMPLE========== Common_SourceList.cmake  ========
SET (MXA_COMMON_SRCS
  ${MXA_SOURCE_DIR}/src/Common/IO/Reader64.cpp
  ${MXA_SOURCE_DIR}/src/Common/IO/Writer64.cpp
)
SET (MXA_COMMON_HEADERS
  ${MXA_SOURCE_DIR}/src/Common/LogTime.h
  ${MXA_SOURCE_DIR}/src/Common/DLLExport.h
  ${MXA_SOURCE_DIR}/src/Common/MXAEndian.h
  ${MXA_SOURCE_DIR}/src/Common/MXATypeDefs.h
  ${MXA_SOURCE_DIR}/src/Common/MXATypes.h
  ${MXA_SOURCE_DIR}/src/Common/MXAErrorDefinitions.h
  ${MXA_SOURCE_DIR}/src/Common/IO/Reader64.h
  ${MXA_SOURCE_DIR}/src/Common/IO/Writer64.h
  ${MXA_SOURCE_DIR}/src/Common/Cast/Cast.h
)

MXA_SOURCE_PROPERTIES(Common "${MXA_COMMON_HEADERS}" "$ {MXA_COMMON_SRCS}")

========== =======================

MACRO (MXA_SOURCE_PROPERTIES NAME HEADERS SOURCES)

  INSTALL (FILES ${HEADERS}
            DESTINATION include/MXADataModel/${NAME}
            COMPONENT Headers
  )
  source_group(src\\${NAME} FILES ${HEADERS} ${SOURCES})

#-- The following is needed if we ever start to use OS X
#-- Frameworks but only works on CMake 2.6 and greater
#  set_property(SOURCE ${HEADERS}
#   PROPERTY MACOSX_PACKAGE_LOCATION Headers/${NAME}
#  )

ENDMACRO (MXA_SOURCE_PROPERTIES NAME HEADERS SOURCES)


As Bill stated above, a simple one-off shell script could probably be
created pretty fast to generate those "SourceList.cmake" files.

Just my experience.
_________________________________________________________
Mike Jackson                  [EMAIL PROTECTED]
            www.bluequartz.net

_______________________________________________
CMake mailing list
[email protected]
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to