Eric Noulard wrote:
2007/10/2, Dizzy <[EMAIL PROTECTED]>:
On Tuesday 02 October 2007 13:18:15 Shiqing Fan wrote:
And some thing about why I use it. The project has a complicated file
structure. Take the above structure as an example, both sub1 ans sub2
have source files for generating a library on top level.
And on
different platforms, not all the files are necessary. Yes, I could use
SET(SOURCE ${SOURCE} file1 file2....) with relative path, but if the we
have 4 or 5 levels of subdirectory, this is going to be a nightmare,
because we have to manage all the source files on top level for
different platforms.
But if the files are scattered randomly in various 4 level directories, some
files that may need to be used on a platforms, others than dont, then you
already have a nightmare and using SET() just shows the nightmare. Try to
describe in more detail your project structure and also the simplest solution
you can think of (even that it doesn't work directly with cmake like you
think of it).
Having several level of directories from which you don't want to
ADD_SUBDIRECTORY
reveals a probably flawed source setup.
However you may easily do the following:
in toplevel/CMakeLists.txt
SET(LIB_SOURCES "")
INCLUDE(sub1/source_definitions.cmake)
SET(LIB_SOURCES "${LIB_SOURCES} ${SUB1_SOURCES}"
INCLUDE(sub1/sub2/source_definitions.cmake)
SET(LIB_SOURCES "${LIB_SOURCES} ${SUB1_SUB2_SOURCES}"
etc...
ADD_LIBRARY(toplib ${LIB_SOURCES})
SUBx_SUBy_SOURCES var is defined in INCLUDE(source_definitions.cmake)
as you already figured out SOURCES should be specified with as
relative to toplevel ie. subx/suby/<filename>
Yes, this is what I'm currently using.
INCLUDE (sub1/CMakeLists.txt)
FOREACH (FILE ${SUB1_FILES})
SET (SOURCE_FILES ${SOURCE_FILES} sub1/${FILE})
ENDFOREACH (FILE)
The for-loop will add a relative path to each file in the subdirectory.
The problem is that I have to do it for each subdirectories on every
level except for the bottom level.
I think this would both clearer and fits your needs.
If you are not afraid of doing a bit of CMake MACRO
you should even be able to do MACROify with something like:
FILE(GLOB_RECURSE TOBE_INCLUDED "source_def*.cmake")
FOREACH(SUBFILE ${TOBE_INCLUDED})
GET_FILENAME_COMPONENT(DIRNAME ${SUBFILE} PATH)
INCLUDE(${SUBFILE})
/* find way to change DIRNAME=sub1/sub2/sub3 to
SOURCE_PREFIX SUB1_SUB2_SUB3_SOURCES */
SET(SOURCE ${SOURCE} ${${SOURCE_PREFIX}})
ENDFOREACH()
This is also a good choice, but too tricky for me at moment. I'll try to
make it work for me.
Thanks to all,
Shiqing
--
--------------------------------------------------------------
Shiqing Fan
http://www.hlrs.de/people/fan
High Performance Computing Tel.: +49 711 685 87234
Center Stuttgart (HLRS) Fax.: +49 711 685 65832
POSTAL:Nobelstrasse 19 email: [EMAIL PROTECTED]
ACTUAL:Allmandring 30
70569 Stuttgart
_______________________________________________
CMake mailing list
[email protected]
http://www.cmake.org/mailman/listinfo/cmake