def test_dsl_factory(self):
        factory = DSLFactory()
        factory2 = DSLFactory()
        # test of singleton factory behavior
        self.assertIs(factory, factory2)

        a = factory.from_file(
            "/home/robolab/robocomp/components/euroage-tv/components/tvGames/gamestatemachine.smdsl"
        )
        # test for cached query
        b = factory.from_file(
            "/home/robolab/robocomp/components/euroage-tv/components/tvGames/gamestatemachine.smdsl"
        )
        self.assertIs(a, b)

        c = factory.from_file(
            "/home/robolab/robocomp/interfaces/IDSLs/JointMotor.idsl")
        # test for cached query
        d = factory.from_file(
            "/home/robolab/robocomp/interfaces/IDSLs/JointMotor.idsl")
        self.assertIs(c, d)

        e = factory.from_file(
            "/home/robolab/robocomp/tools/robocompdsl/component_generation_test/customStateMachinePython/test.cdsl"
        )
        # test for cached query
        f = factory.from_file(
            "/home/robolab/robocomp/tools/robocompdsl/component_generation_test/customStateMachinePython/test.cdsl"
        )
        self.assertIs(e, f)
Exemplo n.º 2
0
 def test_is_agm1_agent(self):
     component = DSLFactory().from_file(
         os.path.join(CURRENT_DIR, "resources", "camerasimple.cdsl"))
     self.assertFalse(parsing_utils.is_agm1_agent(component))
     component = DSLFactory().from_file(
         os.path.join(CURRENT_DIR, "resources", "humanAgent.cdsl"))
     self.assertTrue(parsing_utils.is_agm1_agent(component))
     self.assertRaises(AssertionError, parsing_utils.is_agm1_agent,
                       "CameraSimple")
Exemplo n.º 3
0
def gimmeIDSL(name, files='', includeDirectories=None):
    if not '.idsl' in name:
        name += '.idsl'
    name = os.path.basename(name)
    pathList = []
    if includeDirectories != None:
        pathList += [x for x in includeDirectories]
    fileList = []
    for p in [f for f in files.split('#') if len(f) > 0]:
        if p.startswith("-I"):
            pathList.append(p[2:])
        else:
            fileList.append(p)
    pathList.append('/opt/robocomp/interfaces/IDSLs/')
    pathList.append(os.path.expanduser('~/robocomp/interfaces/IDSLs/'))
    filename = name.split('.')[0]
    for p in pathList:
        try:
            path = os.path.join(p, name)
            # WARN: import is here to avoid problem with recursive import on startup
            from dsl_parsers.dsl_factory import DSLFactory
            return DSLFactory().from_file(path)
        except IOError as e:
            pass
    print(('Couldn\'t locate ', name))
    sys.exit(-1)
Exemplo n.º 4
0
    def includeInPool(self, files, module_pool, include_directories):
        """
        Recursively add the loaded modules to the pool.

        """

        # look for the files in the includeDirectories
        for f in files:
            filename = f.split('.')[0]
            if filename not in module_pool:
                for p in include_directories:
                    try:
                        path = os.path.join(p, f)
                        # if found, load the module from the file
                        # WARN: import is here to avoid problem with recursive import on startup
                        from dsl_parsers.dsl_factory import DSLFactory
                        module = DSLFactory().from_file(path)
                        # store the module
                        module_pool[filename] = module
                        # try to add the modules that this one imports
                        self.includeInPool(
                            module['imports'] + module['recursive_imports'],
                            module_pool, include_directories)
                        break
                    except IOError:
                        pass
                if filename not in self:
                    raise ValueError('Couldn\'t locate %s ' % f)
Exemplo n.º 5
0
 def load_slice_and_create_imports(self, includeDirectories=None):
     result = ""
     import os
     for imp in sorted(set(self.component.recursiveImports + self.component.imports)):
         file_name = os.path.basename(imp)
         name = os.path.splitext(file_name)[0]
         result += Template(SLICE_LOAD_STR).substitute(interface_name=name)
         module = DSLFactory().from_file(file_name, includeDirectories=includeDirectories)
         result += f"import {module['name']}\n"
     return result
