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@")