[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