Exemplo n.º 6
0
    def get_interface_name_for_idsl(self, idsl_filename):
        """
        Extract the name of the interface for a idsl file.

        :param idsl_filename: .idsl file name
        :return: name of the interface defined inside the .idsl file.
        """
        try:
            interface_name = DSLFactory().from_file(idsl_filename)['interfaces'][0]['name']
        except:
            # There's some .idsl files without interfaces defined on it, just data structures definitions
            raise ValueError("Couldn't get the interface name for idsl file: %s" % idsl_filename)
        else:
            return interface_name
Exemplo n.º 7
0
def generate_recursive_imports(initial_idsls, include_directories=[]):
    assert isinstance(
        initial_idsls,
        list), "initial_idsl, parameter must be a list, not %s" % str(
            type(initial_idsls))
    new_idsls = []
    for idsl_path in initial_idsls:
        importedModule = None
        idsl_basename = os.path.basename(idsl_path)
        iD = include_directories + [
            '/opt/robocomp/interfaces/IDSLs/',
            os.path.expanduser('~/robocomp/interfaces/IDSLs/')
        ]
        # TODO: Replace by idsl_robocomp_path
        try:
            for directory in iD:
                attempt = directory + '/' + idsl_basename
                # print 'Check', attempt
                if os.path.isfile(attempt):
                    # WARN: import is here to avoid problem with recursive import on startup
                    from dsl_parsers.dsl_factory import DSLFactory
                    importedModule = DSLFactory().from_file(
                        attempt)  # IDSLParsing.gimmeIDSL(attempt)
                    break
        except:
            print(('Error reading IMPORT', idsl_basename))
            traceback.print_exc()
            print(('Error reading IMPORT', idsl_basename))
            os._exit(1)
        if importedModule == None:
            print(('Counldn\'t locate', idsl_basename))
            os._exit(1)

        # if importedModule['imports'] have a # at the end an emtpy '' is generated
        idsl_imports = importedModule['imports'].split('#')
        # we remove all the '' ocurrences and existing imports
        aux_imports = []
        for i_import in idsl_imports:
            if i_import != '' and i_import not in initial_idsls:
                if communication_is_ice(i_import):
                    aux_imports.append(i_import)
        idsl_imports = aux_imports
        if len(idsl_imports) > 0 and idsl_imports[0] != '':
            new_idsls += idsl_imports + generate_recursive_imports(
                idsl_imports, include_directories)

    return list(set(new_idsls))
Exemplo n.º 8
0
def generate_recursive_imports(initial_idsls, include_directories=None):
    assert isinstance(
        initial_idsls,
        list), "initial_idsl, parameter must be a list, not %s" % str(
            type(initial_idsls))
    if include_directories is None:
        include_directories = []
    new_idsls = []
    for idsl_path in initial_idsls:
        idsl_basename = os.path.basename(idsl_path)
        include_directories = include_directories + IDSLPool.get_common_interface_dirs(
        )
        # TODO: Replace by idsl_robocomp_path
        new_idsl_path = idsl_robocomp_path(idsl_basename, include_directories)
        from dsl_parsers.dsl_factory import DSLFactory
        try:
            imported_module = DSLFactory().from_file(
                new_idsl_path)  # IDSLParsing.gimmeIDSL(attempt)
        except pyparsing.ParseException as e:
            console.log(
                f"Parsing error in file {Text(new_idsl_path, style='red')} while generating recursive imports."
            )
            console.log(
                f"Exception info: {Text(e.args[2], style='red')} in line {e.lineno} of:\n{Text(e.args[0].rstrip(), styled='magenta')}"
            )
            raise
        if imported_module is None:
            raise FileNotFoundError(
                'generate_recursive_imports: Couldn\'t locate %s' %
                idsl_basename)

        # if importedModule['imports'] have a # at the end an emtpy '' is generated
        idsl_imports = imported_module['imports']
        # we remove all the '' ocurrences and existing imports
        aux_imports = []
        for i_import in idsl_imports:
            if i_import != '' and i_import not in initial_idsls:
                if communication_is_ice(i_import):
                    aux_imports.append(i_import)
        idsl_imports = aux_imports
        if len(idsl_imports) > 0 and idsl_imports[0] != '':
            new_idsls += idsl_imports + generate_recursive_imports(
                idsl_imports, include_directories)

    return list(set(new_idsls))
