diff options
author | Henrik Rentz-Reichert | 2019-06-28 12:30:42 +0000 |
---|---|---|
committer | Henrik Rentz-Reichert | 2019-06-28 17:56:33 +0000 |
commit | a877df88488833e5f057ad56fafaef78171c0c5a (patch) | |
tree | 502cb2bc20057f29c3901887f5713f6d8d801893 /plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c | |
parent | 934759368615c62e0133b4b7b214438567f53859 (diff) | |
download | org.eclipse.etrice-a877df88488833e5f057ad56fafaef78171c0c5a.tar.gz org.eclipse.etrice-a877df88488833e5f057ad56fafaef78171c0c5a.tar.xz org.eclipse.etrice-a877df88488833e5f057ad56fafaef78171c0c5a.zip |
Bug 539945 - Provide C++ option for the C code generator
* runtime.c headers with extern "C" for C++
* generator with switch for C++ file extensions *.cpp/*.hpp
* introduced explicit casts where C++ compiler requires them
Change-Id: I0aba20a9fde24e1355427bc53b758cee223b9e60
Diffstat (limited to 'plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c')
7 files changed, 79 insertions, 22 deletions
diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ActorClassGen.xtend b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ActorClassGen.xtend index 347375f60..f199c8b25 100644 --- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ActorClassGen.xtend +++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ActorClassGen.xtend @@ -153,7 +153,7 @@ class ActorClassGen extends GenericActorClassGenerator { «IF hasVarData» struct «ac.name» { «IF hasConstData» - const «ac.name»_const* const constData; + const «ac.name»_const* ET_CONST_MEMBER constData; «ENDIF» /* data send ports */ @@ -377,9 +377,9 @@ class ActorClassGen extends GenericActorClassGenerator { ET_MSC_LOGGER_SYNC_ENTRY("«ac.name»", "_receiveMessage") «IF !isEmptyStateGraph» «IF handleEvents» - «langExt.operationScope(ac.name, false)»receiveEvent(self, (etPort*)ifitem, msg->evtID, (void*)(((char*)msg)+MEM_CEIL(sizeof(etMessage)))); + «langExt.operationScope(ac.name, false)»receiveEvent((«ac.name»*) self, (etPort*)ifitem, msg->evtID, (void*)(((char*)msg)+MEM_CEIL(sizeof(etMessage)))); «ELSE» - «langExt.operationScope(ac.name, false)»receiveEventInternal(self); + «langExt.operationScope(ac.name, false)»receiveEventInternal((«ac.name»*) self); «ENDIF» «ENDIF» diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CExtensions.xtend b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CExtensions.xtend index 79502585c..d36852cc5 100644 --- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CExtensions.xtend +++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CExtensions.xtend @@ -37,15 +37,15 @@ import org.eclipse.etrice.core.room.ExternalType import org.eclipse.etrice.core.room.Message import org.eclipse.etrice.core.room.MessageData import org.eclipse.etrice.core.room.PrimitiveType +import org.eclipse.etrice.core.room.RefableType import org.eclipse.etrice.core.room.RoomClass import org.eclipse.etrice.core.room.RoomModel +import org.eclipse.etrice.core.room.VarDecl import org.eclipse.etrice.core.room.util.RoomHelpers import org.eclipse.etrice.generator.c.Main import org.eclipse.etrice.generator.c.setup.GeneratorOptionsHelper import org.eclipse.etrice.generator.generic.ILanguageExtension import org.eclipse.xtext.util.Pair -import org.eclipse.etrice.core.room.VarDecl -import org.eclipse.etrice.core.room.RefableType @Singleton class CExtensions implements ILanguageExtension { @@ -96,42 +96,60 @@ class CExtensions implements ILanguageExtension { /* TODO: move specific code elsewhere */ // used def String getCHeaderFileName(RoomClass rc) { - return rc.name+".h"; + return rc.name+headerExtension; } // used def String getCSourceFileName(RoomClass rc) { - return rc.name+".c"; + return rc.name + sourceExtension; } // used def String getCUtilsFileName(RoomClass rc) { - return rc.name+"_Utils.h"; + return rc.name+"_Utils" + headerExtension; } def String getInstSourceFileName(RoomClass rc) { - return rc.name+"_Inst.h"; + return rc.name+"_Inst" + headerExtension; } def String getDispSourceFileName(RoomClass rc) { - return rc.name+"_Disp.h"; + return rc.name+"_Disp" + headerExtension; } // used def String getCHeaderFileName(NodeRef nr, SubSystemInstance ssi) { - return nr.name+"_"+ssi.name+".h"; + return nr.name+"_"+ssi.name + headerExtension; } def String getCSourceFileName(NodeRef nr, SubSystemInstance ssi) { - return nr.name+"_"+ssi.name+".c"; + return nr.name+"_"+ssi.name + sourceExtension; } def String getInstSourceFileName(NodeRef nr, SubSystemInstance ssi) { - return nr.name+"_"+ssi.name+"_Inst.h"; + return nr.name+"_"+ssi.name+"_Inst" + headerExtension; } def String getDispSourceFileName(NodeRef nr, SubSystemInstance ssi) { - return nr.name+"_"+ssi.name+"_Disp.h"; + return nr.name+"_"+ssi.name+"_Disp" + headerExtension; + } + + def String headerExtension() { + if (Main.settings.isCppFileExtensions) { + ".hpp"; + } + else { + ".h"; + } + } + + def String sourceExtension() { + if (Main.settings.isCppFileExtensions) { + ".cpp"; + } + else { + ".c"; + } } def getIncludeGuardString(String filename){ @@ -161,6 +179,22 @@ class CExtensions implements ILanguageExtension { ''' } + def generateCppExternCBegin() { + ''' + #ifdef __cplusplus + extern „C“ { + #endif // __cplusplus + ''' + } + + def generateCppExternCEnd() { + ''' + #ifdef __cplusplus + } + #endif // __cplusplus + ''' + } + override boolean usesInheritance() { return false } diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeGen.xtend b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeGen.xtend index 185b0eb8a..7e7cf3e24 100644 --- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeGen.xtend +++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeGen.xtend @@ -380,7 +380,7 @@ class NodeGen { /* forward declaration of variable actor structs */ «FOR ai : ssi.allContainedInstances» - static «ai.actorClass.name» «ai.path.getPathName()»; + ET_FOWARD_DECLARATION_OF_INST_VAR «ai.actorClass.name» «ai.path.getPathName()»; «ENDFOR» /* forward declaration of variable port structs */ @@ -390,7 +390,7 @@ class NodeGen { «ELSE» «FOR pi:ai.orderedIfItemInstances» «IF pi.portClassAttributesSize > 0» - static «pi.protocol.getPortClassName(pi.conjugated)»_var «pi.path.pathName»_var«IF pi.replicated»[«pi.peers.size»]«ENDIF»={ + ET_FOWARD_DECLARATION_OF_INST_VAR «pi.protocol.getPortClassName(pi.conjugated)»_var «pi.path.pathName»_var«IF pi.replicated»[«pi.peers.size»]«ENDIF»={ «FOR Integer i:1.. if(pi.peers.size==0)1 else pi.peers.size SEPARATOR ', '» «attrInitGenAddon.generateAttributeInit(pi, pi.interfaceItem.portClass.attributes)» «ENDFOR»}; @@ -467,7 +467,7 @@ class NodeGen { «genPeerPortArrays(root, ai)» «ENDIF» «IF haveReplSubItems» - static const etReplSubPort «replSubPortsArray»[«offset»] = { + ET_INITIALIZATION_OF_INST_VAR const etReplSubPort «replSubPortsArray»[«offset»] = { /* Replicated Sub Ports: {varData, msgService, peerAddress, localId, index} */ «FOR pi : replEventItems.filter(e|!e.peers.empty) SEPARATOR ","» «genReplSubPortInitializers(root, ai, pi)» @@ -475,7 +475,7 @@ class NodeGen { }; «ENDIF» «IF haveConstData» - static «const» «ai.actorClass.name»_const «instName»_const = { + ET_INITIALIZATION_OF_INST_VAR «const» «ai.actorClass.name»_const «instName»_const = { «IF Main::settings.generateMSCInstrumentation» «sep»"«ai.path»" @@ -507,7 +507,7 @@ class NodeGen { «ENDFOR» }; «ENDIF» - static «ai.actorClass.name» «instName» = { + ET_INITIALIZATION_OF_INST_VAR «ai.actorClass.name» «instName» = { «IF haveConstData» &«instName»_const, @@ -682,7 +682,7 @@ class NodeGen { static void MsgDispatcher_«thread.name»_poll(void){ ET_MSC_LOGGER_SYNC_ENTRY("MsgDispatcher_«thread.name»", "execute") «FOR ai : executedInstances» - «ai.actorClass.name»_execute((void*)&«ai.path.pathName»); + «ai.actorClass.name»_execute((«ai.actorClass.name»*)&«ai.path.pathName»); «ENDFOR» ET_MSC_LOGGER_SYNC_EXIT } diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeRunnerGen.xtend b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeRunnerGen.xtend index 18e90df79..da14d915f 100644 --- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeRunnerGen.xtend +++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeRunnerGen.xtend @@ -43,7 +43,7 @@ class NodeRunnerGen { if (ssi!==null) { val clsname = nr.name+"_"+ssi.name val path = ssi.subSystemClass.getPath - val file = clsname + "_Runner.c" + val file = clsname + "_Runner" + sourceExtension fileIO.generateFile("generating Node runner file", path + file, root.generateSourceFile(ssi, first)) first = false } diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/StateMachineGen.xtend b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/StateMachineGen.xtend index 901ccf7cc..6af88d94e 100644 --- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/StateMachineGen.xtend +++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/StateMachineGen.xtend @@ -76,7 +76,7 @@ class StateMachineGen extends GenericStateMachineGenerator { ''' «IF Main::settings.generateMSCInstrumentation» /* state names */ - static char* stateStrings[] = {"<no state>","<top>",«FOR state : states SEPARATOR ","»"«state.genStatePathName»" + static const char* stateStrings[] = {"<no state>","<top>",«FOR state : states SEPARATOR ","»"«state.genStatePathName»" «ENDFOR»}; «ENDIF» diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorOptions.java b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorOptions.java index 14f436d44..d33a3f414 100644 --- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorOptions.java +++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorOptions.java @@ -15,8 +15,26 @@ package org.eclipse.etrice.generator.c.setup; +import java.util.List; + import org.eclipse.etrice.generator.base.AbstractGeneratorOptions; +import org.eclipse.etrice.generator.base.args.BooleanOption; +import org.eclipse.etrice.generator.base.args.Option; public class GeneratorOptions extends AbstractGeneratorOptions { + + public static final BooleanOption CPP_FILE_EXTENSIONS = new BooleanOption( + GROUP_ETRICE, + "cppfileextensions", + "cppFileExtensions", + "if specified the file extensions for C source and header files will be *.cpp and *.hpp resp.'", + false); + + @Override + public void configure(List<Option<?>> options) { + super.configure(options); + + options.add(CPP_FILE_EXTENSIONS); + } } diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorOptionsHelper.java b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorOptionsHelper.java index 36c5d9029..df00a4e24 100644 --- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorOptionsHelper.java +++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorOptionsHelper.java @@ -16,7 +16,12 @@ package org.eclipse.etrice.generator.c.setup; import org.eclipse.etrice.generator.base.AbstractGeneratorOptionsHelper; +import org.eclipse.etrice.generator.base.args.Arguments; public class GeneratorOptionsHelper extends AbstractGeneratorOptionsHelper { + + public boolean isCppFileExtensions(Arguments args) { + return args.get(GeneratorOptions.CPP_FILE_EXTENSIONS); + } } |