diff options
author | Johannes Schanda <schanda@itestra.de> | 2013-06-17 11:41:37 +0200 |
---|---|---|
committer | Johannes Schanda <schanda@itestra.de> | 2013-06-17 11:41:37 +0200 |
commit | ce606d9e649aa7b04e400d7f89e48034da51d31d (patch) | |
tree | 48648b69ebede00713047dffb5d015bdae466e21 | |
parent | 773c5104ede00dddb2b9dd69ad30743518de184f (diff) | |
download | genivi-common-api-runtime-ce606d9e649aa7b04e400d7f89e48034da51d31d.tar.gz |
Set macro for compile guard
- Adds macro defenition for inclusion of commonapi headers
- Rework heder path generation to make distinction between library and
generated headers for correct macro placement
5 files changed, 129 insertions, 55 deletions
diff --git a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FInterfaceGenerator.xtend b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FInterfaceGenerator.xtend index 311c3ed..790d614 100644 --- a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FInterfaceGenerator.xtend +++ b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FInterfaceGenerator.xtend @@ -10,6 +10,8 @@ import javax.inject.Inject import org.eclipse.xtext.generator.IFileSystemAccess import org.franca.core.franca.FInterface import org.genivi.commonapi.core.deployment.DeploymentInterfacePropertyAccessor +import java.util.Collection +import java.util.HashSet class FInterfaceGenerator { @Inject private extension FTypeGenerator @@ -27,11 +29,23 @@ class FInterfaceGenerator { «generateCommonApiLicenseHeader» #ifndef «fInterface.defineName»_H_ #define «fInterface.defineName»_H_ - - «FOR requiredHeaderFile : fInterface.requiredHeaderFiles.sort» + + «val libraryHeaders = new HashSet<String>» + «val generatedHeaders = new HashSet<String>» + «fInterface.getRequiredHeaderFiles(generatedHeaders, libraryHeaders)» + + «FOR requiredHeaderFile : generatedHeaders.sort» #include <«requiredHeaderFile»> «ENDFOR» - + + #define COMMONAPI_INTERNAL_COMPILATION + + «FOR requiredHeaderFile : libraryHeaders.sort» + #include <«requiredHeaderFile»> + «ENDFOR» + + #undef COMMONAPI_INTERNAL_COMPILATION + «fInterface.model.generateNamespaceBeginDeclaration» class «fInterface.name»«IF fInterface.base != null»: public «fInterface.base.getRelativeNameReference(fInterface)»«ENDIF» { @@ -95,11 +109,10 @@ class FInterfaceGenerator { «fInterface.model.generateNamespaceEndDeclaration» ''' - def private getRequiredHeaderFiles(FInterface fInterface) { - val headerSet = newHashSet('CommonAPI/types.h') - fInterface.types.forEach[addRequiredHeaders(headerSet)] - headerSet.remove(fInterface.headerPath) - return headerSet + def void getRequiredHeaderFiles(FInterface fInterface, Collection<String> generatedHeaders, Collection<String> libraryHeaders) { + libraryHeaders.add('CommonAPI/types.h') + fInterface.types.forEach[addRequiredHeaders(generatedHeaders, libraryHeaders)] + generatedHeaders.remove(fInterface.headerPath) } def private hasSourceFile(FInterface fInterface) { diff --git a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FInterfaceProxyGenerator.xtend b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FInterfaceProxyGenerator.xtend index 5d361bc..038948a 100644 --- a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FInterfaceProxyGenerator.xtend +++ b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FInterfaceProxyGenerator.xtend @@ -16,6 +16,7 @@ import org.franca.core.franca.FMethod import org.genivi.commonapi.core.deployment.DeploymentInterfacePropertyAccessor import static com.google.common.base.Preconditions.* +import java.util.HashSet class FInterfaceProxyGenerator { @Inject private extension FTypeGenerator @@ -30,9 +31,23 @@ class FInterfaceProxyGenerator { «generateCommonApiLicenseHeader» #ifndef «fInterface.defineName»_PROXY_BASE_H_ #define «fInterface.defineName»_PROXY_BASE_H_ - + #include "«fInterface.headerFile»" - «fInterface.generateRequiredTypeIncludes» + + «val generatedHeaders = new HashSet<String>» + «val libraryHeaders = new HashSet<String>» + «fInterface.generateRequiredTypeIncludes(generatedHeaders, libraryHeaders)» + + «FOR requiredHeaderFile : generatedHeaders.sort» + #include <«requiredHeaderFile»> + «ENDFOR» + + #define COMMONAPI_INTERNAL_COMPILATION + + «FOR requiredHeaderFile : libraryHeaders.sort» + #include <«requiredHeaderFile»> + «ENDFOR» + «IF fInterface.hasAttributes» #include <CommonAPI/Attribute.h> «ENDIF» @@ -44,6 +59,8 @@ class FInterfaceProxyGenerator { #include <functional> #include <future> «ENDIF» + + #undef COMMONAPI_INTERNAL_COMPILATION «fInterface.model.generateNamespaceBeginDeclaration» @@ -94,11 +111,16 @@ class FInterfaceProxyGenerator { #define «fInterface.defineName»_PROXY_H_ #include "«fInterface.proxyBaseHeaderFile»" + + #define COMMONAPI_INTERNAL_COMPILATION + «IF fInterface.hasAttributes» #include <CommonAPI/AttributeExtension.h> #include <CommonAPI/Factory.h> «ENDIF» + #undef COMMONAPI_INTERNAL_COMPILATION + «fInterface.model.generateNamespaceBeginDeclaration» template <typename ... _AttributeExtensions> diff --git a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FInterfaceStubGenerator.xtend b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FInterfaceStubGenerator.xtend index 567096d..19b66fc 100644 --- a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FInterfaceStubGenerator.xtend +++ b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FInterfaceStubGenerator.xtend @@ -10,6 +10,7 @@ import javax.inject.Inject import org.eclipse.xtext.generator.IFileSystemAccess import org.franca.core.franca.FAttribute import org.franca.core.franca.FInterface +import java.util.HashSet class FInterfaceStubGenerator { @Inject private extension FTypeGenerator @@ -26,10 +27,27 @@ class FInterfaceStubGenerator { #ifndef «fInterface.defineName»_STUB_H_ #define «fInterface.defineName»_STUB_H_ - «fInterface.generateRequiredTypeIncludes» + «val generatedHeaders = new HashSet<String>» + «val libraryHeaders = new HashSet<String>» + + «fInterface.generateRequiredTypeIncludes(generatedHeaders, libraryHeaders)» + + «FOR requiredHeaderFile : generatedHeaders.sort» + #include <«requiredHeaderFile»> + «ENDFOR» + #include "«fInterface.name».h" + + #define COMMONAPI_INTERNAL_COMPILATION + + «FOR requiredHeaderFile : libraryHeaders.sort» + #include <«requiredHeaderFile»> + «ENDFOR» + #include <CommonAPI/Stub.h> + #undef COMMONAPI_INTERNAL_COMPILATION + «fInterface.model.generateNamespaceBeginDeclaration» /** diff --git a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeCollectionGenerator.xtend b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeCollectionGenerator.xtend index eb70ba9..81b189d 100644 --- a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeCollectionGenerator.xtend +++ b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeCollectionGenerator.xtend @@ -11,6 +11,8 @@ import org.eclipse.xtext.generator.IFileSystemAccess import org.franca.core.franca.FStructType import org.franca.core.franca.FTypeCollection import org.genivi.commonapi.core.deployment.DeploymentInterfacePropertyAccessor +import java.util.HashSet +import java.util.Collection class FTypeCollectionGenerator { @Inject private extension FTypeGenerator @@ -29,9 +31,21 @@ class FTypeCollectionGenerator { #ifndef «fTypeCollection.defineName»_H_ #define «fTypeCollection.defineName»_H_ - «FOR requiredHeaderFile : fTypeCollection.requiredHeaderFiles.sort» + «val libraryHeaders = new HashSet<String>» + «val generatedHeaders = new HashSet<String>» + «fTypeCollection.getRequiredHeaderFiles(generatedHeaders, libraryHeaders)» + + «FOR requiredHeaderFile : generatedHeaders.sort» #include <«requiredHeaderFile»> «ENDFOR» + + #define COMMONAPI_INTERNAL_COMPILATION + + «FOR requiredHeaderFile : libraryHeaders.sort» + #include <«requiredHeaderFile»> + «ENDFOR» + + #undef COMMONAPI_INTERNAL_COMPILATION «fTypeCollection.model.generateNamespaceBeginDeclaration» @@ -91,12 +105,11 @@ class FTypeCollectionGenerator { } // namespace «fTypeCollection.name» «fTypeCollection.model.generateNamespaceEndDeclaration» ''' - - def private getRequiredHeaderFiles(FTypeCollection fTypeCollection) { - val headerSet = newHashSet('CommonAPI/types.h') - fTypeCollection.types.forEach[addRequiredHeaders(headerSet)] - headerSet.remove(fTypeCollection.headerPath) - return headerSet + + def void getRequiredHeaderFiles(FTypeCollection fInterface, Collection<String> generatedHeaders, Collection<String> libraryHeaders) { + libraryHeaders.add('CommonAPI/types.h') + fInterface.types.forEach[addRequiredHeaders(generatedHeaders, libraryHeaders)] + generatedHeaders.remove(fInterface.headerPath) } def private hasSourceFile(FTypeCollection fTypeCollection) { diff --git a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend index 514cb1b..2d0ca2e 100644 --- a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend +++ b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend @@ -286,64 +286,57 @@ class FTypeGenerator { return (fType instanceof FStructType); } - def generateRequiredTypeIncludes(FInterface fInterface) ''' - «FOR requiredTypeHeaderFile : fInterface.requiredTypeHeaderFiles» - #include <«requiredTypeHeaderFile»> - «ENDFOR» - ''' - - def private getRequiredTypeHeaderFiles(FInterface fInterface) { - val headerSet = new HashSet<String> - - fInterface.attributes.forEach[type.derived?.addRequiredHeaders(headerSet)] + def void generateRequiredTypeIncludes(FInterface fInterface, Collection<String> generatedHeaders, Collection<String> libraryHeaders) { + fInterface.attributes.forEach[type.derived?.addRequiredHeaders(generatedHeaders, libraryHeaders)] fInterface.methods.forEach[ - inArgs.forEach[type.derived?.addRequiredHeaders(headerSet)] - outArgs.forEach[type.derived?.addRequiredHeaders(headerSet)] + inArgs.forEach[type.derived?.addRequiredHeaders(generatedHeaders, libraryHeaders)] + outArgs.forEach[type.derived?.addRequiredHeaders(generatedHeaders, libraryHeaders)] ] - fInterface.broadcasts.forEach[outArgs.forEach[type.derived?.addRequiredHeaders(headerSet)]] - - headerSet.remove(fInterface.headerPath) + fInterface.broadcasts.forEach[outArgs.forEach[type.derived?.addRequiredHeaders(generatedHeaders, libraryHeaders)]] - return headerSet + generatedHeaders.remove(fInterface.headerPath) } - def addRequiredHeaders(FType fType, Collection<String> requiredHeaders) { - requiredHeaders.add(fType.FTypeCollection.headerPath) - fType.addFTypeRequiredHeaders(requiredHeaders) + def addRequiredHeaders(FType fType, Collection<String> generatedHeaders, Collection<String> libraryHeaders) { + generatedHeaders.add(fType.FTypeCollection.headerPath) + fType.addFTypeRequiredHeaders(generatedHeaders, libraryHeaders) } def private getFTypeCollection(FType fType) { fType.eContainer as FTypeCollection } - def private dispatch void addFTypeRequiredHeaders(FTypeDef fTypeDef, Collection<String> requiredHeaders) { - requiredHeaders.add(fTypeDef.actualType.requiredHeaderPath) + def private dispatch void addFTypeRequiredHeaders(FTypeDef fTypeDef, Collection<String> generatedHeaders, Collection<String> libraryHeaders) { + fTypeDef.actualType.getRequiredHeaderPath(generatedHeaders, libraryHeaders) } - def private dispatch void addFTypeRequiredHeaders(FArrayType fArrayType, Collection<String> requiredHeaders) { - requiredHeaders.addAll('vector', fArrayType.elementType.requiredHeaderPath) + def private dispatch void addFTypeRequiredHeaders(FArrayType fArrayType, Collection<String> generatedHeaders, Collection<String> libraryHeaders) { + libraryHeaders.add('vector') + fArrayType.elementType.getRequiredHeaderPath(generatedHeaders, libraryHeaders) } - def private dispatch void addFTypeRequiredHeaders(FMapType fMapType, Collection<String> requiredHeaders) { - requiredHeaders.addAll('unordered_map', fMapType.keyType.requiredHeaderPath, fMapType.valueType.requiredHeaderPath) + def private dispatch void addFTypeRequiredHeaders(FMapType fMapType, Collection<String> generatedHeaders, Collection<String> libraryHeaders) { + libraryHeaders.add('unordered_map') + fMapType.keyType.getRequiredHeaderPath(generatedHeaders, libraryHeaders) + fMapType.valueType.getRequiredHeaderPath(generatedHeaders, libraryHeaders) } - def private dispatch void addFTypeRequiredHeaders(FStructType fStructType, Collection<String> requiredHeaders) { + def private dispatch void addFTypeRequiredHeaders(FStructType fStructType, Collection<String> generatedHeaders, Collection<String> libraryHeaders) { if (fStructType.base != null) - requiredHeaders.add(fStructType.base.FTypeCollection.headerPath) + generatedHeaders.add(fStructType.base.FTypeCollection.headerPath) else - requiredHeaders.addAll('CommonAPI/InputStream.h', 'CommonAPI/OutputStream.h', 'CommonAPI/SerializableStruct.h') - fStructType.elements.forEach[requiredHeaders.add(type.requiredHeaderPath)] + libraryHeaders.addAll('CommonAPI/InputStream.h', 'CommonAPI/OutputStream.h', 'CommonAPI/SerializableStruct.h') + fStructType.elements.forEach[type.getRequiredHeaderPath(generatedHeaders, libraryHeaders)] } - def private dispatch void addFTypeRequiredHeaders(FEnumerationType fEnumerationType, Collection<String> requiredHeaders) { + def private dispatch void addFTypeRequiredHeaders(FEnumerationType fEnumerationType, Collection<String> generatedHeaders, Collection<String> libraryHeaders) { if (fEnumerationType.base != null) - requiredHeaders.add(fEnumerationType.base.FTypeCollection.headerPath) - requiredHeaders.addAll('cstdint', 'CommonAPI/InputStream.h', 'CommonAPI/OutputStream.h') + generatedHeaders.add(fEnumerationType.base.FTypeCollection.headerPath) + libraryHeaders.addAll('cstdint', 'CommonAPI/InputStream.h', 'CommonAPI/OutputStream.h') } - def private dispatch void addFTypeRequiredHeaders(FUnionType fUnionType, Collection<String> requiredHeaders) { + def private dispatch void addFTypeRequiredHeaders(FUnionType fUnionType, Collection<String> generatedHeaders, Collection<String> libraryHeaders) { if (fUnionType.base != null) - requiredHeaders.add(fUnionType.base.FTypeCollection.headerPath) + generatedHeaders.add(fUnionType.base.FTypeCollection.headerPath) else - requiredHeaders.add('CommonAPI/SerializableVariant.h') - fUnionType.elements.forEach[requiredHeaders.add(type.requiredHeaderPath)] - requiredHeaders.addAll('cstdint', 'memory') + libraryHeaders.add('CommonAPI/SerializableVariant.h') + fUnionType.elements.forEach[type.getRequiredHeaderPath(generatedHeaders, libraryHeaders)] + libraryHeaders.addAll('cstdint', 'memory') } def private getRequiredHeaderPath(FTypeRef fTypeRef) { @@ -359,6 +352,21 @@ class FTypeGenerator { default : 'cstdint' } } + + def private void getRequiredHeaderPath(FTypeRef fTypeRef, Collection<String> generatedHeaders, Collection<String> libraryHeaders) { + if (fTypeRef.derived != null) { + generatedHeaders.add(fTypeRef.derived.FTypeCollection.headerPath) + } + fTypeRef.predefined.getRequiredHeaderPath(generatedHeaders, libraryHeaders) + } + + def private void getRequiredHeaderPath(FBasicTypeId fBasicTypeId, Collection<String> generatedHeaders, Collection<String> libraryHeaders) { + switch fBasicTypeId { + case FBasicTypeId::STRING : libraryHeaders.add('string') + case FBasicTypeId::BYTE_BUFFER : libraryHeaders.add('CommonAPI/ByteBuffer.h') + default : libraryHeaders.add('cstdint') + } + } def private getClassNamespace(FModelElement child, FModelElement parent) { child.getClassNamespaceWithName(child.name, parent, parent.name) |