Exemplo n.º 9
0
    def includeInPool(self, files, modulePool, includeDirectories):
        """
        Recursively add the loaded modules to the pool.

        """
        fileList = []

        # Extracting files names from string argument "-I filename.idsl#filename2.idsl"
        for p in [f for f in files.split('#') if len(f) > 0]:
            if p.startswith("-I"):
                pass
            else:
                fileList.append(p)

        # look for the files in the includeDirectories
        for f in fileList:
            filename = f.split('.')[0]
            if not filename in modulePool:
                for p in includeDirectories:
                    try:
                        path = os.path.join(p, f)
                        # if found, load the module from the file
                        # WARN: import is here to avoid problem with recursive import on startup
                        from dsl_parsers.dsl_factory import DSLFactory
                        module = DSLFactory().from_file(path)
                        # store the module
                        modulePool[filename] = module
                        # try to add the modules that this one imports
                        self.includeInPool(
                            module['imports'] + module['recursive_imports'],
                            modulePool, includeDirectories)
                        break
                    except IOError as e:
                        pass
                if not filename in self.modulePool:
                    print(('Couldn\'t locate ', f))
                    # TODO: replace with an exception
                    sys.exit(-1)
Exemplo n.º 10
0
 def test_factory_singleton(self):
     factory2 = DSLFactory()
     self.assertIs(self.factory, factory2)
Exemplo n.º 11
0
 def setUp(self):
     self.maxDiff = None
     self.factory = DSLFactory()
Exemplo n.º 12
0
import sys
sys.path.append('/opt/robocomp/python')

import cog
def A():
	cog.out('<@@<')
def Z():
	cog.out('>@@>')
def TAB():
	cog.out('<TABHERE>')

from dsl_parsers.dsl_factory import DSLFactory
from dsl_parsers.parsing_utils import getNameNumber, gimmeIDSL, communicationIsIce, IDSLPool

includeDirectories = theIDSLPaths.split('#')
component = DSLFactory().from_file(theCDSL, include_directories=includeDirectories)
sm = DSLFactory().from_file(component['statemachine'])
if component == None:
	print('Can\'t locate', theCDSLs)
	sys.exit(1)


pool = IDSLPool(theIDSLs, includeDirectories)

def replaceTypeCPP2Python(t):
	t = t.replace('::','.')
	t = t.replace('string', 'str')
	return t

]]]
[[[end]]]
Exemplo n.º 13
0
import sys
sys.path.append('/opt/robocomp/python')

import cog
def A():
	cog.out('<@@<')
def Z():
	cog.out('>@@>')
def TAB():
	cog.out('<TABHERE>')

from dsl_parsers.dsl_factory import DSLFactory
from dsl_parsers.parsing_utils import getNameNumber, IDSLPool, communicationIsIce
includeDirectories = theIDSLPaths.split('#')
component = DSLFactory().from_file(theCDSL, include_directories=includeDirectories)


pool = IDSLPool(theIDSLs, includeDirectories)

