[CMake] how to replace text in generated files

Alexander Neundorf a.neundorf-work at gmx.net
Sun Mar 20 16:52:46 EST 2005


Hi, 
 
while trying to build kde stuff I came across this rule: 
 
 echo '#include <kdialog.h>' > snippetsettingsbase.cpp 
 echo '#include <klocale.h>' >> snippetsettingsbase.cpp 
 uic -tr tr2i18n -i snippetsettingsbase.h  snippetsettingsbase.ui > 
snippetsettingsbase.cpp.temp ; ret=$$?; \ 
	$(PERL) -pe "s,tr2i18n( \"\" ),QString::null,g" 
snippetsettingsbase.cpp.temp | $(PERL) -pe "s,tr2i18n( \"\"\, 
\"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9]
[0-9]*)_data,img\$$1_snippetsettingsbase,g" | $(PERL) -pe "s,: 
QWizard\(,: KWizard(,g" >> snippetsettingsbase.cpp ;\ 
	rm -f snippetsettingsbase.cpp.temp ;\ 
	if test "$$ret" = 0; then echo '#include 
"snippetsettingsbase.moc"' >> snippetsettingsbase.cpp; else rm -f 
snippetsettingsbase.cpp ; exit $$ret ; fi 
 
So in short, this rule creates a text file containing two includes, then 
runs a command (uic) which output is appended to this file, and then runs 
perl several times to replace stuff. 
 
How can I do this (if possible portable) with cmake ? 
I have the following: 
 
MACRO(KDE_ADD_UI_FILES _sources ) 
   FOREACH (_current_FILE ${ARGN}) 
      GET_FILENAME_COMPONENT(_basename ${_current_FILE} NAME_WE) 
      SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h) 
      SET(_src ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp) 
      SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc.cpp) 
	   
      ADD_CUSTOM_COMMAND(OUTPUT ${_header} 
         COMMAND uic 
         ARGS  -nounload -o ${_header} 
         ${CMAKE_CURRENT_SOURCE_DIR}/${_current_FILE} 
         DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_current_FILE} 
      )                 
      ADD_CUSTOM_COMMAND(OUTPUT ${_src} 
         COMMAND uic 
         ARGS -nounload -tr tr2i18n -o ${_src} -impl ${_header}  
         ${CMAKE_CURRENT_SOURCE_DIR}/${_current_FILE}  
         DEPENDS ${_header} 
      )                 
      ADD_CUSTOM_COMMAND(OUTPUT ${_moc} 
         COMMAND moc 
         ARGS ${_header} -o ${_moc} 
         DEPENDS ${_header} 
      )                 
      SET(${_sources} ${${_sources}} ${_src} ${_moc} ) 
   ENDFOREACH (_current_FILE) 
ENDMACRO(KDE_ADD_UI_FILES) 
 
Now I could do FILE(READ ...) and then STRING(REGEX REPLACE ...) or 
something like this, but this would be executed during the cmake run, not 
during the build phase. Any ideas ? How about adding such functionality 
to "cmake -E " ?  
I.e. cmake -E file1 existing_file file_which_will_be_appended_to_file1 
and cmake -E sed  <some regexp stuff> 
or more general 
cmake -E <execute_some_cmake_stuff> 
(not exactly sure how to do this, but the idea would be to have cmake 
execute some part of the CMakeLists.txt during the build phase so that 
any cmake functions would be available also during the build phase). 
 
Bye 
Alex 
 

-- 
DSL Komplett von GMX +++ Supergünstig und stressfrei einsteigen!
AKTION "Kein Einrichtungspreis" nutzen: http://www.gmx.net/de/go/dsl


More information about the CMake mailing list