diff --git a/bin/configs/cpp-qt-client.yaml b/bin/configs/cpp-qt-client.yaml index 26f46eae4ae..c10d98ae60e 100644 --- a/bin/configs/cpp-qt-client.yaml +++ b/bin/configs/cpp-qt-client.yaml @@ -3,5 +3,6 @@ outputDir: samples/client/petstore/cpp-qt inputSpec: modules/openapi-generator/src/test/resources/3_0/cpp-qt/petstore.yaml templateDir: modules/openapi-generator/src/main/resources/cpp-qt-client additionalProperties: + packageName: CppQtPetstoreClient cppNamespace: test_namespace modelNamePrefix: PFX diff --git a/docs/generators/cpp-qt-client.md b/docs/generators/cpp-qt-client.md index c7da6c1da09..09d65c8ea42 100644 --- a/docs/generators/cpp-qt-client.md +++ b/docs/generators/cpp-qt-client.md @@ -27,6 +27,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |legacyDiscriminatorBehavior|Set to false for generators with better support for discriminators. (Python, Java, Go, PowerShell, C#have this enabled by default).|
**true**
The mapping in the discriminator includes descendent schemas that allOf inherit from self and the discriminator mapping schemas in the OAS document.
**false**
The mapping in the discriminator includes any descendent schemas that allOf inherit from self, any oneOf schemas, any anyOf schemas, any x-discriminator-values, and the discriminator mapping schemas in the OAS document AND Codegen validates that oneOf and anyOf schemas contain the required discriminator and throws an error if the discriminator is missing.
|true| |modelNamePrefix|Prefix that will be prepended to all model names.| |OAI| |optionalProjectFile|Generate client.pri.| |true| +|packageName|C++ package (library) name.| |QtOpenAPIClient| |prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false| |reservedWordPrefix|Prefix to prepend to reserved words in order to avoid conflicts| |r_| |sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQtClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQtClientCodegen.java index 6785239ef04..35f6ae0bd99 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQtClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQtClientCodegen.java @@ -31,6 +31,8 @@ import static org.openapitools.codegen.utils.StringUtils.*; public class CppQtClientCodegen extends CppQtAbstractCodegen implements CodegenConfig { public static final String OPTIONAL_PROJECT_FILE_DESC = "Generate client.pri."; + public static final String DEFAULT_PACKAGE_NAME = "QtOpenAPIClient"; + protected String packageName = ""; // source folder where to write the files protected String sourceFolder = "client"; protected boolean optionalProjectFileFlag = true; @@ -89,7 +91,10 @@ public class CppQtClientCodegen extends CppQtAbstractCodegen implements CodegenC */ embeddedTemplateDir = templateDir = "cpp-qt-client"; + // CLI options + addOption(CodegenConstants.PACKAGE_NAME, "C++ package (library) name.", DEFAULT_PACKAGE_NAME); addSwitch(CodegenConstants.OPTIONAL_PROJECT_FILE, OPTIONAL_PROJECT_FILE_DESC, this.optionalProjectFileFlag); + supportingFiles.add(new SupportingFile("helpers-header.mustache", sourceFolder, PREFIX + "Helpers.h")); supportingFiles.add(new SupportingFile("helpers-body.mustache", sourceFolder, PREFIX + "Helpers.cpp")); supportingFiles.add(new SupportingFile("HttpRequest.h.mustache", sourceFolder, PREFIX + "HttpRequest.h")); @@ -103,6 +108,7 @@ public class CppQtClientCodegen extends CppQtAbstractCodegen implements CodegenC supportingFiles.add(new SupportingFile("oauth.cpp.mustache", sourceFolder, PREFIX + "Oauth.cpp")); supportingFiles.add(new SupportingFile("oauth.h.mustache", sourceFolder, PREFIX + "Oauth.h")); supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); + supportingFiles.add(new SupportingFile("CMakeConfig.mustache", sourceFolder, "Config.cmake.in")); supportingFiles.add(new SupportingFile("CMakeLists.txt.mustache", sourceFolder, "CMakeLists.txt")); if (optionalProjectFileFlag) { supportingFiles.add(new SupportingFile("Project.mustache", sourceFolder, "client.pri")); @@ -117,12 +123,16 @@ public class CppQtClientCodegen extends CppQtAbstractCodegen implements CodegenC public void processOpts() { super.processOpts(); + packageName = (String) additionalProperties.getOrDefault(CodegenConstants.PACKAGE_NAME, DEFAULT_PACKAGE_NAME); + if (additionalProperties.containsKey(CodegenConstants.OPTIONAL_PROJECT_FILE)) { setOptionalProjectFileFlag(convertPropertyToBooleanAndWriteBack(CodegenConstants.OPTIONAL_PROJECT_FILE)); } else { additionalProperties.put(CodegenConstants.OPTIONAL_PROJECT_FILE, optionalProjectFileFlag); } + additionalProperties.put(CodegenConstants.PACKAGE_NAME, packageName); + if (additionalProperties.containsKey("modelNamePrefix")) { supportingFiles.clear(); supportingFiles.add(new SupportingFile("helpers-header.mustache", sourceFolder, modelNamePrefix + "Helpers.h")); @@ -138,6 +148,7 @@ public class CppQtClientCodegen extends CppQtAbstractCodegen implements CodegenC supportingFiles.add(new SupportingFile("oauth.cpp.mustache", sourceFolder, modelNamePrefix + "Oauth.cpp")); supportingFiles.add(new SupportingFile("oauth.h.mustache", sourceFolder, modelNamePrefix + "Oauth.h")); supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); + supportingFiles.add(new SupportingFile("CMakeConfig.mustache", sourceFolder, "Config.cmake.in")); supportingFiles.add(new SupportingFile("CMakeLists.txt.mustache", sourceFolder, "CMakeLists.txt")); diff --git a/modules/openapi-generator/src/main/resources/cpp-qt-client/CMakeConfig.mustache b/modules/openapi-generator/src/main/resources/cpp-qt-client/CMakeConfig.mustache new file mode 100644 index 00000000000..9015c2ba5ee --- /dev/null +++ b/modules/openapi-generator/src/main/resources/cpp-qt-client/CMakeConfig.mustache @@ -0,0 +1,5 @@ +@PACKAGE_INIT@ + +include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake) + +check_required_components("@PROJECT_NAME@") diff --git a/modules/openapi-generator/src/main/resources/cpp-qt-client/CMakeLists.txt.mustache b/modules/openapi-generator/src/main/resources/cpp-qt-client/CMakeLists.txt.mustache index 71d4bfdc05c..ae484139eb4 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt-client/CMakeLists.txt.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt-client/CMakeLists.txt.mustache @@ -1,47 +1,83 @@ cmake_minimum_required(VERSION 3.2) -project(client) +project({{{packageName}}}) + set(CMAKE_VERBOSE_MAKEFILE ON) -set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CXX_STANDARD_REQUIRED ON) -if (MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") -else () - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wno-unused-variable") -endif () - -find_package(Qt5Core REQUIRED) -find_package(Qt5Network REQUIRED) -find_package(Qt5Gui REQUIRED){{#contentCompression}} -find_package(ZLIB REQUIRED){{/contentCompression}} - -add_library(${PROJECT_NAME} -{{#models}} -{{#model}} - {{classname}}.cpp -{{/model}} -{{/models}} -{{#apiInfo}} -{{#apis}} -{{#operations}} - {{classname}}.cpp -{{/operations}} -{{/apis}} -{{/apiInfo}} - {{prefix}}Helpers.cpp - {{prefix}}HttpRequest.cpp - {{prefix}}HttpFileElement.cpp - {{prefix}}Oauth.cpp -) -target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Network Qt5::Gui{{#contentCompression}} ${ZLIB_LIBRARIES}{{/contentCompression}}) -if(NOT APPLE) - find_package(OpenSSL REQUIRED) - target_link_libraries(${PROJECT_NAME} PRIVATE ssl crypto) +if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 14) endif() -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_EXTENSIONS OFF) +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif() -install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Network Gui) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network Gui) + +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) + +file(GLOB_RECURSE HEADER_FILES "*.h") +file(GLOB_RECURSE SOURCE_FILES "*.cpp") + +add_library(${PROJECT_NAME} ${HEADER_FILES} ${SOURCE_FILES}) + +target_compile_options(${PROJECT_NAME} + PRIVATE + $<$,$,$>: + -Wall -Wno-unused-variable> +) + +target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ +) + +target_link_libraries(${PROJECT_NAME} + PUBLIC + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Network + Qt${QT_VERSION_MAJOR}::Gui + {{#contentCompression}} + PRIVATE + ${ZLIB_LIBRARIES}{{/contentCompression}} +) + +if(NOT APPLE) + find_package(OpenSSL REQUIRED) + target_link_libraries(${PROJECT_NAME} PRIVATE ssl crypto) +endif() + +configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" +) + +install( + TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}Targets + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}" +) + +install( + FILES ${HEADER_FILES} + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} +) + +install( + FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} +) + +install( + EXPORT ${PROJECT_NAME}Targets + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} +) diff --git a/samples/client/petstore/cpp-qt/.openapi-generator/FILES b/samples/client/petstore/cpp-qt/.openapi-generator/FILES index b453950fa47..08a3d055d2e 100644 --- a/samples/client/petstore/cpp-qt/.openapi-generator/FILES +++ b/samples/client/petstore/cpp-qt/.openapi-generator/FILES @@ -1,5 +1,6 @@ README.md client/CMakeLists.txt +client/Config.cmake.in client/PFXApiResponse.cpp client/PFXApiResponse.h client/PFXCategory.cpp diff --git a/samples/client/petstore/cpp-qt/CMakeLists.txt b/samples/client/petstore/cpp-qt/CMakeLists.txt index 6938aca8993..5fb20c83ec9 100644 --- a/samples/client/petstore/cpp-qt/CMakeLists.txt +++ b/samples/client/petstore/cpp-qt/CMakeLists.txt @@ -5,28 +5,16 @@ set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wno-unused-variable") - -find_package(Qt5Core REQUIRED) -find_package(Qt5Network REQUIRED) -find_package(Qt5Test REQUIRED) -find_package(Qt5Gui REQUIRED) - -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR}/client -) - add_subdirectory(client) + +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Test) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Test) + add_executable(${PROJECT_NAME} PetStore/main.cpp PetStore/PetApiTests.cpp PetStore/StoreApiTests.cpp PetStore/UserApiTests.cpp ) -target_link_libraries(${PROJECT_NAME} PRIVATE client) -target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Network Qt5::Test Qt5::Gui) -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_EXTENSIONS OFF) -install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) +target_link_libraries(${PROJECT_NAME} PRIVATE CppQtPetstoreClient Qt${QT_VERSION_MAJOR}::Test) diff --git a/samples/client/petstore/cpp-qt/client/CMakeLists.txt b/samples/client/petstore/cpp-qt/client/CMakeLists.txt index e7cad653115..869830afa19 100644 --- a/samples/client/petstore/cpp-qt/client/CMakeLists.txt +++ b/samples/client/petstore/cpp-qt/client/CMakeLists.txt @@ -1,45 +1,81 @@ cmake_minimum_required(VERSION 3.2) -project(client) +project(CppQtPetstoreClient) + set(CMAKE_VERBOSE_MAKEFILE ON) -set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CXX_STANDARD_REQUIRED ON) -if (MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") -else () - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wno-unused-variable") -endif () - -find_package(Qt5Core REQUIRED) -find_package(Qt5Network REQUIRED) -find_package(Qt5Gui REQUIRED) - -add_library(${PROJECT_NAME} - PFXApiResponse.cpp - PFXCategory.cpp - PFXOrder.cpp - PFXPet.cpp - PFXTag.cpp - PFXTestAnyType.cpp - PFXUser.cpp - PFXPetApi.cpp - PFXPrimitivesApi.cpp - PFXStoreApi.cpp - PFXUserApi.cpp - PFXHelpers.cpp - PFXHttpRequest.cpp - PFXHttpFileElement.cpp - PFXOauth.cpp -) -target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Network Qt5::Gui) -if(NOT APPLE) - find_package(OpenSSL REQUIRED) - target_link_libraries(${PROJECT_NAME} PRIVATE ssl crypto) +if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 14) endif() -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_EXTENSIONS OFF) +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif() -install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Network Gui) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network Gui) + +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) + +file(GLOB_RECURSE HEADER_FILES "*.h") +file(GLOB_RECURSE SOURCE_FILES "*.cpp") + +add_library(${PROJECT_NAME} ${HEADER_FILES} ${SOURCE_FILES}) + +target_compile_options(${PROJECT_NAME} + PRIVATE + $<$,$,$>: + -Wall -Wno-unused-variable> +) + +target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ +) + +target_link_libraries(${PROJECT_NAME} + PUBLIC + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Network + Qt${QT_VERSION_MAJOR}::Gui + +) + +if(NOT APPLE) + find_package(OpenSSL REQUIRED) + target_link_libraries(${PROJECT_NAME} PRIVATE ssl crypto) +endif() + +configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" +) + +install( + TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}Targets + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}" +) + +install( + FILES ${HEADER_FILES} + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} +) + +install( + FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} +) + +install( + EXPORT ${PROJECT_NAME}Targets + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} +) diff --git a/samples/client/petstore/cpp-qt/client/Config.cmake.in b/samples/client/petstore/cpp-qt/client/Config.cmake.in new file mode 100644 index 00000000000..9015c2ba5ee --- /dev/null +++ b/samples/client/petstore/cpp-qt/client/Config.cmake.in @@ -0,0 +1,5 @@ +@PACKAGE_INIT@ + +include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake) + +check_required_components("@PROJECT_NAME@")