From 9e9c437264a1acd04f54204ada9e3509cc878dba Mon Sep 17 00:00:00 2001 From: Markus Blatt <mblatt@dune-project.org> Date: Wed, 29 Aug 2012 12:34:50 +0000 Subject: [PATCH] Python scripts trying to do its best converting Makefile.am files to CMakeLists.txt files. [[Imported from SVN: r6933]] --- bin/am2cmake.py | 837 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 837 insertions(+) create mode 100755 bin/am2cmake.py diff --git a/bin/am2cmake.py b/bin/am2cmake.py new file mode 100755 index 000000000..f31e1474f --- /dev/null +++ b/bin/am2cmake.py @@ -0,0 +1,837 @@ +#!/usr/bin/python +import sys +import re +import os +import fnmatch +import errno +from optparse import OptionParser +from pyparsing import * + +class rem_proc: + def __init__(self, name): + self.name=name + self.found=False + def parse(self,tokens): + self.found=True + def foreach_begin(self): + return "\nforeach(i ${"+self.name+"})\n" + + def foreach_end(self): + return "endforeach(i ${"+self.name+"})\n" + + def process_SUBDIRS(self): + return ''.join([self.foreach_begin(), + " if(${i} STREQUAL \"test\")\n", + " set(opt \"EXCLUDE_FROM_ALL)\"\n", + " endif(${i} STREQUAL \"test\")\n", + " add_subdirectory(${i} ${opt})\n"+self.foreach_end()]) + + def process(self): + s="" + if self.found: + s= getattr(self, "process_%s" % self.name)() + return s + + + def process_TESTS(self): + return ''.join(['\n', + self.foreach_begin(), + " add_test(${i} ${i})\n", + self.foreach_end()]) + + def process_XFAIL_TESTS(self): + return ''.join(['\n#Set properties for failing tests\n', + 'set_tests_properties(\n', + ' ${XFAIL_TESTS} PROPERTIES\n', + ' WILL_FAIL true)']) + + def process_COMPILE_XFAIL_TESTS(self): + return ''.join(['# Add test for programs that should not compile', + '\nforeach(_TEST ${COMPILE_XFAIL_TESTS})\n' + ' add_test(NAME ${_TEST}', + ' COMMAND ${CMAKE_COMMAND} --build . --target ${_TEST} --config $<CONFIGURATION>)\n', + 'endforeach(_TEST)\n', + 'set_tests_properties(${COMPILE_XFAIL_TESTS}\n', + ' PROPERTIES WILL_FAIL true)']) + + +def parse_dependency(tokens): + tokens[0][0]='add_dependencies('+tokens[0][0]+' ' + tokens[0][-1]=tokens[0][-1]+')' + +def comment_lines(tokens): + tokens[0][0]='# The following lines are comment out as the translation is not clear. TODO review\n#\n# '+tokens[0][0] + if len(tokens[0])>0: + for i in range(1, len(tokens[0])): + if tokens[0][i] == '\n': + tokens[0][i]='\n#' + +def repl_gnudir(m): + #print "gnudir %s" % m + return "CMAKE_INSTALL_"+m.upper() + +def parse_sources(tokens): + target=re.sub('_$', '', tokens[0][0]) + tokens[0][0]='add_executable('+target+' ' + tokens[0][-1]=tokens[0][-1]+')' + +class installer: + def __init__(self, name): + self.name = name + self.found_dirs = set() + self.regex= re.compile(r'(?P<prefix>\S+[^_])_'+self.name) + self.install_prefix = { + 'SCRIPTS': 'PROGRAMS', + 'DATA': 'FILES', + 'PROGRAMS': 'TARGETS', + 'LIBRARIES': 'TARGETS', + 'HEADERS': 'FILES', + 'check_PROGRAMS': '' + }[name] + def create_parser(self,lowercase_name,opt_ws,equals,value): + parser=Group(Combine(Optional(lowercase_name)+self.name)+Suppress(opt_ws)+ equals + opt_ws + Optional(value)) + return parser + def parse(self,tokens): + #import pdb; pdb.set_trace() + m=self.regex.match(tokens[0][0]) + if m: + self.found_dirs.add(m.group('prefix')) + else: + self.found_dirs.add('') + + def process(self): + #import pdb; pdb.set_trace() + s="" + for i in self.found_dirs: + if i: + install_dir=i+'dir' + else: + install_dir=repl_gnudir({ + 'SCRIPTS': 'bindir', + 'DATA': 'datadir', + 'PROGRAMS': 'bindir', + 'LIBRARIES': 'libdir', + 'HEADERS': 'includedir' + }[self.name]) + if not (i == ""): + var=""+i+'_'+self.name + else: + var=self.name + if not self.name.startswith('noinst'): + s= s+"\ninstall("+self.install_prefix+" ${"+var+"} DESTINATION ${"+install_dir+"})" + return s + +class target_flags: + def __init__(self, suffix): + self.suffix=suffix + self.known_flags = { + 'ALGRID_CPPFLAGS': ['add_dune_alugrid_flags',''], + 'UG_CPPFLAGS': ['add_dune_ug_flags', ''], + 'SUPERLU_CPPFLAGS': ['add_dune_superlu_flags', ''], + 'DUNEMPICPPFLAGS': ['add_dune_mpi_flags', ''], + 'AMIRAMESH_CPPFLAGS': ['add_dune_amira_flags',''], + 'BOOST_CPPFLAGS': ['add_dune_boost_flags',''], + 'GMP_CPPFLAGS': ['add_dune_gmp_flags',''], + 'GRAPE_CPPFLAGS': ['add_dune_grape_flags',''], + 'PARMETIS_CPPFLAGS': ['add_dune_parmetis_flags',''], + 'PETSC_CPPFLAGS': ['add_dune_petsc_flags',''], + 'PSURFACE_CPPFLAGS': ['add_dune_psurface_flags',''] + } + for i in range(1,9): + self.known_flags.update({ + 'ALBERTA'+str(i)+'D_CPPFLAG' : ['add_dune_alberta_flags', ''+'GRIDDIM '+str(i)]}) + def parse(self, stri,loc,tokens): + #print 'target_flags' + #print self.suffix + #print tokens + if (self.suffix == 'CPPFLAGS'): + line=''.join(tokens[0]) + s='' + for key, value in self.known_flags.items(): + if line.find(key)>-1: + s+='\n'+value[0]+'('+re.sub(r'set\((.*)_', '\\1',tokens[0][0])+value[1]+')' + tokens[0]=s + #print tokens + else: + comment_lines(tokens) + +def parse_dir(stri,loc,tokens): + #import pdb; pdb.set_trace() + #print "parse_dir" + #print tokens + tokens[0][1]=''.join(tokens[0][1:]) + #print range(2, len(tokens[0])) + if len(tokens[0]) >=2: + for i in range(2, len(tokens[0])): + tokens[0].pop() + #print tokens + #print "str="+stri+" |" + #print "loc="+str(loc)+" |" + #print tokens[0][1] + #for i in range(0,len(tokens[0])): + tokens[0][1]=re.sub(r'\$\{([a-z]+dir)\}(\S*)\)', (lambda m: "${"+repl_gnudir(m.group(1))+"}"+m.group(2)+')'), tokens[0][1]) + #print tokens[0][1] + tokens[0][1]=tokens[0][1].replace('${CMAKE_INSTALL_DATADIR}/doc', + '${CMAKE_INSTALL_DOCDIR}') + tokens[0][1]=tokens[0][1].replace('${CMAKE_INSTALL_DATAROOTDIR}/doc', + '${CMAKE_INSTALL_DOCDIR}') + #print tokens + +def parse_include(tokens): + tokens[0][0]='# include not needed for CMake\n# '+tokens[0][0] + +def parse_if(tokens): + + expression = tokens[0][1]+' ' + tokens[0][0] ='if(' + tokens[0][2] =')\n' + tokens[0][len([0])-2] ='endif('+expression+')' + if tokens[0].elsestart : + tokens[0][4] ='else('+expression+')' + +def parse_assign(tokens): + tokens[0][0]='set('+tokens[0][0]+' ' + tokens[0][-1]=tokens[0][-1]+')' + +def parse_append(tokens): + tokens[0][0]='list(APPEND '+tokens[0][0]+' ' + tokens[0][-1]=tokens[0][-1]+')' + + +def parse_var(stri,loc,tokens): + #print "parse_var" + #print tokens + #print "str="+stri+" |" + #print "loc=%s|" % loc + tokens[0]='${'+tokens[0]+'}' + #print tokens + +def rename_var(tokens): + #print 'rename_var |%s|' % tokens[0] + #print tokens + name = re.sub('[ ]*([a-zA-Z0-9_])[ ]*[\n]?', '\\1', tokens[0]) + #print '|%s|' %name + tokens[0]={ + 'ALBERTA': 'ALBERTA_FOUND', + 'ALUGRID': 'ALUGRID_FOUND', + 'AMIRAMESH': 'AMIRAMESH_FOUND', + 'CONVERT': 'CONVERT_FOUND', + 'DUNEWEB': 'DUNEWEB_FOUND', + 'EIGEN': 'EIGEN_FOUND', + 'GLUT': 'GLUT_FOUND', + 'GMP': 'GMP_FOUND', + 'GRAPE': 'GRAPE_FOUND', + 'INKSCAPE': 'INKSCAPE_FOUND', + 'MPI': 'MPI_FOUND', + 'PARDISO': 'PARDISO_FOUND', + 'PETSC': 'PETSC_FOUND', + 'PSURFACE': 'PSURFACE_FOUND', + 'SUPERLU': 'SUPERLU_FOUND', + 'TEX4HT': 'TEX4HT_FOUND', + 'UG': 'UG_FOUND', + 'WML': 'WML_FOUND'}.setdefault(name, tokens[0]) + if name.startswith('HAVE_DUNE'): + tokens[0]=re.sub(r'have-(.*)$', '\\1', name.lower().replace('_','-'))+'_FOUND' + #print tokens[0] + +#print rename_var(['bla']) +#print rename_var(['UG']) +#print rename_var(['A']) +change_var2=1 + +def parse_var2(stri,loc,tokens): + if change_var2: + tokens[0]='${'+tokens[0]+'}' + else: + tokens[0][0]='@'+tokens[0][0]+'@' + +class is_present: + def __init__(self): + self.found=False + def parse(self,tokens): + self.found=True + +def repl_tabs(tokens): + for i in range(0, len(tokens)): + tokens[i]=tokens[i].replace('\t', ' ') + +def am_2_cmake_string(amstring): + ParserElement.setDefaultWhitespaceChars("") + word = Word(alphanums+"*.-_=<>&!;,/") + ws=Word(' ') + opt_ws=Optional(ws) + varopen = Literal("$(")#.replaceWith("${") + varclose = Literal(")")#.replaceWith("}") + var = Combine(varopen.suppress() + Word(alphanums+"_-")+varclose.suppress()) + var.addParseAction(rename_var) + var.addParseAction(parse_var) + var2 = Combine(Literal("@").suppress() +Word(alphanums+"_-")+Literal("@").suppress()) + var2.setParseAction(parse_var2) + wordorvar = var|var2| word + qwordorvar=("\""+wordorvar+"\"")|wordorvar + NL = opt_ws.suppress() + Or(lineEnd,stringEnd) + #NL.setDebug() + multiple_words = wordorvar + ZeroOrMore( opt_ws + wordorvar) + qmultiple_words = ("\""+multiple_words+"\"")|multiple_words + word_line = qmultiple_words+ZeroOrMore(opt_ws+qmultiple_words) + comment = Group('#'+ restOfLine('commenttext')) + continuation = Suppress('\\')+LineEnd() + #continuation.setDebug() + equals = Literal("=").suppress() + value = ZeroOrMore(opt_ws + Optional(word_line) + opt_ws + continuation)+ opt_ws+ word_line + name = Word(alphanums+"_-") + beginif = Literal("if") + #beginif.setDebug() + lines = Forward() + ifexpression = restOfLine + NL + ifexpression.setParseAction(rename_var) + ifbody = Group(lines) + endif = Literal('endif') + elsestatement = Forward() + elsestatement << (opt_ws+ Literal('else').setResultsName('elsestart') + NL + Group (lines)) + #endif.setDebug() + ifstatement =Forward() + ifstatement << Group(beginif + ifexpression + Group(lines) + Optional(elsestatement) + opt_ws + endif)#+ NL# +endif #+ NL + #ifstatement.setDebug() + ifstatement.setParseAction(parse_if) + + varAssign = Group(name + Suppress(opt_ws)+ equals + opt_ws + Optional(value)) + varAssign.setParseAction(parse_assign) + + docsAssign = Group(Or(Literal("DOCFILES"), Literal("DOCFILES_EXTRA"))+ Suppress(opt_ws)+ equals + opt_ws + Optional(value)) + docsAssign.setParseAction(parse_assign) + docs_present = is_present() + docsAssign.addParseAction(docs_present.parse) + varAddAssign = Group(name + Suppress(opt_ws) + Literal('+=').suppress() + Suppress(opt_ws) + Optional(value)) + varAddAssign.setParseAction(parse_append) + + # Grammar for <lowercase>dir. A parser is needed to convert the GNU autoconf dirs to + # CMAKE GNU dirs. + dir_name = Regex("[a-z0-9_-]+dir")#Word(srange("[a-z0-9_-]")) + dirAssign=Group(dir_name+Suppress(opt_ws)+ equals + opt_ws + Optional(value)) + dirAssign.setParseAction(parse_assign) + dirAssign.addParseAction(parse_dir) + #dirAssign.setDebug() + + lowercase_name_= Regex("[a-z0-9_-]+_") + + cppflagsAssign = Group(lowercase_name_+'CPPFLAGS' + Suppress(opt_ws)+ equals + opt_ws + Optional(value)) + cppflagsAssign.addParseAction(parse_assign) + cppflags=target_flags('CPPFLAGS') + cppflagsAssign.addParseAction(cppflags.parse) + + ldflagsAssign = Group(lowercase_name_+'LDFLAGS' + Suppress(opt_ws)+ equals + opt_ws + Optional(value)) + ldflagsAssign.addParseAction(parse_assign) + ldflags=target_flags('LDFLAGS') + ldflagsAssign.addParseAction(ldflags.parse) + + ldaddAssign = Group(lowercase_name_+'LDADD' + Suppress(opt_ws)+ equals + opt_ws + Optional(value)) + ldaddAssign.addParseAction(parse_assign) + ldadd=target_flags('LDADD') + ldaddAssign.addParseAction(ldadd.parse) + + libsAssign = Group(lowercase_name_+'LIBS' + Suppress(opt_ws)+ equals + opt_ws + Optional(value)) + libsAssign.addParseAction(parse_assign) + libs=target_flags('LIBS') + libsAssign.addParseAction(libs.parse) + + + + + # Process dir_SOURCES assignment + sourcesAssign = Group(lowercase_name_+Suppress(Literal("SOURCES"))+Suppress(opt_ws)+ equals + Suppress(opt_ws) + Optional(value)) + sourcesAssign.setParseAction(parse_sources) + + # Process <dir>_DATA assignment + data_install = installer("DATA") + dataAssign = data_install.create_parser(lowercase_name_, opt_ws, equals, value) + #dataAssign.setDebug() + dataAssign.addParseAction(data_install.parse) + dataAssign.addParseAction(parse_assign) + #dataAssign.addParseAction(lambda tokens: data_install.parse(tokens)) + + # Process check_Programs but never install them + check_programs = installer("check_PROGRAMS") + check_programsAssign = check_programs.create_parser(lowercase_name_, opt_ws, equals, value) + + # Process <dir>_PROGRAMS assignment + programs_install = installer("PROGRAMS") + programsAssign = programs_install.create_parser(lowercase_name_, opt_ws, equals, value) + programsAssign.addParseAction(programs_install.parse) + programsAssign.addParseAction(parse_assign) + + # Process <dir>_LIBRARIES assignment + libraries_install = installer("LIBRARIES") + librariesAssign = libraries_install.create_parser(lowercase_name_, opt_ws, equals, value) + librariesAssign.addParseAction(libraries_install.parse) + librariesAssign.addParseAction(parse_assign) + + # Process <dir>_SCRIPTS assignment + scripts_install = installer("SCRIPTS") + scriptsAssign = scripts_install.create_parser(lowercase_name_, opt_ws, equals, value) + scriptsAssign.addParseAction(scripts_install.parse) + scriptsAssign.addParseAction(parse_assign) + + # Process <dir>_HEADERS assignment + headers_install = installer("HEADERS") + headersAssign = headers_install.create_parser(lowercase_name_, opt_ws, equals, value) + headersAssign.addParseAction(headers_install.parse) + headersAssign.addParseAction(parse_assign) + + # SUBDIRS + subdirsAssign = Group(Combine(Literal("SUBDIRS"))+Suppress(opt_ws)+ equals + opt_ws + Optional(value)) + subdirsAssign.setParseAction(parse_assign) + subdirs= rem_proc("SUBDIRS") + subdirsAssign.addParseAction(subdirs.parse) + + testsAssign = Group(Combine(Literal("TESTS"))+Suppress(opt_ws)+ equals + opt_ws + Optional(value)) + #testsAssign.setDebug() + testsAssign.setParseAction(parse_assign) + tests=rem_proc("TESTS") + testsAssign.addParseAction(tests.parse) + + fail_testsAssign = Group(Combine(Literal("XFAIL_TESTS"))+Suppress(opt_ws)+ equals + opt_ws + Optional(value)) + fail_testsAssign.setParseAction(parse_assign) + fail_tests=rem_proc("XFAIL_TESTS") + fail_testsAssign.addParseAction(fail_tests.parse) + + compile_fail_testsAssign = Group(Combine(Literal("COMPILE_XFAIL_TESTS"))+Suppress(opt_ws)+ equals + opt_ws + Optional(value)) + compile_fail_testsAssign.setParseAction(parse_assign) + compile_fail_tests=rem_proc("COMPILE_XFAIL_TESTS") + compile_fail_testsAssign.addParseAction(compile_fail_tests.parse) + + # Process include lines and just comment them out. + includeLine = opt_ws.suppress() + Group(Literal('include') + restOfLine ) + includeLine.setParseAction(parse_include) + #includeLine.setDebug() + rule_line = multiple_words+Combine(Optional(Literal("\\")),lineEnd) + dependency_rule= Group(opt_ws+word+opt_ws+Suppress(Literal(':'))+ opt_ws+multiple_words) + dependency_rule.setParseAction(parse_dependency) + + easy_rule = Group(opt_ws+word+opt_ws+Literal(':')+ opt_ws+Optional(word_line)+opt_ws+ + ZeroOrMore(Or(NL,continuation)+ws+Optional(word_line)+opt_ws)+NL) + easy_rule.setParseAction(comment_lines) + #easy_rule.setDebug() + + lines << ZeroOrMore(opt_ws+(dependency_rule+NL|easy_rule|(sourcesAssign|dataAssign|check_programsAssign|programsAssign|librariesAssign|scriptsAssign|headersAssign|subdirsAssign|compile_fail_testsAssign|fail_testsAssign|testsAssign|dirAssign|cppflagsAssign|ldaddAssign|ldflagsAssign|libsAssign|varAddAssign|docsAssign|varAssign|comment|ifstatement|includeLine|Empty())+NL)) + + s= ''.join(lines.parseString(amstring)._asStringList()) + #print s + s=s+data_install.process() + s=s+programs_install.process() + s=s+libraries_install.process() + s=s+scripts_install.process() + s=s+headers_install.process() + s=s+subdirs.process() + + s+=tests.process() + s+=fail_tests.process() + s+=compile_fail_tests.process() + if tests.found or compile_fail_tests.found: + s+=''.join(['\n\n# We do not want want to build the tests during make all\n', + '# but just build them on demand\n', + 'add_directory_test_target(_test_target)\n', + 'add_dependencies(${_test_target} ${TESTS} ${COMPILE_XFAIL_TESTS})']) + if docs_present.found: + s=s+''.join(['\n# Install documentation', + '\n# We assume that ${DOCFILES} and ${DOCFILES_EXTRA} are targets\n', + 'install(TARGETS ${DOCFILES} ${DOCFILES_EXTRA} DESTINATION ${docdir})\n']) + + return s + +str1="""# $Id: Makefile.am 8330 2012-08-09 08:12:25Z sander $ + +# +## Find out which tests can be built +# + +if ALBERTA + APROG = test-alberta-1-1 test-alberta-1-2 test-alberta-2-2 \ + test-alberta-1-3 test-alberta-2-3 test-alberta-3-3 \ + test-alberta-generic + ALBERTA_EXTRA_PROGS = test-alberta +endif + +if ALUGRID + ALUPROG = test-alugrid +endif + +if UG + UPROG = test-ug test-parallel-ug +if ALUGRID + DGFALU_UGGRID = test-dgfalu-uggrid-combination +else + DGFALU_UGGRID = +endif +endif + +# +## Defines for gridtype.hh +# +GRIDTYPE=YASPGRID +GRIDDIM=2 + +ALBERTA_DIM = $(WORLDDIM) + +# +## Some parameters for the geogrid test +# +COORDFUNCTION = IdenticalCoordFunction\<double,$(GRIDDIM)\> +# COORDFUNCTION = Helix +# COORDFUNCTION = ThickHelix +# COORDFUNCTION = DGFCoordFunction\<$(GRIDDIM),$(GRIDDIM)\> +# COORDFUNCTION = DGFCoordFunction\<2,3\> +CACHECOORDFUNCTION = 0 + +# +## define the lists of tests to build and run +# + +# tests where program to build and program to run are equal +NORMALTESTS = test-sgrid test-oned test-yaspgrid test-geogrid $(APROG) $(UPROG) $(ALUPROG) $(DGFALU_UGGRID) + +# list of tests to run +TESTS = $(NORMALTESTS) + +# programs just to build when "make check" is used +check_PROGRAMS = $(NORMALTESTS) + +EXTRA_PROGRAMS = $(ALBERTA_EXTRA_PROGS) + +# +## common flags +# + +# paranoia +DUNE_EXTRA_CHECKS = -DDUNE_DEVEL_MODE +# output coverage +#COVERAGE = -fprofile-arcs -ftest-coverage +AM_CXXFLAGS = $(COVERAGE) +AM_CPPFLAGS = @AM_CPPFLAGS@ $(DUNE_EXTRA_CHECKS) + +# The directory where the example grid files used for testing are located +AM_CPPFLAGS+=-DDUNE_GRID_EXAMPLE_GRIDS_PATH=\"$(top_srcdir)/doc/grids/\" + +# +## define the programs +# + +test_sgrid_SOURCES = test-sgrid.cc + +test_oned_SOURCES = test-oned.cc + +test_yaspgrid_SOURCES = test-yaspgrid.cc +test_yaspgrid_CPPFLAGS = $(AM_CPPFLAGS) \ + $(DUNEMPICPPFLAGS) +test_yaspgrid_LDFLAGS = $(AM_LDFLAGS) \ + $(DUNEMPILDFLAGS) +test_yaspgrid_LDADD = \ + $(DUNEMPILIBS) \ + $(LDADD) + +# this implicitly checks the autoconf-test as well... +test_alberta_SOURCES = test-alberta.cc +test_alberta_CPPFLAGS = $(AM_CPPFLAGS) $(ALBERTA_CPPFLAGS) -DGRIDDIM=$(GRIDDIM) $(GRAPE_CPPFLAGS) +test_alberta_LDFLAGS = $(AM_LDFLAGS) $(ALBERTA_LDFLAGS) $(GRAPE_LDFLAGS) +test_alberta_LDADD = \ + $(GRAPE_LIBS) \ + $(ALBERTA_LIBS) \ + $(LDADD) + +test_alberta_1_1_SOURCES = test-alberta.cc +test_alberta_1_1_CPPFLAGS = -DGRIDDIM=1 -DWORLDDIM=1 $(ALBERTA1D_CPPFLAGS) $(GRAPE_CPPFLAGS) $(AM_CPPFLAGS) +test_alberta_1_1_LDFLAGS = $(ALBERTA1D_LDFLAGS) $(GRAPE_LDFLAGS) $(AM_LDFLAGS) +test_alberta_1_1_LDADD = $(ALBERTA1D_LIBS) $(GRAPE_LIBS) $(LDADD) + +test_alberta_1_2_SOURCES = test-alberta.cc +test_alberta_1_2_CPPFLAGS = -DGRIDDIM=1 -DWORLDDIM=2 $(ALBERTA2D_CPPFLAGS) $(GRAPE_CPPFLAGS) $(AM_CPPFLAGS) +test_alberta_1_2_LDFLAGS = $(ALBERTA2D_LDFLAGS) $(GRAPE_LDFLAGS) $(AM_LDFLAGS) +test_alberta_1_2_LDADD = $(ALBERTA2D_LIBS) $(GRAPE_LIBS) $(LDADD) + +test_alberta_2_2_SOURCES = test-alberta.cc +test_alberta_2_2_CPPFLAGS = -DGRIDDIM=2 -DWORLDDIM=2 $(ALBERTA2D_CPPFLAGS) $(GRAPE_CPPFLAGS) $(AM_CPPFLAGS) +test_alberta_2_2_LDFLAGS = $(ALBERTA2D_LDFLAGS) $(GRAPE_LDFLAGS) $(AM_LDFLAGS) +test_alberta_2_2_LDADD = $(ALBERTA2D_LIBS) $(GRAPE_LIBS) $(LDADD) + +test_alberta_1_3_SOURCES = test-alberta.cc +test_alberta_1_3_CPPFLAGS = -DGRIDDIM=1 -DWORLDDIM=3 $(ALBERTA3D_CPPFLAGS) $(GRAPE_CPPFLAGS) $(AM_CPPFLAGS) +test_alberta_1_3_LDFLAGS = $(ALBERTA3D_LDFLAGS) $(GRAPE_LDFLAGS) $(AM_LDFLAGS) +test_alberta_1_3_LDADD = $(ALBERTA3D_LIBS) $(GRAPE_LIBS) $(LDADD) + +test_alberta_2_3_SOURCES = test-alberta.cc +test_alberta_2_3_CPPFLAGS = -DGRIDDIM=2 -DWORLDDIM=3 $(ALBERTA3D_CPPFLAGS) $(GRAPE_CPPFLAGS) $(AM_CPPFLAGS) +test_alberta_2_3_LDFLAGS = $(ALBERTA3D_LDFLAGS) $(GRAPE_LDFLAGS) $(AM_LDFLAGS) +test_alberta_2_3_LDADD = $(ALBERTA3D_LIBS) $(GRAPE_LIBS) $(LDADD) + +test_alberta_3_3_SOURCES = test-alberta.cc +test_alberta_3_3_CPPFLAGS = -DGRIDDIM=3 -DWORLDDIM=3 $(ALBERTA3D_CPPFLAGS) $(GRAPE_CPPFLAGS) $(AM_CPPFLAGS) +test_alberta_3_3_LDFLAGS = $(ALBERTA3D_LDFLAGS) $(GRAPE_LDFLAGS) $(AM_LDFLAGS) +test_alberta_3_3_LDADD = $(ALBERTA3D_LIBS) $(GRAPE_LIBS) $(LDADD) + +test_alberta_generic_SOURCES = $(test_alberta_SOURCES) +test_alberta_generic_CPPFLAGS = $(test_alberta_CPPFLAGS) -DDUNE_ALBERTA_USE_GENERICGEOMETRY=1 +test_alberta_generic_LDFLAGS = $(test_alberta_LDFLAGS) +test_alberta_generic_LDADD = $(test_alberta_LDADD) + +# files for alugrid +test_alugrid_SOURCES = test-alugrid.cc +test_alugrid_CPPFLAGS = $(AM_CPPFLAGS) \ + $(ALL_PKG_CPPFLAGS) +test_alugrid_LDFLAGS = $(AM_LDFLAGS) \ + $(ALL_PKG_LDFLAGS) \ + -static +test_alugrid_LDADD = \ + $(ALL_PKG_LIBS) \ + $(LDADD) + +test_geogrid_SOURCES = test-geogrid.cc functions.hh +test_geogrid_CPPFLAGS = $(AM_CPPFLAGS) \ + $(ALL_PKG_CPPFLAGS) \ + -DCOORDFUNCTION=$(COORDFUNCTION) \ + -DCACHECOORDFUNCTION=$(CACHECOORDFUNCTION) +test_geogrid_LDFLAGS = $(AM_LDFLAGS) \ + $(ALL_PKG_LDFLAGS) +test_geogrid_LDADD = \ + $(ALL_PKG_LIBS) \ + $(LDADD) + +# libdune contains both libugX2 and libugX3, always test both dimensions +test_ug_SOURCES = test-ug.cc +test_ug_CPPFLAGS = $(AM_CPPFLAGS) \ + $(DUNEMPICPPFLAGS) \ + $(UG_CPPFLAGS) +test_ug_LDFLAGS = $(AM_LDFLAGS) \ + $(DUNEMPILDFLAGS) \ + $(UG_LDFLAGS) +test_ug_LDADD = \ + $(UG_LIBS) \ + $(DUNEMPILIBS) \ + $(LDADD) + +# libdune contains both libugX2 and libugX3, always test both dimensions +test_parallel_ug_SOURCES = test-parallel-ug.cc +test_parallel_ug_CPPFLAGS = $(AM_CPPFLAGS) \ + $(DUNEMPICPPFLAGS) \ + $(UG_CPPFLAGS) +test_parallel_ug_LDFLAGS = $(AM_LDFLAGS) \ + $(DUNEMPILDFLAGS) \ + $(UG_LDFLAGS) +test_parallel_ug_LDADD = \ + $(UG_LIBS) \ + $(DUNEMPILIBS) \ + $(LDADD) + +# Test whether you can combine the different implementations in one file +test_dgfalu_uggrid_combination_SOURCES = test-dgfalu-uggrid-combination.cc +test_dgfalu_uggrid_combination_CPPFLAGS = $(AM_CPPFLAGS) $(UG_CPPFLAGS) $(ALUGRID_CPPFLAGS) +test_dgfalu_uggrid_combination_LDFLAGS = $(AM_LDFLAGS) $(UG_LDFLAGS) $(ALUGRID_LDFLAGS) +test_dgfalu_uggrid_combination_LDADD = \ + $(ALUGRID_LIBS) \ + $(UG_LIBS) \ + $(LDADD) + +## distribution tarball +SOURCES = gridcheck.cc staticcheck.hh checkindexset.cc checkgeometryinfather.cc checkintersectionit.cc checkcommunicate.cc checkiterators.cc checktwists.cc check-albertareader.cc basicunitcube.hh checkadaptation.cc checkgeometry.cc checkpartition.cc checkentityseed.cc + +# gridcheck not used explicitly, we should still ship it :) +EXTRA_DIST = $(SOURCES) + +CLEANFILES = *.gcda *.gcno semantic.cache simplex-testgrid*.dgf.* cube-testgrid*.dgf.* dgfparser.log + +include $(top_srcdir)/am/global-rules + +doxygendir = $(datadir)/doc/dune-localfunctions/doxygen +doxygen_DATA = $(WHAT) + +# install the html pages +docdir=$(datadir)/doc/dune-common/buildsystem +if BUILD_DOCS + DOCFILES=buildsystem.pdf + EXTRA_DIST=$(DOCFILES) + EXTRAINSTALL=$(DOCFILES) +endif + +all: $(WHAT) $(DOXYGENFILES) +clean-local: + if test "x$(VPATH)" != "x" && test ! -e $(srcdir)/doxygen-tag; then \ + if test -e $(top_srcdir)/doc/doxygen/Doxydep; then \ + rm -rf $(SVNCLEANFILES); \ + fi; \ + fi +# also build these sub directories +SUBDIRS = doxygen buildsystem +docdir=$(datadir)/doc/dune-common +doc_DATA=data_bla data_blu +doc_PROGRAMS= balla +XFAIL_TESTS=ftest1 ftest2 ftest3 +COMPILE_XFAIL_TESTS=cftest1 cftest2 +""" + +#print am_2_cmake_string("""# which tests to run +#TESTS = lagrangeshapefunctiontest \ +# monomshapefunctiontest \ +# virtualshapefunctiontest \ +# testgenericfem \ +# $(ALUPROG) +#""") + +str2=''.join(['TESTS = lagrangeshapefunctiontest \\\n', '\tmonomshapefunctiontest\t\t\t\\\n', '\tvirtualshapefunctiontest\t\t\\\n', '\ttestgenericfem \\\n', '\t$(ALUPROG)\n']) +#print "s=%s" % output + +def init_cmake_module(module_name): + return''.join(['# set up project\n', + 'project("'+module_name+'" C CXX)\n\n', + '# general stuff\n', + 'cmake_minimum_required(VERSION 2.8.8)\n\n', + '# make sure our own modules are found\n', + 'set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules")\n\n', + '#include the dune macros\n' + 'include(DuneMacros)\n\n', + '# start a dune project with information from dune.module\n', + 'dune_project()\n\n']) + +def finalize_cmake_module(module_name): + upper_name =re.sub('-(\S)', lambda m: m.group(1).capitalize(), + module_name.capitalize()) + name_wo_dasch=module_name.replace('-', '') + lines = ['\nmessage(AUTHOR_WARNING "TODO: Maybe uncomment export line"\n', + '#export(TARGETS '+name_wo_dasch+' FILE '+upper_name+'Targets.cmake)\n', + '# finalize the dune project, e.g. generating config.h etc.\n' + 'finalize_dune_project(GENERATE_CONFIG_H_CMAKE)\n'] + return ''.join(lines) + +def create_cmake_dirs_and_file(dirname, module_name): + upper_name =re.sub('-(\S)', lambda m: m.group(1).capitalize(), + module_name).capitalize() + print 'module_name %s' % module_name + print 'upper_name %s' % upper_name + dirs={'modules': os.path.join(dirname, 'cmake', 'modules'), + 'pkg': os.path.join(dirname, 'cmake', 'pkg')} + cdirs=[] + for dir in dirs.values(): + try: + print "Creating %s" % dir + os.makedirs(dir) + except OSError as exception: + if exception.errno != errno.EEXIST: + raise + text="message(AUTHOR_WARNING \"TODO: Implement module test.\")" + output=open(os.path.join(dirs['modules'], upper_name+'Macros.cmake'), 'w') + output.write(text) + output.close() + lines=['if(NOT @DUNE_MOD_NAME@_FOUND)\n', + #compute installation prefix relative to this file + 'get_filename_component(_dir "${CMAKE_CURRENT_LIST_FILE}" PATH)\n', + 'get_filename_component(_prefix "${_dir}/../../.." ABSOLUTE)\n', + '\n', + '#import the target\n', + 'if(EXISTS "${_prefix}/lib/cmake/@DUNE_MOD_NAME@-targets.cmake")\n', + ' include("${_prefix}/lib/cmake/@DUNE_MOD_NAME@-targets.cmake")\n', + 'endif(EXISTS "${_prefix}/lib/cmake/@DUNE_MOD_NAME@-targets.cmake")\n', + '\n', + '#report other information\n', + 'set(@DUNE_MOD_NAME@_PREFIX "${_prefix}")\n', + 'set(@DUNE_MOD_NAME@_INCLUDE_DIRS "${_prefix}/include")\n', + 'set(@DUNE_MOD_NAME@_CXX_FLAGS "@CMAKE_CXX_FLAGS@")\n', + 'set(@DUNE_MOD_NAME@_CXX_FLAGS_DEBUG "@CMAKE_CXX_FLAGS_DEBUG@")\n', + 'set(@DUNE_MOD_NAME@_CXX_FLAGS_MINSIZEREL "@CMAKE_CXX_FLAGS_MINSIZEREL@")\n', + 'set(@DUNE_MOD_NAME@_CXX_FLAGS_RELEASE "@CMAKE_CXX_FLAGS_RELEASE@")\n', + 'set(@DUNE_MOD_NAME@_CXX_FLAGS_RELWITHDEBINFO "@CMAKE_CXX_FLAGS_RELWITHDEBINFO@")\n', + 'set(@DUNE_MOD_NAME@_LIBRARIES "@LIBRARIES@")\n', + 'set(@DUNE_MOD_NAME@_DEPENDS "@DUNE_DEPENDS@")' + 'set(@DUNE_MOD_NAME@_SUGGESTS "@DUNE_SUGGESTS@")' + 'endif(NOT @DUNE_MOD_NAME@_FOUND)\n'] + text = ''.join(lines) + output=open(os.path.join(dirs['pkg'], module_name+'-config.cmake.in'), 'w') + output.write(text) + output.close() + l=[lines[0]] + l.extend([lines[5], + 'if(EXISTS "@CMAKE_BINARY_DIR@/@DUNE_MOD_NAME@-targets.cmake")\n' + ' include("@CMAKE_BINARY_DIR@/@DUNE_MOD_NAME@-targets.cmake")\n', + 'endif(EXISTS "@CMAKE_BINARY_DIR@/@DUNE_MOD_NAME@-targets.cmake")\n\n']) + l.extend(lines[10:]) + output=open(os.path.join(dirname, module_name+'-config.cmake.in'), 'w') + output.write(''.join(l)) + output.close() + output=open(os.path.join(dirs['modules'], 'CMakeLists.txt'), 'w') + lines=['file(GLOB modules *.cmake)\n' + 'install(FILES ${modules} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/cmake/modules)\n'] + output.write(''.join(lines)) + output.close() + output=open(os.path.join(dirname, module_name+'-version.cmake.in'), 'w') + lines=['set(PACKAGE_VERSION "@DUNE_MOD_VERSION@")\n\n', + 'if(NOT "${PACKAGE_FIND_VERSION}" VERSION_GREATER "@DUNE_MOD_VERSION@")\n', + ' set (PACKAGE_VERSION_COMPATIBLE 1) # compatible with older\n', + ' if ("${PACKAGE_FIND_VERSION}" VERSION_EQUAL "@DUNE_MOD_VERSION@")\n' + ' set(PACKAGE_VERSION_EXACT 1) #exact match for this version\n', + ' endif()\n', + 'endif()\n'] + output.write(''.join(lines)) + output.close() + + +def am_2_cmake(amfile, cmakefile, module_root=False): + output = open(cmakefile, 'w') + if module_root: + dirname=os.path.dirname(amfile) + dune_module_path = os.path.join(dirname, 'dune.module') + module_file = open(dune_module_path, 'r') + lines = module_file.readlines() + m=re.match('.*Module:[ \t]*(\S+)[ \t]*\n.*', ''.join(lines)) + if not m: + raise Exception("Could not find module name in dune.module file.") + module_file.close() + module_name=m.group(1) + output.write(init_cmake_module(module_name)) + create_cmake_dirs_and_file(dirname, module_name) + input = open(amfile, 'r') + lines = input.readlines() + str = ''.join(lines) + output.write(am_2_cmake_string(str)) + input.close() + if module_root: + output.write(finalize_cmake_module(module_name)) + output.close() + +def am_2_cmake_dir(directory): + for root, dirnames, filenames in os.walk(directory): + for filename in fnmatch.filter(filenames, 'Makefile.am'): + print "root=%s" % root + print "filename=%s" % filename + amfile=os.path.join(root, filename) + cmfile=os.path.join(root, 'CMakeLists.txt') + is_module_root = len(fnmatch.filter(filenames, 'dune.module')) + + print ''.join(['Converting ', amfile, ' -> ', cmfile]) + print is_module_root + am_2_cmake(amfile, cmfile, is_module_root) + + +def main(): + usage = "usage: am2cmake " + parser = OptionParser(usage=usage) + parser.add_option("-a", "--am-file", dest="amfile", + help="The Makefile.am", metavar="FILE") + parser.add_option("-c", "--cmake-file", + dest="cmakefile", + help="The CMake file") + parser.add_option("-d", "--directory", + dest="directory", + help="Root directory of dune-module") + (options, args) = parser.parse_args() + if not options.amfile and not options.directory: + parser.error("options -a or option -d has to be present") + if options.directory and (options.amfile or options.cmakefile): + parser.error("Cannot provide a directory and a CMake or am file.") + if not options.cmakefile and not options.directory: + options.cmakefile = options.amfile.replace('Makefile.am', 'CMakeLists.txt') + + #import pdb; pdb.set_trace() + if options.directory: + am_2_cmake_dir(options.directory) + else: + print ''.join([options.amfile, '->', options.cmakefile]) + am_2_cmake(options.amfile, options.cmakefile) +if __name__ == "__main__": + main() -- GitLab