Warning, /sdk/kde-dev-scripts/cmake-utils/scripts/gencmake is written in an unsupported language. File is not indexed.
0001 #!/usr/bin/ruby
0002
0003 #############################################################################
0004 # Copyright (C) 2005, 2006 by Tobias Hunger
0005 # tobias.hunger@basyskom.de
0006 #
0007 # This program is free software; you can redistribute it and/or modify
0008 # it under the terms of the GNU General Public License as published by
0009 # the Free Software Foundation; either version 2 of the License, or
0010 # (at your option) any later version.
0011 #
0012 # This program is distributed in the hope that it will be useful,
0013 # but WITHOUT ANY WARRANTY; without even the implied warranty of
0014 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0015 # GNU General Public License for more details.
0016 #
0017 # You should have received a copy of the GNU General Public License
0018 # along with this program; if not, write to the
0019 # Free Software Foundation, Inc.,
0020 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
0021 #############################################################################
0022
0023 # This script is supposed to build a skeleton cmake configuration file for
0024 # the sources and header files found in the current directory.
0025 #
0026 # It is insprired by "qmake -project" and works with the same limitations.
0027
0028 require 'fileutils'
0029
0030 class Project
0031 def initialize()
0032 @pwd = FileUtils.pwd();
0033 @projectName = File.basename(@pwd)
0034 @sources = []
0035 @headers = []
0036 @uis = []
0037 @kcfgs = []
0038 @configs = []
0039
0040 @got_main = false
0041 @got_cmakelist = false
0042 @got_qt = false
0043 @got_kde = false
0044 end
0045
0046 def addHeader(header)
0047 @headers.push(header) unless @headers.include?(header)
0048 end
0049
0050 def haveHeaders?
0051 ! @headers.empty?
0052 end
0053
0054 def addSource(source)
0055 @sources.push(source) unless @sources.include?(source)
0056 end
0057
0058 def haveSources?
0059 ! @sources.empty?
0060 end
0061
0062 def addUi(ui)
0063 @got_qt = true
0064 @uis.push(ui) unless @uis.include?(ui)
0065 end
0066
0067 def haveUis?
0068 ! @uis.empty?
0069 end
0070
0071 def addKcfg(kcfg)
0072 @got_kde = true
0073 @kcfgs.push(kcfg) unless @kcfgs.include?(kcfg)
0074 end
0075
0076 def haveKcfgs?
0077 ! @kcfgs.empty?
0078 end
0079
0080 def addConfig(config)
0081 @configs.push(config) unless @configs.include?(config)
0082 end
0083
0084 def haveConfigs?
0085 ! @configs.empty?
0086 end
0087
0088 attr_reader :pwd, :projectName, :headers, :sources, :uis, :kcfgs, :configs,
0089 :got_main, :got_cmakelist, :got_qt, :got_kde
0090 attr_writer :pwd, :projectName, :got_main, :got_cmakelist, :got_qt, :got_kde
0091 end
0092
0093 class Scanner
0094 def initialize(project)
0095 @project = project
0096 end
0097
0098 def findFiles()
0099 Dir.entries(@project.pwd).each do |file|
0100 @project.got_cmakelist = true if /^CMakeLists.txt$/.match(File.basename(file))
0101 @project.addHeader(file) if /(.h|.hh|.H|.hpp|.hxx)$/.match(File.basename(file))
0102 @project.addSource(file) if /(.c|.cc|.C|.cpp|.cxx)$/.match(File.basename(file))
0103 @project.addUi(file) if /(.ui)$/.match(File.basename(file))
0104 @project.addKcfg(file) if /(.kcfgc)$/.match(File.basename(file))
0105 @project.addConfig(file) if /(.in)$/.match(File.basename(file))
0106 end
0107 end
0108
0109 def scanFile(file)
0110 last_line = "";
0111 File.foreach(file) do |line|
0112 # empty lines:
0113 next if /^\s*$/.match(line)
0114
0115 # scan for includes
0116 if /^\s*#\s*include\s*[<"](.*)[>"]\s*$/.match(line)
0117 @project.got_qt = true if /^Q(Debug|List|String|Hash|Application)$/.match($1)
0118 @project.got_kde = true if /^k(debug|kio\/|application)$/.match($1)
0119 end
0120
0121 # do we have a main function?
0122 @project.got_main = true if /^(void|int|)\s*main\s*/.match(line)
0123 end
0124 end
0125
0126 def scanFiles()
0127 @project.headers.each { |i| scanFile(i); }
0128 @project.sources.each { |i| scanFile(i); }
0129 end
0130 end
0131
0132 class Generator
0133 def initialize(project)
0134 @project = project
0135 @install_location = ""
0136 @target_type = "executable"
0137 @target_type = "library" unless @project.got_main
0138 @prefix = "#{@project.projectName}_#{@target_type}"
0139 end
0140
0141 def header()
0142 "# ########## Project setup ##########\n" +
0143 "PROJECT(#{@project.projectName})\n" +
0144 "CMAKE_MINIMUM_REQUIRED(VERSION 2.4.5)\n\n"
0145 end
0146
0147 def setup()
0148 "# ######### General setup ##########\n" +
0149 "INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR})\n\n"
0150 end
0151
0152 def files()
0153 output = "# ########## #{@project.projectName} #{@target_type} ##########\n" +
0154 "# Sources:\n" +
0155 "SET(#{@prefix}_SRCS\n"
0156 @project.sources.each { |i| output+= " #{i}\n" }
0157 output += ")\n\n" +
0158 "# Headers:\n" +
0159 "SET(#{@prefix}_HDRS\n"
0160 @project.headers.each { |i| output += " #{i}\n" }
0161 output += ")\n\n"
0162 output
0163 end
0164
0165 def specials()
0166 ""
0167 end
0168
0169 def configfiles()
0170 output = ""
0171 @project.configs.each do |i|
0172 output += "CONFIGURE_FILE(#{i} ${CMAKE_BINARY_DIR}/#{i[0..-4]})\n"
0173 end
0174 output += "\n" unless output == ""
0175 return output
0176 end
0177
0178 def target()
0179 output = "# actual target:\n"
0180 if @project.got_main
0181 @install_location = "bin"
0182 output += "ADD_EXECUTABLE(#{@project.projectName} ${#{@prefix}_SRCS})\n"
0183 else
0184 @install_location = "lib"
0185 output += "ADD_LIBRARY(#{@project.projectName} ${#{@prefix}}_SCRS ${#{@prefix}_HDRS})\n" +
0186 "SET_TARGET_PROPERTIES(#{@project.projectName} PROPERTIES VERSION 0.0.0)\n"
0187 end
0188 return output
0189 end
0190
0191 def libraries()
0192 ""
0193 end
0194
0195 def install()
0196 "# add install target:\n" +
0197 "INSTALL(TARGETS #{@project.projectName} DESTINATION #{@install_location})"
0198 end
0199
0200 def generate()
0201 File.open("CMakeLists.txt", "w") do |file|
0202 file.puts header
0203 file.puts setup
0204
0205 file.puts files
0206 file.puts configfiles
0207 file.puts specials
0208
0209 file.puts target
0210 file.puts libraries
0211 file.puts install
0212 end
0213 end
0214 end
0215
0216
0217 class QtGenerator < Generator
0218 def initialize(project)
0219 super(project)
0220 end
0221
0222 def setup
0223 "# ########## Qt4 setup ##########\n" +
0224 "FIND_PACKAGE(Qt4 REQUIRED)\n" +
0225 "INCLUDE(${QT_USE_FILE})\n" +
0226 "INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR} ${QT_INCLUDES})\n\n"
0227 end
0228
0229 def files()
0230 output = super
0231 if @project.haveUis?
0232 output += "# UI files:\n" +
0233 "SET(#{@prefix}_UIS\n"
0234 @project.uis.each { |i| output += " #{i}\n" }
0235 output += ")\n\n"
0236 end
0237 output
0238 end
0239
0240 def specials()
0241 "# scan files and run moc on all that need it:\n" +
0242 "QT4_AUTOMOC(${#{@prefix}_SRCS})\n\n"
0243 end
0244
0245 def libraries()
0246 "TARGET_LINK_LIBRARIES(#{@project.projectName} ${QT_LIBRARIES})\n\n"
0247 end
0248 end
0249
0250 class KDEGenerator < QtGenerator
0251 def initialize(project)
0252 super(project)
0253 end
0254
0255 def setup
0256 "# ########## KDE4 setup ##########\n" +
0257 "FIND_PACKAGE(KDE4 REQUIRED)\n" +
0258 "INCLUDE(KDE4Defaults)\n" +
0259 "INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES})\n\n"
0260 end
0261
0262 def files()
0263 output = super()
0264 if @project.haveKcfgs?
0265 output += "# KCFG files:\n" +
0266 "SET(#{@prefix}_KCFGS\n"
0267 @project.kcfgs.each { |i| output += " #{i}\n" }
0268 output += ")\n\n"
0269 end
0270 output
0271 end
0272
0273 def specials()
0274 output = "# Special code for KDE4:\n"
0275 output += "# " unless @project.haveUis?
0276 output += "KDE4_ADD_UI_FILES(${#{@prefix}_SRCS} ${#{@prefix}_UIS})\n"
0277 output += "# " unless @project.haveKcfgs?
0278 output += "KDE4_ADD_KCFG_FILES(${#{@prefix}_SRCS} ${#{@prefix}_KCFGS})\n\n"
0279 end
0280
0281 def target()
0282 "# actual target:\n" +
0283 "KDE4_ADD_EXECUTABLE(#{@project.projectName} ${#{@prefix}_SRCS} ${#{@qprefix}_HDRS})\n"
0284 end
0285
0286 def libraries()
0287 "TARGET_LINK_LIBRARIES(#{@project.projectName} ${KDE4_KDEUI_LIBS})\n\n"
0288 end
0289
0290 def install()
0291 "# add install target:\n" +
0292 "INSTALL(TARGETS #{@project.projectName} DESTINATION ${BIN_INSTALL_DIR})"
0293 end
0294
0295 end
0296
0297
0298 my_project = Project.new
0299 my_scanner = Scanner.new(my_project)
0300
0301 my_scanner.findFiles()
0302
0303 my_scanner.scanFiles()
0304
0305 if my_project.got_kde
0306 my_generator = KDEGenerator.new(my_project)
0307 elsif my_project.got_qt
0308 my_generator = QtGenerator.new(my_project)
0309 else
0310 my_generator = Generator.new(my_project)
0311 end
0312 my_generator.generate