Lets assume for a second that your layout is something like:

Project
  src
   -sub1
     --CMakeLists.txt
     --sub1.cpp
     --sub1.ui
   -sub2
     --CMakeLists.txt
     --sub2.cpp

What you would want quite possible is a top level CMakeLists.txt file Like this:

PROJECT (MyGreatProject)

SET (LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/Bin" CACHE INTERNAL "For libraries.") SET (EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}/Bin" CACHE INTERNAL "For executables.")

#--- All the generated .h and .cpp files end up in $ {CMAKE_CURRENT_BINARY_DIR}
#---  so include that directory.
INCLUDE_DIRECTORIES(  "${CMAKE_CURRENT_BINARY_DIR}" )

ADD_SUBDIRECTORY( src/sub1)
ADD_SUBDIRECTORY( src/sub2)

#--- End CMakeLists.txt file

The above _should_ work although I just did it from memory.

Mike Jackson

On Feb 17, 2008, at 10:36 AM, blinkeye wrote:

Hi guys

I'm in the process of replacing Makefiles from two large projects with CMake files. So far it's working great, but now I hit a wall:

I need to generate .cpp and .h files from input files (analogue to the .ui files of Qt).

Bill Hofmann wrote the following QT4_WRAP_UI macro:

MACRO (QT4_WRAP_UI outfiles )
        FOREACH (it ${ARGN})
                GET_FILENAME_COMPONENT(outfile ${it} NAME_WE)
                GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)
                SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h)
                ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
                COMMAND ${QT_UIC_EXECUTABLE}
                ARGS -o ${outfile} ${infile}
                MAIN_DEPENDENCY ${infile})
                SET(${outfiles} ${${outfiles}} ${outfile})
        ENDFOREACH (it)
ENDMACRO (QT4_WRAP_UI)

I'm using just a slightly adapted form of this macro. The problem is that our project includes the generated header files from different subdirectories and I can't figure out on how to include them.

Imagine the following project layout:

src
-sub1
--CMakeLists.txt
--sub1.cpp
--sub1.ui
-sub2
--CMakeLists.txt
--sub2.cpp

${QT_UIC_EXECUTABLE} will read sub1.ui and generate a file like "ui_sub1.h". sub1.cpp and sub2.cpp both include the file "ui_sub1.h". While above macro works for sub1 it doesn't work for sub2:

make
[ 20%] Generating ui_sub1.h
[ 40%] Generating moc_sub1.cxx
Scanning dependencies of target sub1
[ 60%] Building CXX object src/sub1/CMakeFiles/sub1.dir/sub1.o
[ 80%] Building CXX object src/sub1/CMakeFiles/sub1.dir/moc_sub1.o
Linking CXX executable sub1
[ 80%] Built target sub1
Scanning dependencies of target sub2
[100%] Building CXX object src/sub2/CMakeFiles/sub2.dir/sub2.o
/home/cerberos/Desktop/mutacts/dan/src/sub2/sub2.cpp:4:21: error: ui_sub1.h: No such file or directory
make[2]: *** [src/sub2/CMakeFiles/sub2.dir/sub2.o] Error 1
make[1]: *** [src/sub2/CMakeFiles/sub2.dir/all] Error 2
make: *** [all] Error 2

I tried for hours but I can't figure out a proper (or at least working) way on how to achieve that. Changing above macro to include the path of the generated header files doesn't seem to make a difference:

MACRO (QT4_WRAP_UI_CUSTOM outfiles )
   FOREACH (it ${ARGN})
      GET_FILENAME_COMPONENT(outfile ${it} NAME_WE)
      GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)
      SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h)
      include_directories( ${CMAKE_CURRENT_BINARY_DIR} )
      ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
      COMMAND ${QT_UIC_EXECUTABLE}
      ARGS -o ${outfile} ${infile}
      MAIN_DEPENDENCY ${infile})
      SET(${outfiles} ${${outfiles}} ${outfile})
   ENDFOREACH (it)
ENDMACRO (QT4_WRAP_UI_CUSTOM)

For some reason the included directory is lost in sub2 again (btw: is there a way to log the currently included directories besides analysing the make output?).

I've attached above mentioned mini project.

Thanks for any help.



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

--
Mike Jackson   Senior Research Engineer
Innovative Management & Technology Services


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

Reply via email to