Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrik Rentz-Reichert2019-06-28 12:30:42 +0000
committerHenrik Rentz-Reichert2019-06-28 17:56:33 +0000
commita877df88488833e5f057ad56fafaef78171c0c5a (patch)
tree502cb2bc20057f29c3901887f5713f6d8d801893 /plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c
parent934759368615c62e0133b4b7b214438567f53859 (diff)
downloadorg.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')
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ActorClassGen.xtend6
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CExtensions.xtend56
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeGen.xtend12
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeRunnerGen.xtend2
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/StateMachineGen.xtend2
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorOptions.java18
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorOptionsHelper.java5
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);
+ }
}

Back to the top