aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Neundorf <neundorf@kde.org>2006-01-06 20:36:22 +0000
committerAlexander Neundorf <neundorf@kde.org>2006-01-06 20:36:22 +0000
commitba732a732a6036c9c11c6635f574c199c6dfbab7 (patch)
tree9d196f4da3c14f14fe37ef997b2290081051dc1f
parentbc04413334c6bb810f4989c455faf8945fce99f7 (diff)
downloadextra-cmake-modules-ba732a732a6036c9c11c6635f574c199c6dfbab7.tar.gz
extra-cmake-modules-ba732a732a6036c9c11c6635f574c199c6dfbab7.tar.bz2
-added the am2cmake script, which converts Makefile.am's to CMakeLists.txt
Alex svn path=/trunk/KDE/kdesdk/cmake/; revision=495019
-rw-r--r--kde3/README5
-rwxr-xr-xkde3/am2cmake593
2 files changed, 598 insertions, 0 deletions
diff --git a/kde3/README b/kde3/README
index 06cf9268..868d364e 100644
--- a/kde3/README
+++ b/kde3/README
@@ -13,5 +13,10 @@ basically one target, the install target.
So run "make install" as root and then you are ready to use cmake for
building KDE 3 applications.
+You can run the (Ruby) script am2cmake to automatically convert
+KDE Makefile.am's to CMakeLists.txt for cmake. Starting from the
+current directory it will convert all Makefile.am's in the subdirectories
+to cmake.
+
Alexander Neundorf, 2006
neundorf@kde.org
diff --git a/kde3/am2cmake b/kde3/am2cmake
new file mode 100755
index 00000000..219f509a
--- /dev/null
+++ b/kde3/am2cmake
@@ -0,0 +1,593 @@
+#!/usr/bin/env ruby
+
+$no_kde=false
+
+class InstallTarget
+ def initialize
+ @files=""
+ @location=""
+ end
+ def addFiles(files)
+ @files=@files+files
+ end
+ def setLocation(location)
+ @location=location
+ end
+ attr_reader :location, :files
+end
+
+NoTarget = 0
+Executable = 1
+StaticLib = 2
+SharedLib = 3
+Part = 4
+KDEInit = 5
+
+class BuildTarget
+ def initialize(name, type, withStdPrefix=true, install=true, test=false)
+ @name=name
+ @type=type
+ @sources=Array.new
+ @uis=Array.new
+ @skels=Array.new
+ @stubs=Array.new
+ @kcfgs=Array.new
+ @am=Array.new
+ @stdPrefix=withStdPrefix
+ @install=install
+ @test=test
+ @libs=Array.new
+
+ @libs.push("${QT_AND_KDECORE_LIBS}")
+ end
+
+ def addSourceFiles(files)
+ files.split.each do |currentSource|
+ if currentSource =~ /^\S+\.ui$/
+ @uis.push(currentSource)
+ elsif currentSource =~ /^(\S+)\.skel$/
+ @skels.push($1+".h")
+ elsif currentSource =~ /^(\S+)\.stub$/
+ @stubs.push($1+".h")
+ elsif currentSource =~ /^(\S+)\.kcfgc$/
+ @kcfgs.push(currentSource)
+ else
+ @sources.push(currentSource)
+ end
+ end
+ end
+
+ def addLibs(libs)
+ lib=""
+ libs.split.each do |currentLib|
+ lib=case currentLib
+ when "$(LIB_KDEUI)" then "kdeui"
+# when "${LIB_KDECORE}" then "${QT_AND_KDECORE_LIBS}"
+ when "$(LIB_KIO)" then "kio"
+ when "$(LIB_KDEPRINT)" then "kdeprint"
+ when "$(LIB_KPARTS)" then "kparts"
+ else
+ if currentLib =~ /^-l(\S+)$/
+ $1
+ else
+ ""
+ end
+ end
+ end
+
+ if !lib.empty?
+ @libs.push(lib)
+# printf("--- lib: #{lib}\n")
+ end
+ end
+
+
+ attr_reader :name, :type, :sources, :uis, :skels, :stdPrefix, :stubs, :kcfgs, :install, :test, :libs
+
+end
+
+class CMakeFile
+ def initialize(amFile)
+ printf("converting #{amFile}\n")
+ @amFile=amFile
+ amFile =~ /(.*)Makefile.am/
+ @path=$1
+ @listsFile=@path+"CMakeLists.txt"
+ @iconDir="hicolor"
+ @installIcons=false
+
+ @targets=Array.new
+ @installs=Hash.new
+
+ @includeDirs=Array.new
+ @subDirs=Array.new
+ @skippedSubDirs=Array.new
+
+ parseFile
+
+ if $no_kde==false
+ @includeDirs.push("${KDE3_INCLUDE_DIR}")
+ @includeDirs.push("${QT_INCLUDE_DIR}")
+ end
+ @includeDirs.push("${CMAKE_CURRENT_SOURCE_DIR}")
+ @includeDirs.push("${CMAKE_CURRENT_BINARY_DIR}")
+ end
+
+ def parseFile
+ @lines=IO.readlines(@amFile)
+ cummLine=""
+ appendNextLine=false
+ for line in @lines do
+ if line.include?("#")
+ line=line[0, line.index("#")]
+ end
+ if line.length<2
+ next
+ end
+
+ appendNextLine=(line[line.length-2, 1]=='\\')
+
+ if appendNextLine
+ cummLine+=" "+line[0, line.length-2]
+ else
+ cummLine+=" "+line.chomp #[0, line.length-1]
+ if not cummLine.empty?
+ evalLine(cummLine)
+ cummLine=""
+ end
+ end
+ end
+ end
+
+ def findTarget(line)
+ type=SharedLib
+ if line =~ /^\s*lib(\S+)_la_\S+\s*=\s*\S+.*$/
+ targetName=$1
+# type=SharedLib
+ elsif line =~ /^\s*(\S+)_la_\S+\s*=\s*\S+.*$/
+ targetName=$1
+# type=Executable
+ elsif line =~ /^\s*(\S+)_\S+\s*=\s*\S+.*$/
+ targetName=$1
+# type=Executable
+ end
+ @targets.each do |buildTarget|
+ amBuildTargetName=buildTarget.name.gsub(/\./, "_")
+ if (amBuildTargetName==targetName)
+ return buildTarget
+ end
+ end
+
+ return BuildTarget.new("Dummy", NoTarget)
+ end
+
+ def addTarget(line)
+ type=NoTarget
+ targets=""
+ installTarget=true
+ testTarget=false
+
+ if line =~ /^\s*lib_LTLIBRARIES\s*=\s*(\S+.*)/
+ targets=$1
+ type=SharedLib
+# printf("shared: %s\n", $1)
+ elsif line =~ /^\s*noinst_LTLIBRARIES\s*=\s*(\S+.*)/
+ targets=$1
+ type=StaticLib
+# printf("static: %s\n", $1)
+ elsif line =~ /^\s*kde_module_LTLIBRARIES\s*=\s*(\S+.*)/
+# printf("part: %s\n", $1)
+ targets=$1
+ type=Part
+ elsif line =~ /^\s*kde_style_LTLIBRARIES\s*=\s*(\S+.*)/
+# printf("style: %s\n", $1)
+ targets=$1
+ type=Part
+ elsif line =~ /^\s*kde_widget_LTLIBRARIES\s*=\s*(\S+.*)/
+# printf("style: %s\n", $1)
+ targets=$1
+ type=Part
+ elsif line =~ /^\s*kdeinit_LTLIBRARIES\s*=\s*(\S+.*)/
+# printf("kdeinitpart: %s\n", $1)
+ targets=$1
+ type=KDEInit
+ elsif line =~ /^\s*bin_PROGRAMS\s*=\s*(\S+.*)$/
+ targets=$1
+# printf("exec: %s\n", $1)
+ type=Executable
+ elsif line =~ /^\s*noinst_PROGRAMS\s*=\s*(\S+.*)$/
+ targets=$1
+ installTarget=false
+# printf("exec: %s\n", $1)
+ type=Executable
+ elsif line =~ /^\s*check_PROGRAMS\s*=\s*(\S+.*)$/
+ targets=$1
+ installTarget=false
+ testTarget=true
+
+# printf("exec: %s\n", $1)
+ type=Executable
+ elsif line =~ /^\s*EXTRA_PROGRAMS\s*=\s*(\S+.*)$/
+ targets=$1
+ installTarget=false
+ testTarget=true
+# printf("exec: %s\n", $1)
+ type=Executable
+ else
+ return false
+ end
+
+ if type==Executable
+ targets.split.each{ |current| @targets.push(BuildTarget.new(current, type, true, installTarget, testTarget)) }
+ else
+ targets.split.each do |current|
+ if current =~ /lib(\S+)\.la/
+# printf("adding target with \"lib\": -%s-\n", $1)
+ @targets.push(BuildTarget.new($1, type))
+ else
+ if current =~ /\s*(\S+)\.la/
+# printf("adding target without \"lib\": -%s-\n", $1)
+ @targets.push(BuildTarget.new($1, type, false))
+ end
+ end
+ end
+ end
+ return true
+ end
+
+ def addSourcesToTarget(line)
+# printf("sources: %s\n", line)
+ buildTarget=findTarget(line)
+ if buildTarget.type==NoTarget
+ printf("PROBLEM: target not found: %s\n", line)
+ return
+ end
+
+ line =~ /^\s*(lib)?\S+(_la)?_SOURCES\s*=\s*(\S+.*)$/
+ buildTarget.addSourceFiles($3)
+ end
+
+ def addIncludeDirectories(includeDirs)
+ includeDirs.split.each do |dir|
+ if dir =~ /^\s*-I\$\(top_srcdir\)(\S+)/
+ @includeDirs.push("${CMAKE_SOURCE_DIR}"+$1)
+ end
+ end
+ end
+
+ def addInstallFiles(key, files)
+ if @installs.has_key?(key)
+ inst=@installs[key]
+ else
+ inst=InstallTarget.new
+ end
+ inst.addFiles(files)
+ case key
+ when "kde_services" then inst.setLocation("/share/services")
+ when "xdg_apps" then inst.setLocation("/share/applications/kde")
+ end
+
+ @installs[key]=inst
+ end
+
+ def addInstallLocation(key, location)
+# printf("adding loc: %s \n", location)
+ if @installs.has_key?(key)
+ inst=@installs[key]
+ else
+ inst=InstallTarget.new
+ end
+
+ if location =~ /\$\((\S+)\)(\/?\S*)/
+ baseDir=$1
+ subDir=$2
+# printf("base: %s sub: %s\n", baseDir, subDir)
+ if baseDir=="kde_servicesdir"
+ inst.setLocation("/share/services"+subDir)
+ @installs[key]=inst
+ elsif baseDir=="kde_servicetypesdir"
+ inst.setLocation("/share/servicetypes"+subDir)
+ @installs[key]=inst
+ elsif baseDir=="kde_mimedir"
+ inst.setLocation("/share/mimelink"+subDir)
+ @installs[key]=inst
+ elsif baseDir=="kde_htmldir"
+ inst.setLocation("/share/doc/HTML"+subDir)
+ @installs[key]=inst
+ elsif baseDir=="kde_icondir"
+ inst.setLocation("/share/icons"+subDir)
+ @installs[key]=inst
+ @iconDir=key
+ elsif baseDir=="kde_datadir"
+ inst.setLocation("/share/apps"+subDir)
+ @installs[key]=inst
+ elsif baseDir=="datadir"
+ inst.setLocation("/share"+subDir)
+ @installs[key]=inst
+ end
+ end
+ end
+
+ def evalLine(line)
+ if line =~ /^\s*METASOURCES\s*=\s*AUTO\s*$/
+ @automoc=true
+ return
+ end
+
+ if addTarget(line)
+ return
+ end
+
+ if line =~ /^\s*KDE_ICON\s*=/
+ @installIcons=true
+ return
+ end
+
+ if (line =~ /^\s*\S+_SOURCES\s*=/)
+ addSourcesToTarget(line)
+ return
+ end
+
+ if (line =~ /^\s*(\S+)_LDFLAGS\s*=\s*(\S+.*)$/) ||
+ (line =~ /^\s*(\S+)_LIBADD\s*=\s*(\S+.*)$/) ||
+ (line =~ /^\s*(\S+)_LDADD\s*=\s*(\S+.*)$/)
+
+ if $1 != "AM"
+ buildTarget=findTarget(line)
+ if buildTarget.type==NoTarget
+ printf("PROBLEM: target %s not found: %s\n", $1, line)
+ return
+ end
+
+# printf("target: #{buildTarget.name} lib: #{$2} line: #{line} d1: #{$1}\n")
+ buildTarget.addLibs($2)
+ end
+ return
+ end
+
+ if (line =~ /^\s*INCLUDES\s*=\s*(\S+.*)$/)
+ addIncludeDirectories($1)
+ return
+ end
+
+ if line =~ /^\s*(\S+)dir\s*=\s*(\S+.*)$/
+ addInstallLocation($1, $2)
+ return
+ end
+ if line =~ /^\s*(\S+)_DATA\s*=\s*(\S+.*)$/
+ addInstallFiles($1, $2)
+ return
+ end
+
+ if line =~ /^\s*SUBDIRS\s*=\s*(\S+.*)$/
+ ($1).split.each do |dir|
+ if dir =~ /\$\(.+\)/
+ @skippedSubDirs.push(dir)
+ else
+ @subDirs.push(dir) if dir!="."
+ end
+ end
+ end
+
+ end
+
+ def createListsFile
+# prevLines=Array.new
+# if FileTest.exists?(@listsFile)
+## printf("file exists: %s\n", @listsFile)
+# prevLines=File.new(@listsFile, "r").readlines
+# end
+
+ file=File.new(@listsFile, "w+");
+ if @amFile=="Makefile.am" && $no_kde==false # the toplevel Makefile.am
+ file.printf("FIND_PACKAGE(KDE3 REQUIRED)\n\n")
+ file.printf("SET(CMAKE_VERBOSE_MAKEFILE ON)\n\n")
+ file.printf("ADD_DEFINITIONS(${QT_DEFINITIONS} ${KDE3_DEFINITIONS})\n\n")
+ file.printf("LINK_DIRECTORIES(${KDE3_LIB_DIR})\n\n")
+
+ end
+
+ if not @subDirs.empty?
+ @subDirs.each{ |dir| file.printf("ADD_SUBDIRECTORY( %s ) \n", dir)}
+ file.printf("\n")
+ end
+ if not @skippedSubDirs.empty?
+ @skippedSubDirs.each{ |dir| file.printf("MESSAGE(STATUS \"${CMAKE_CURRENT_SOURCE_DIR}: skipped subdir %s\")\n", dir)}
+ end
+
+
+ if not @includeDirs.empty?
+ file.printf("INCLUDE_DIRECTORIES( ")
+ @includeDirs.each{ |dir| file.printf("%s ", dir) }
+ file.printf(" )\n\n")
+ end
+ @targets.each do |buildTarget|
+ file.printf("\n########### next target ###############\n\n")
+# printf("target name: %s\n", buildTarget.name)
+
+ if buildTarget.type==SharedLib
+ srcsName=buildTarget.name+"_LIB_SRCS"
+ elsif buildTarget.type==StaticLib
+ srcsName=buildTarget.name+"_STAT_SRCS"
+ elsif buildTarget.type==Part
+ srcsName=buildTarget.name+"_PART_SRCS"
+ elsif buildTarget.type==KDEInit
+ srcsName=buildTarget.name+"_KDEINIT_SRCS"
+ else
+ srcsName=buildTarget.name+"_SRCS"
+ end
+ uisName=buildTarget.name+"_UI"
+ skelsName=buildTarget.name+"_DCOP_SKEL_SRCS"
+ stubsName=buildTarget.name+"_DCOP_STUB_SRCS"
+ kcfgsName=buildTarget.name+"_KCFG_SRCS"
+
+ if buildTarget.sources.empty?
+ buildTarget.sources.push("dummy.cpp")
+ end
+
+ if not buildTarget.sources.empty?
+ file.printf("SET(%s\n", srcsName)
+ needToCreateDummyFile=false
+ buildTarget.sources.each do |currentFile|
+ file.printf("%s\n", currentFile)
+ if currentFile=="dummy.cpp"
+
+ needToCreateDummyFile=true if not FileTest.exists?(@path+"/dummy.cpp")
+ end
+ end
+ file.printf(")\n\n")
+ file.printf("KDE3_AUTOMOC(${%s})\n\n", srcsName)
+
+ if needToCreateDummyFile
+# printf("creating dummy file in #{@path} ________\n")
+ file.printf("FILE(WRITE dummy.cpp \"//autogenerated file by cmake\\n\")\n")
+ end
+ end
+
+ if not buildTarget.uis.empty?
+ file.printf("SET( %s\n", uisName)
+ buildTarget.uis.each{ |currentFile| file.printf("%s\n", currentFile)}
+ file.printf(")\n\n")
+ file.printf("KDE3_ADD_UI_FILES(%s ${%s} )\n\n", srcsName, uisName)
+ end
+
+ if not buildTarget.skels.empty?
+ file.printf("SET( %s\n", skelsName)
+ buildTarget.skels.each{ |currentFile| file.printf("%s\n", currentFile)}
+ file.printf(")\n\n")
+
+ file.printf("KDE3_ADD_DCOP_SKELS(%s ${%s})\n\n", srcsName, skelsName)
+ end
+
+ if not buildTarget.stubs.empty?
+ file.printf("SET( %s\n", stubsName)
+ buildTarget.stubs.each{ |currentFile| file.printf("%s\n", currentFile)}
+ file.printf(")\n\n")
+
+ file.printf("KDE3_ADD_DCOP_STUBS(%s ${%s})\n\n", srcsName, stubsName)
+ end
+
+ if not buildTarget.kcfgs.empty?
+ file.printf("SET( %s\n", kcfgsName)
+ buildTarget.kcfgs.each{ |currentFile| file.printf("%s\n", currentFile)}
+ file.printf(")\n\n")
+
+ file.printf("KDE3_ADD_KCFG_FILES(%s ${%s})\n\n", srcsName, kcfgsName)
+ end
+
+ if buildTarget.type==SharedLib
+ file.printf("ADD_LIBRARY(%s SHARED ${%s})\n\n", buildTarget.name, srcsName)
+ file.printf("TARGET_LINK_LIBRARIES(%s ", buildTarget.name)
+ buildTarget.libs.each { |currentLib| file.printf(" %s", currentLib) }
+ file.printf(" )\n\n")
+
+ file.printf("SET_TARGET_PROPERTIES(%s PROPERTIES VERSION 4.2.0 SOVERSION 4 )\n", buildTarget.name)
+ file.printf("INSTALL_TARGETS(/lib %s )\n\n", buildTarget.name)
+ elsif buildTarget.type==StaticLib
+ file.printf("ADD_LIBRARY(%s STATIC ${%s})\n\n", buildTarget.name, srcsName)
+ elsif buildTarget.type==Part
+ if buildTarget.stdPrefix
+ file.printf("KDE3_ADD_KPART(%s WITH_PREFIX ${%s})\n\n", buildTarget.name, srcsName)
+ else
+ file.printf("KDE3_ADD_KPART(%s ${%s})\n\n", buildTarget.name, srcsName)
+ end
+ file.printf("TARGET_LINK_LIBRARIES(%s ", buildTarget.name)
+ buildTarget.libs.each { |currentLib| file.printf(" %s", currentLib) }
+ file.printf(" )\n\n")
+
+ file.printf("INSTALL_TARGETS(/lib/kde3 %s )\n\n", buildTarget.name)
+ elsif buildTarget.type==KDEInit
+ file.printf("KDE3_ADD_KLM( %s ${%s})\n\n", buildTarget.name, srcsName)
+
+ file.printf("TARGET_LINK_LIBRARIES(kdeinit_%s ", buildTarget.name)
+ buildTarget.libs.each { |currentLib| file.printf(" %s", currentLib) }
+ file.printf(" )\n\n")
+
+ file.printf("INSTALL_TARGETS(/lib kdeinit_%s )\n\n", buildTarget.name)
+
+ file.printf("TARGET_LINK_LIBRARIES( %s kdeinit_%s )\n", buildTarget.name, buildTarget.name)
+
+ file.printf("INSTALL_TARGETS(/bin %s )\n", buildTarget.name)
+
+ else #executable
+ if $no_kde
+
+ file.printf("ADD_EXECUTABLE(%s ${%s})\n\n", buildTarget.name, srcsName)
+
+ file.printf("TARGET_LINK_LIBRARIES(%s ", buildTarget.name)
+ buildTarget.libs.each { |currentLib| file.printf(" %s", currentLib) }
+ file.printf(" )\n\n")
+
+ if buildTarget.install
+ file.printf("INSTALL_TARGETS(/bin %s )\n\n", buildTarget.name)
+ end
+
+ else
+ if buildTarget.test
+ file.printf("IF(KDE3_BUILD_TESTS)\n")
+ end
+
+ file.printf("KDE3_ADD_EXECUTABLE(%s ${%s})\n\n", buildTarget.name, srcsName)
+
+ file.printf("TARGET_LINK_LIBRARIES(%s ", buildTarget.name)
+ buildTarget.libs.each { |currentLib| file.printf(" %s", currentLib) }
+ file.printf(" )\n\n")
+
+ if buildTarget.install
+ file.printf("INSTALL_TARGETS(/bin %s )\n\n", buildTarget.name)
+ end
+
+ if buildTarget.test
+ file.printf("ENDIF(KDE3_BUILD_TESTS)\n")
+ end
+
+ end
+
+ end
+
+ end
+
+ file.printf("\n########### install files ###############\n\n")
+
+ @installs.each do |key, install|
+ file.printf("INSTALL_FILES( %s FILES %s )\n", install.location, install.files)
+ end
+ file.printf("\n")
+
+ if @installIcons
+ file.printf("KDE3_INSTALL_ICONS( %s )\n\n",@iconDir )
+ end
+
+ file.printf("KDE3_PLACEHOLDER()\n\n")
+
+ file.printf("\n\n#original Makefile.am contents follow:\n\n")
+ @lines.each{ |line| file.printf("#%s", line)}
+# if !prevLines.empty?
+# file.printf("\n#######################\n#previous CMakeLists.txt contents follow:\n\n")
+# prevLines.each{ |line| file.printf("#%s", line)}
+# end
+ end
+end
+
+def convertAmFile(amFile)
+ cmake=CMakeFile.new(amFile)
+ cmake.createListsFile
+end
+
+if (ARGV.length==1)
+ if ARGV[0]=="--no-kde"
+ $no_kde=true
+ elsif ARGV[0]=="--help"
+ printf("--help\t print this help text\n")
+ printf("--version\t print version information\n")
+ printf("--no-kde\t disable special KDE application support\n")
+ elsif ARGV[0]=="--version"
+ printf("am2cmake (C) 2005, Alexander Neundorf\n")
+ printf("Version 0.1, December 11th, 2005\n");
+ else
+ printf("Invalid argument, try --help\n")
+ end
+end
+Dir["**/Makefile.am"].each{ |currentFile| convertAmFile(currentFile)}
+
+