Skip to content

Commit 8d9816e

Browse files
authored
[cpp-qt-client] CMake build system improvements (#14210)
* checkpoint * rename template file * add nl * fix build
1 parent e8c739e commit 8d9816e

9 files changed

Lines changed: 174 additions & 90 deletions

File tree

bin/configs/cpp-qt-client.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ outputDir: samples/client/petstore/cpp-qt
33
inputSpec: modules/openapi-generator/src/test/resources/3_0/cpp-qt/petstore.yaml
44
templateDir: modules/openapi-generator/src/main/resources/cpp-qt-client
55
additionalProperties:
6+
packageName: CppQtPetstoreClient
67
cppNamespace: test_namespace
78
modelNamePrefix: PFX

docs/generators/cpp-qt-client.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
2727
|legacyDiscriminatorBehavior|Set to false for generators with better support for discriminators. (Python, Java, Go, PowerShell, C#have this enabled by default).|<dl><dt>**true**</dt><dd>The mapping in the discriminator includes descendent schemas that allOf inherit from self and the discriminator mapping schemas in the OAS document.</dd><dt>**false**</dt><dd>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.</dd></dl>|true|
2828
|modelNamePrefix|Prefix that will be prepended to all model names.| |OAI|
2929
|optionalProjectFile|Generate client.pri.| |true|
30+
|packageName|C++ package (library) name.| |QtOpenAPIClient|
3031
|prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false|
3132
|reservedWordPrefix|Prefix to prepend to reserved words in order to avoid conflicts| |r_|
3233
|sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true|

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQtClientCodegen.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131

3232
public class CppQtClientCodegen extends CppQtAbstractCodegen implements CodegenConfig {
3333
public static final String OPTIONAL_PROJECT_FILE_DESC = "Generate client.pri.";
34+
public static final String DEFAULT_PACKAGE_NAME = "QtOpenAPIClient";
35+
protected String packageName = "";
3436
// source folder where to write the files
3537
protected String sourceFolder = "client";
3638
protected boolean optionalProjectFileFlag = true;
@@ -89,7 +91,10 @@ public CppQtClientCodegen() {
8991
*/
9092
embeddedTemplateDir = templateDir = "cpp-qt-client";
9193

94+
// CLI options
95+
addOption(CodegenConstants.PACKAGE_NAME, "C++ package (library) name.", DEFAULT_PACKAGE_NAME);
9296
addSwitch(CodegenConstants.OPTIONAL_PROJECT_FILE, OPTIONAL_PROJECT_FILE_DESC, this.optionalProjectFileFlag);
97+
9398
supportingFiles.add(new SupportingFile("helpers-header.mustache", sourceFolder, PREFIX + "Helpers.h"));
9499
supportingFiles.add(new SupportingFile("helpers-body.mustache", sourceFolder, PREFIX + "Helpers.cpp"));
95100
supportingFiles.add(new SupportingFile("HttpRequest.h.mustache", sourceFolder, PREFIX + "HttpRequest.h"));
@@ -103,6 +108,7 @@ public CppQtClientCodegen() {
103108
supportingFiles.add(new SupportingFile("oauth.cpp.mustache", sourceFolder, PREFIX + "Oauth.cpp"));
104109
supportingFiles.add(new SupportingFile("oauth.h.mustache", sourceFolder, PREFIX + "Oauth.h"));
105110
supportingFiles.add(new SupportingFile("README.mustache", "", "README.md"));
111+
supportingFiles.add(new SupportingFile("CMakeConfig.mustache", sourceFolder, "Config.cmake.in"));
106112
supportingFiles.add(new SupportingFile("CMakeLists.txt.mustache", sourceFolder, "CMakeLists.txt"));
107113
if (optionalProjectFileFlag) {
108114
supportingFiles.add(new SupportingFile("Project.mustache", sourceFolder, "client.pri"));
@@ -117,12 +123,16 @@ public CppQtClientCodegen() {
117123
public void processOpts() {
118124
super.processOpts();
119125

126+
packageName = (String) additionalProperties.getOrDefault(CodegenConstants.PACKAGE_NAME, DEFAULT_PACKAGE_NAME);
127+
120128
if (additionalProperties.containsKey(CodegenConstants.OPTIONAL_PROJECT_FILE)) {
121129
setOptionalProjectFileFlag(convertPropertyToBooleanAndWriteBack(CodegenConstants.OPTIONAL_PROJECT_FILE));
122130
} else {
123131
additionalProperties.put(CodegenConstants.OPTIONAL_PROJECT_FILE, optionalProjectFileFlag);
124132
}
125133

134+
additionalProperties.put(CodegenConstants.PACKAGE_NAME, packageName);
135+
126136
if (additionalProperties.containsKey("modelNamePrefix")) {
127137
supportingFiles.clear();
128138
supportingFiles.add(new SupportingFile("helpers-header.mustache", sourceFolder, modelNamePrefix + "Helpers.h"));
@@ -138,6 +148,7 @@ public void processOpts() {
138148
supportingFiles.add(new SupportingFile("oauth.cpp.mustache", sourceFolder, modelNamePrefix + "Oauth.cpp"));
139149
supportingFiles.add(new SupportingFile("oauth.h.mustache", sourceFolder, modelNamePrefix + "Oauth.h"));
140150
supportingFiles.add(new SupportingFile("README.mustache", "", "README.md"));
151+
supportingFiles.add(new SupportingFile("CMakeConfig.mustache", sourceFolder, "Config.cmake.in"));
141152
supportingFiles.add(new SupportingFile("CMakeLists.txt.mustache", sourceFolder, "CMakeLists.txt"));
142153

143154

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@PACKAGE_INIT@
2+
3+
include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake)
4+
5+
check_required_components("@PROJECT_NAME@")
Lines changed: 74 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,83 @@
11
cmake_minimum_required(VERSION 3.2)
22

3-
project(client)
3+
project({{{packageName}}})
4+
45
set(CMAKE_VERBOSE_MAKEFILE ON)
5-
set(CMAKE_INCLUDE_CURRENT_DIR ON)
66
set(CMAKE_AUTOMOC ON)
7+
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
8+
set(CXX_STANDARD_REQUIRED ON)
9+
10+
if(NOT CMAKE_CXX_STANDARD)
11+
set(CMAKE_CXX_STANDARD 14)
12+
endif()
13+
14+
if(NOT CMAKE_BUILD_TYPE)
15+
set(CMAKE_BUILD_TYPE Release)
16+
endif()
17+
18+
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Network Gui)
19+
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network Gui)
20+
21+
include(GNUInstallDirs)
22+
include(CMakePackageConfigHelpers)
23+
24+
file(GLOB_RECURSE HEADER_FILES "*.h")
25+
file(GLOB_RECURSE SOURCE_FILES "*.cpp")
26+
27+
add_library(${PROJECT_NAME} ${HEADER_FILES} ${SOURCE_FILES})
28+
29+
target_compile_options(${PROJECT_NAME}
30+
PRIVATE
31+
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:
32+
-Wall -Wno-unused-variable>
33+
)
34+
35+
target_include_directories(${PROJECT_NAME}
36+
PUBLIC
37+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
38+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
39+
)
40+
41+
target_link_libraries(${PROJECT_NAME}
42+
PUBLIC
43+
Qt${QT_VERSION_MAJOR}::Core
44+
Qt${QT_VERSION_MAJOR}::Network
45+
Qt${QT_VERSION_MAJOR}::Gui
46+
{{#contentCompression}}
47+
PRIVATE
48+
${ZLIB_LIBRARIES}{{/contentCompression}}
49+
)
750

8-
if (MSVC)
9-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
10-
else ()
11-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wno-unused-variable")
12-
endif ()
13-
14-
find_package(Qt5Core REQUIRED)
15-
find_package(Qt5Network REQUIRED)
16-
find_package(Qt5Gui REQUIRED){{#contentCompression}}
17-
find_package(ZLIB REQUIRED){{/contentCompression}}
18-
19-
add_library(${PROJECT_NAME}
20-
{{#models}}
21-
{{#model}}
22-
{{classname}}.cpp
23-
{{/model}}
24-
{{/models}}
25-
{{#apiInfo}}
26-
{{#apis}}
27-
{{#operations}}
28-
{{classname}}.cpp
29-
{{/operations}}
30-
{{/apis}}
31-
{{/apiInfo}}
32-
{{prefix}}Helpers.cpp
33-
{{prefix}}HttpRequest.cpp
34-
{{prefix}}HttpFileElement.cpp
35-
{{prefix}}Oauth.cpp
36-
)
37-
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Network Qt5::Gui{{#contentCompression}} ${ZLIB_LIBRARIES}{{/contentCompression}})
3851
if(NOT APPLE)
39-
find_package(OpenSSL REQUIRED)
40-
target_link_libraries(${PROJECT_NAME} PRIVATE ssl crypto)
52+
find_package(OpenSSL REQUIRED)
53+
target_link_libraries(${PROJECT_NAME} PRIVATE ssl crypto)
4154
endif()
4255

43-
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14)
44-
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
45-
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_EXTENSIONS OFF)
56+
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
57+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
58+
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
59+
)
60+
61+
install(
62+
TARGETS ${PROJECT_NAME}
63+
EXPORT ${PROJECT_NAME}Targets
64+
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
65+
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
66+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
67+
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}"
68+
)
4669

47-
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
70+
install(
71+
FILES ${HEADER_FILES}
72+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
73+
)
74+
75+
install(
76+
FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
77+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
78+
)
79+
80+
install(
81+
EXPORT ${PROJECT_NAME}Targets
82+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
83+
)

samples/client/petstore/cpp-qt/.openapi-generator/FILES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
README.md
22
client/CMakeLists.txt
3+
client/Config.cmake.in
34
client/PFXApiResponse.cpp
45
client/PFXApiResponse.h
56
client/PFXCategory.cpp

samples/client/petstore/cpp-qt/CMakeLists.txt

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,16 @@ set(CMAKE_VERBOSE_MAKEFILE ON)
55
set(CMAKE_INCLUDE_CURRENT_DIR ON)
66
set(CMAKE_AUTOMOC ON)
77

8-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wno-unused-variable")
9-
10-
find_package(Qt5Core REQUIRED)
11-
find_package(Qt5Network REQUIRED)
12-
find_package(Qt5Test REQUIRED)
13-
find_package(Qt5Gui REQUIRED)
8+
add_subdirectory(client)
149

15-
include_directories(
16-
${CMAKE_CURRENT_SOURCE_DIR}/client
17-
)
10+
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Test)
11+
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Test)
1812

19-
add_subdirectory(client)
2013
add_executable(${PROJECT_NAME}
2114
PetStore/main.cpp
2215
PetStore/PetApiTests.cpp
2316
PetStore/StoreApiTests.cpp
2417
PetStore/UserApiTests.cpp
2518
)
26-
target_link_libraries(${PROJECT_NAME} PRIVATE client)
27-
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Network Qt5::Test Qt5::Gui)
28-
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14)
29-
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
30-
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_EXTENSIONS OFF)
3119

32-
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
20+
target_link_libraries(${PROJECT_NAME} PRIVATE CppQtPetstoreClient Qt${QT_VERSION_MAJOR}::Test)
Lines changed: 72 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,81 @@
11
cmake_minimum_required(VERSION 3.2)
22

3-
project(client)
3+
project(CppQtPetstoreClient)
4+
45
set(CMAKE_VERBOSE_MAKEFILE ON)
5-
set(CMAKE_INCLUDE_CURRENT_DIR ON)
66
set(CMAKE_AUTOMOC ON)
7+
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
8+
set(CXX_STANDARD_REQUIRED ON)
9+
10+
if(NOT CMAKE_CXX_STANDARD)
11+
set(CMAKE_CXX_STANDARD 14)
12+
endif()
13+
14+
if(NOT CMAKE_BUILD_TYPE)
15+
set(CMAKE_BUILD_TYPE Release)
16+
endif()
17+
18+
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Network Gui)
19+
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network Gui)
20+
21+
include(GNUInstallDirs)
22+
include(CMakePackageConfigHelpers)
23+
24+
file(GLOB_RECURSE HEADER_FILES "*.h")
25+
file(GLOB_RECURSE SOURCE_FILES "*.cpp")
26+
27+
add_library(${PROJECT_NAME} ${HEADER_FILES} ${SOURCE_FILES})
28+
29+
target_compile_options(${PROJECT_NAME}
30+
PRIVATE
31+
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:
32+
-Wall -Wno-unused-variable>
33+
)
34+
35+
target_include_directories(${PROJECT_NAME}
36+
PUBLIC
37+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
38+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
39+
)
40+
41+
target_link_libraries(${PROJECT_NAME}
42+
PUBLIC
43+
Qt${QT_VERSION_MAJOR}::Core
44+
Qt${QT_VERSION_MAJOR}::Network
45+
Qt${QT_VERSION_MAJOR}::Gui
46+
47+
)
748

8-
if (MSVC)
9-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
10-
else ()
11-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wno-unused-variable")
12-
endif ()
13-
14-
find_package(Qt5Core REQUIRED)
15-
find_package(Qt5Network REQUIRED)
16-
find_package(Qt5Gui REQUIRED)
17-
18-
add_library(${PROJECT_NAME}
19-
PFXApiResponse.cpp
20-
PFXCategory.cpp
21-
PFXOrder.cpp
22-
PFXPet.cpp
23-
PFXTag.cpp
24-
PFXTestAnyType.cpp
25-
PFXUser.cpp
26-
PFXPetApi.cpp
27-
PFXPrimitivesApi.cpp
28-
PFXStoreApi.cpp
29-
PFXUserApi.cpp
30-
PFXHelpers.cpp
31-
PFXHttpRequest.cpp
32-
PFXHttpFileElement.cpp
33-
PFXOauth.cpp
34-
)
35-
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Network Qt5::Gui)
3649
if(NOT APPLE)
37-
find_package(OpenSSL REQUIRED)
38-
target_link_libraries(${PROJECT_NAME} PRIVATE ssl crypto)
50+
find_package(OpenSSL REQUIRED)
51+
target_link_libraries(${PROJECT_NAME} PRIVATE ssl crypto)
3952
endif()
4053

41-
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14)
42-
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
43-
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_EXTENSIONS OFF)
54+
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
55+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
56+
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
57+
)
58+
59+
install(
60+
TARGETS ${PROJECT_NAME}
61+
EXPORT ${PROJECT_NAME}Targets
62+
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
63+
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
64+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
65+
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}"
66+
)
67+
68+
install(
69+
FILES ${HEADER_FILES}
70+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
71+
)
4472

45-
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
73+
install(
74+
FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
75+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
76+
)
77+
78+
install(
79+
EXPORT ${PROJECT_NAME}Targets
80+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
81+
)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@PACKAGE_INIT@
2+
3+
include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake)
4+
5+
check_required_components("@PROJECT_NAME@")

0 commit comments

Comments
 (0)