diff options
Diffstat (limited to 'am2cmake')
| -rwxr-xr-x | am2cmake | 594 | 
1 files changed, 594 insertions, 0 deletions
| diff --git a/am2cmake b/am2cmake new file mode 100755 index 00000000..d1154ae7 --- /dev/null +++ b/am2cmake @@ -0,0 +1,594 @@ +#!/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 "kde_kcfg" then inst.setLocation("/share/config.kcfg") +        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)} + + | 