REQUIRE_STR = """
<TABHERE># Remote object connection for <NORMAL>
<TABHERE>try:
<TABHERE><TABHERE>proxyString = ic.getProperties().getProperty('<NORMAL><NUM>Proxy')
<TABHERE><TABHERE>try:
<TABHERE><TABHERE><TABHERE>basePrx = ic.stringToProxy(proxyString)
<TABHERE><TABHERE><TABHERE><LOWER><NUM>_proxy = <NORMAL>Prx.uncheckedCast(basePrx)
<TABHERE><TABHERE><TABHERE>mprx["<NORMAL>Proxy<NUM>"] = <LOWER><NUM>_proxy
<TABHERE><TABHERE>except Ice.Exception:
<TABHERE><TABHERE><TABHERE>print('Cannot connect to the remote object (<NORMAL>)', proxyString)
<TABHERE><TABHERE><TABHERE>#traceback.print_exc()
Exemplo n.º 14
0
def main():
    parser = MyParser(
        description=
        'This application create components files from cdsl files or .ice from idsl\n'
        '\ta) to generate code from a CDSL file:     ' +
        sys.argv[0].split('/')[-1] + '   INPUT_FILE.CDSL   OUTPUT_PATH\n' +
        '\tb) to generate a new CDSL file:           ' +
        sys.argv[0].split('/')[-1] + '   NEW_COMPONENT_DESCRIPTOR.CDSL',
        formatter_class=argparse.RawTextHelpFormatter)
    parser.add_argument("-I",
                        "--include_dirs",
                        nargs='*',
                        help="Include directories",
                        action=FullPaths,
                        default=[])
    parser.add_argument("-d",
                        '--diff',
                        dest='diff',
                        choices=DIFF_TOOLS,
                        action='store')
    parser.add_argument("input_file", help="The input dsl file")
    parser.add_argument("output_path",
                        nargs='?',
                        help="The path to put the files")
    args = parser.parse_args()

    if args.output_path is None:
        if args.input_file.endswith(".cdsl"):
            generateDummyCDSL(args.input_file)
            generateDummySMDSL("statemachine.smdsl")
            sys.exit(0)
        else:
            print(args.output_path, args.input_file)
            print(parser.error("No output path with non .cdsl file"))
            sys.exit(-1)

    inputFile = args.input_file
    outputPath = args.output_path

    sys.path.append('/opt/robocomp/python')

    new_existing_files = {}

    if inputFile.endswith(".cdsl"):

        component = DSLFactory().from_file(
            inputFile, includeDirectories=args.include_dirs)
        imports = ''.join([imp + '#' for imp in component['imports']])

        # verification
        pool = IDSLPool(imports, args.include_dirs)
        interface_list = component['requires'] + component[
            'implements'] + component['subscribesTo'] + component['publishes']

        for interface_required in interface_list:
            interface_required = interface_required if isinstance(
                interface_required, str) else interface_required[0]
            if not pool.moduleProviding(interface_required):
                raise rcExceptions.InterfaceNotFound(interface_required,
                                                     pool.interfaces())

        if component['language'].lower(
        ) == 'cpp' or component['language'].lower() == 'cpp11':
            #
            # Check output directory
            #
            if not os.path.exists(outputPath):
                create_directory(outputPath)
            # Create directories within the output directory
            try:
                create_directory(outputPath + "/bin")
                create_directory(outputPath + "/etc")
                create_directory(outputPath + "/src")
            except:
                print('There was a problem creating a directory')
                sys.exit(1)
                pass
            #
            # Generate regular files
            #
            files = [
                'CMakeLists.txt', 'DoxyFile', 'README-STORM.txt', 'README.md',
                'etc/config', 'src/main.cpp', 'src/CMakeLists.txt',
                'src/CMakeListsSpecific.txt', 'src/commonbehaviorI.h',
                'src/commonbehaviorI.cpp', 'src/genericmonitor.h',
                'src/genericmonitor.cpp', 'src/config.h',
                'src/specificmonitor.h', 'src/specificmonitor.cpp',
                'src/genericworker.h', 'src/genericworker.cpp',
                'src/specificworker.h', 'src/specificworker.cpp',
                'src/mainUI.ui'
            ]
            specificFiles = [
                'src/specificworker.h', 'src/specificworker.cpp',
                'src/CMakeListsSpecific.txt', 'src/mainUI.ui',
                'src/specificmonitor.h', 'src/specificmonitor.cpp',
                'README.md', 'etc/config'
            ]
            for f in files:
                ofile = outputPath + '/' + f
                if f in specificFiles and os.path.exists(ofile):
                    print('Not overwriting specific file "' + ofile +
                          '", saving it to ' + ofile + '.new')
                    new_existing_files[os.path.abspath(
                        ofile)] = os.path.abspath(ofile) + '.new'
                    ofile += '.new'
                ifile = "/opt/robocomp/share/robocompdsl/templateCPP/" + f
                if f != 'src/mainUI.ui' or component['gui'] is not None:
                    print('Generating', ofile)
                    run = "cog.py -z -d -D theCDSL=" + inputFile + " -D theIDSLs=" + imports + ' -D theIDSLPaths=' + '#'.join(
                        args.include_dirs) + " -o " + ofile + " " + ifile
                    run = run.split(' ')
                    ret = Cog().main(run)
                    if ret != 0:
                        print('ERROR')
                        sys.exit(-1)
                    replaceTagsInFile(ofile)
            #
            # Generate interface-dependent files
            #
            for ima in component['implements']:
                im = ima
                if type(im) != type(''):
                    im = im[0]
                if communicationIsIce(ima):
                    for f in ["SERVANT.H", "SERVANT.CPP"]:
                        ofile = outputPath + '/src/' + im.lower(
                        ) + 'I.' + f.split('.')[-1].lower()
                        print('Generating ', ofile, ' (servant for', im + ')')
                        # Call cog
                        run = "cog.py -z -d -D theCDSL=" + inputFile + " -D theIDSLs=" + imports + ' -D theIDSLPaths=' + '#'.join(
                            args.include_dirs
                        ) + " -D theInterface=" + im + " -o " + ofile + " " + "/opt/robocomp/share/robocompdsl/templateCPP/" + f
                        run = run.split(' ')
                        ret = Cog().main(run)
                        if ret != 0:
                            print('ERROR')
                            sys.exit(-1)
                        replaceTagsInFile(ofile)

            for imp in component['subscribesTo']:
                im = imp
                if type(im) != type(''):
                    im = im[0]
                if communicationIsIce(imp):
                    for f in ["SERVANT.H", "SERVANT.CPP"]:
                        ofile = outputPath + '/src/' + im.lower(
                        ) + 'I.' + f.split('.')[-1].lower()
                        print('Generating ', ofile, ' (servant for', im + ')')
                        # Call cog
                        theInterfaceStr = im
                        if type(theInterfaceStr) == type([]):
                            theInterfaceStr = str(';'.join(im))
                        run = "cog.py -z -d -D theCDSL=" + inputFile + " -D theIDSLs=" + imports + ' -D theIDSLPaths=' + '#'.join(
                            args.include_dirs
                        ) + " -D theInterface=" + theInterfaceStr + " -o " + ofile + " " + "/opt/robocomp/share/robocompdsl/templateCPP/" + f
                        #print(run
                        run = run.split(' ')
                        ret = Cog().main(run)
                        if ret != 0:
                            print('ERROR')
                            sys.exit(-1)
                        replaceTagsInFile(ofile)
        elif component['language'].lower() == 'python':
            #
            # Check output directory
            #
            if not os.path.exists(outputPath):
                create_directory(outputPath)
            # Create directories within the output directory
            try:
                create_directory(outputPath + "/etc")
                create_directory(outputPath + "/src")
            except:
                print('There was a problem creating a directory')
                sys.exit(1)
                pass

            needStorm = False
            for pub in component['publishes']:
                if communicationIsIce(pub):
                    needStorm = True
            for sub in component['subscribesTo']:
                if communicationIsIce(sub):
                    needStorm = True
            #
            # Generate regular files
            #
            files = [
                'CMakeLists.txt', 'DoxyFile', 'README-STORM.txt', 'README.md',
                'etc/config', 'src/main.py', 'src/genericworker.py',
                'src/specificworker.py', 'src/mainUI.ui'
            ]
            specificFiles = [
                'src/specificworker.py', 'src/mainUI.ui', 'README.md',
                'etc/config'
            ]
            for f in files:
                if f == 'src/main.py':
                    ofile = outputPath + '/src/' + component['name'] + '.py'
                else:
                    ofile = outputPath + '/' + f
                if f in specificFiles and os.path.exists(ofile):
                    print('Not overwriting specific file "' + ofile +
                          '", saving it to ' + ofile + '.new')
                    new_existing_files[os.path.abspath(
                        ofile)] = os.path.abspath(ofile) + '.new'
                    ofile += '.new'
                ifile = "/opt/robocomp/share/robocompdsl/templatePython/" + f
                ignoreFile = False
                if f == 'src/mainUI.ui' and component['gui'] is None:
                    ignoreFile = True
                if f == 'CMakeLists.txt' and component['gui'] is None:
                    ignoreFile = True
                if f == 'README-STORM.txt' and needStorm == False:
                    ignoreFile = True
                if not ignoreFile:
                    print('Generating', ofile)
                    run = "cog.py -z -d -D theCDSL=" + inputFile + " -D theIDSLs=" + imports + ' -D theIDSLPaths=' + '#'.join(
                        args.include_dirs) + " -o " + ofile + " " + ifile
                    run = run.split(' ')
                    ret = Cog().main(run)
                    if ret != 0:
                        print('ERROR')
                        sys.exit(-1)
                    replaceTagsInFile(ofile)
                    if f == 'src/main.py':
                        os.chmod(ofile, os.stat(ofile).st_mode | 0o111)
            #
            # Generate interface-dependent files
            #
            for imp in component['implements'] + component['subscribesTo']:
                if type(imp) != type(''):
                    im = imp[0]
                else:
                    im = imp
                if communicationIsIce(imp):
                    for f in ["SERVANT.PY"]:
                        ofile = outputPath + '/src/' + im.lower(
                        ) + 'I.' + f.split('.')[-1].lower()
                        print('Generating', ofile, ' (servant for', im + ')')
                        # Call cog
                        run = "cog.py -z -d -D theCDSL=" + inputFile + " -D theIDSLs=" + imports + ' -D theIDSLPaths=' + '#'.join(
                            args.include_dirs
                        ) + " -D theInterface=" + im + " -o " + ofile + " " + "/opt/robocomp/share/robocompdsl/templatePython/" + f
                        run = run.split(' ')
                        ret = Cog().main(run)
                        if ret != 0:
                            print('ERROR')
                            sys.exit(-1)
                        replaceTagsInFile(ofile)
        else:
            print('Unsupported language', component['language'])

        if component['usingROS'] == True:
            for imp in component['imports']:
                generateROSHeaders(imp, outputPath + "/src", component,
                                   args.include_dirs)

        # Code to launch diff tool on .new files to be compared with their old version
        if args.diff is not None:
            diff_tool, _ = get_diff_tool(prefered=args.diff)
            print(
                "Executing diff tool for existing files. Close if no change is needed."
            )
            for o_file, n_file in new_existing_files.items():
                if not filecmp.cmp(o_file, n_file):
                    print([diff_tool, o_file, n_file])
                    try:
                        subprocess.call([diff_tool, o_file, n_file])
                    except KeyboardInterrupt as e:
                        print(
                            "Comparasion interrupted. All files have been generated. Check this .new files manually:"
                        )
                        for o_file2, n_file2 in new_existing_files.items():
                            if not filecmp.cmp(o_file2, n_file2):
                                print("%s %s" % (o_file2, n_file2))
                        break
                    except Exception as e:
                        print("Exception trying to execute %s" % (diff_tool))
                        print(e.message)

                else:
                    print("Binary equal files %s and %s" % (o_file, n_file))

    elif inputFile.endswith(".idsl"):
        # idsl = IDSLParsing.fromFileIDSL(inputFile)
        print('Generating ICE file ', outputPath)
        # Call cog
        run = "cog.py -z -d" + " -D theIDSL=" + inputFile + ' -D theIDSLPaths=' + '#'.join(
            args.include_dirs
        ) + " -o " + outputPath + " /opt/robocomp/share/robocompdsl/TEMPLATE.ICE"
        run = run.split(' ')
        ret = Cog().main(run)
        if ret != 0:
            print('ERROR')
            sys.exit(-1)
        replaceTagsInFile(outputPath)
Exemplo n.º 15
0
    def generarH(idslFile, imported):
        idsl = DSLFactory().from_file(idslFile)
        try:
            os.system("rm -f " + output_path + "/" + idsl['module']['name'] + "ROS/msg/__init__.py")
            os.system("rm -f " + output_path + "/" + idsl['module']['name'] + "ROS/srv/__init__.py")
        except KeyError:
            print("No module found in %s"%idsl_file)
        for imp in idsl['structs']+idsl['sequences']:
            if imp['type'] in ['struct','sequence']:
                for f in [ "SERVANT.MSG"]:
                    ofile = output_path + "/" + imp['name'] + "." + f.split('.')[-1].lower()
                    print('Generating', ofile, ' (servant for', idslFile.split('.')[0].lower() + ')')

                    ofile_dir = os.path.dirname(ofile)
                    if not os.path.exists(ofile_dir):
                        os.makedirs(ofile_dir)
                    # Call cog
                    run = "cog.py -z -d" + ' -D theIDSLPaths=' + '#'.join(include_directories) + " -D structName=" + imp['name'] + " -D theIDSL=" + idslFile + " -o " + ofile + " " + "/opt/robocomp/share/robocompdsl/templateCPP/" + f
                    run = run.split(' ')
                    ret = Cog().main(run)
                    if ret != 0:
                        print('ERROR')
                        sys.exit(-1)
                    replaceTagsInFile(ofile)
                    commandCPP = "/opt/ros/melodic/lib/gencpp/gen_cpp.py " + ofile + " -Istd_msgs:/opt/ros/melodic/share/std_msgs/msg -I" + idsl['name'] + "ROS:" + output_path
                    commandPY  = "/opt/ros/melodic/lib/genpy/genmsg_py.py " + ofile + " -Istd_msgs:/opt/ros/melodic/share/std_msgs/msg -I" + idsl['name'] + "ROS:" + output_path
                    for impo in imported:
                        if not impo == idsl['module']['name']+"ROS":
                            commandCPP = commandCPP + " -I" + impo + ":" + output_path
                            commandPY  = commandPY + " -I" + impo + ":" + output_path
                    if not os.path.exists(output_path):
                        create_directory(output_path)
                    commandCPP = commandCPP + " -p " + idsl['name'] + "ROS -o " + output_path + "/" + idsl['name'] + "ROS -e /opt/ros/melodic/share/gencpp"
                    commandPY = commandPY + " -p " + idsl['name'] + "ROS -o " + output_path + "/" + idsl['name'] + "ROS/msg"
                    if comp['language'].lower() == 'cpp':
                        os.system(commandCPP)
                    else:
                        os.system(commandPY)
                    try:
                        fileInit = open(output_path + "/" + idsl['name'] + "ROS/msg/__init__.py", 'a')
                        fileInit.write("from ._"+imp['name']+" import *\n")
                        fileInit.close()
                    except:
                        pass
        for imp in idsl['interfaces']:
                for ima in [comp['implements']+comp['requires']]:
                    im = ima
                    if type(im) != type(''):
                        im = im[0]
                    if not communication_is_ice(ima) and im == imp['name']:
                        for method in imp['methods'].values():
                            if 'params' in method:
                                if len(method['params']) == 2:
                                    for f in [ "SERVANT.SRV"]:
                                        ofile = output_path + "/" + method['name'] + "." + f.split('.')[-1].lower()
                                        print('Generating', ofile, ' (servant for', idslFile.split('.')[0].lower() + ')')
                                        # Call cog
                                        run = "cog.py -z -d" + ' -D theIDSLPaths=' + '#'.join(include_directories) + " -D methodName=" + method['name'] + " -D theIDSL=" + idslFile + " -o " + ofile + " " + "/opt/robocomp/share/robocompdsl/templateCPP/" + f
                                        run = run.split(' ')
                                        ret = Cog().main(run)
                                        if ret != 0:
                                            print('ERROR')
                                            sys.exit(-1)
                                        replaceTagsInFile(ofile)
                                        commandCPP = "/opt/ros/melodic/lib/gencpp/gen_cpp.py " + ofile + " -Istd_msgs:/opt/ros/melodic/share/std_msgs/msg -Istd_srvs:/opt/ros/melodic/share/std_srv/cmake/../srv -I" + idsl['module']['name'] + "ROS:" + output_path
                                        commandPY  = "/opt/ros/melodic/lib/genpy/gensrv_py.py " + ofile + " -Istd_msgs:/opt/ros/melodic/share/std_msgs/msg -Istd_srvs:/opt/ros/kinetic/share/std_srv/cmake/../srv -I" + idsl['module']['name'] + "ROS:" + output_path
                                        for impo in imported:
                                            if not impo == idsl['module']['name']+"ROS":
                                                commandCPP = commandCPP + " -I" + impo + ":" + output_path
                                                commandPY  = commandPY + " -I" + impo + ":" + output_path
                                        if not os.path.exists(output_path):
                                            create_directory(output_path)
                                        commandCPP = commandCPP + " -p " + idsl['module']['name'] + "ROS -o " + output_path + "/" + idsl['module']['name'] + "ROS -e /opt/ros/melodic/share/gencpp/cmake/.."
                                        commandPY = commandPY + " -p " + idsl['module']['name'] + "ROS -o " + output_path + "/" + idsl['module']['name'] + "ROS/srv"
                                        if comp['language'].lower() == 'cpp':
                                            os.system(commandCPP)
                                        else:
                                            os.system(commandPY)
                                        try:
                                            fileInit = open(output_path + "/" + idsl['module']['name'] + "ROS/srv/__init__.py", 'a')
                                            fileInit.write("from ._"+method['name']+" import *\n")
                                            fileInit.close()
                                        except:
                                            pass
                                else:
                                    print("error: ROS service with incorrect number of parameters. ROS only supports remote procedure calls of the form: void method(type inVar, out type outVar);")
                                    for param in enumerate(method['params']):
                                        print(param[0], '-->', param[1])
                                    sys.exit(-1)
                            else:
                                print("error: service without params. Form is: void method(type inVar, out type outVar);")
                                sys.exit(-1)
        os.system("touch " + output_path + "/" + idsl['module']['name'] + "ROS/__init__.py")
        return idsl['module']['name']+"ROS"