Skip to content

Commit 7142e6a

Browse files
committed
Add support for vcpkg-configuration.json
1 parent 46bb96b commit 7142e6a

11 files changed

Lines changed: 261 additions & 63 deletions

File tree

pom.xml

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,27 +22,27 @@
2222
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
2323
<inceptionYear>2023</inceptionYear>
2424

25-
<junit.version>5.11.3</junit.version>
26-
<mockito.version>5.14.2</mockito.version>
25+
<junit.version>5.13.0</junit.version>
26+
<mockito.version>5.18.0</mockito.version>
2727
</properties>
2828

2929
<dependencies>
3030
<dependency>
3131
<groupId>info.picocli</groupId>
3232
<artifactId>picocli</artifactId>
33-
<version>4.7.6</version>
33+
<version>4.7.7</version>
3434
</dependency>
3535

3636
<dependency>
3737
<groupId>com.fasterxml.jackson.core</groupId>
3838
<artifactId>jackson-databind</artifactId>
39-
<version>2.18.1</version>
39+
<version>2.19.0</version>
4040
</dependency>
4141

4242
<dependency>
4343
<groupId>org.apache.commons</groupId>
4444
<artifactId>commons-exec</artifactId>
45-
<version>1.4.0</version>
45+
<version>1.5.0</version>
4646
</dependency>
4747

4848
<dependency>
@@ -54,19 +54,13 @@
5454
<dependency>
5555
<groupId>com.squareup.okhttp3</groupId>
5656
<artifactId>okhttp</artifactId>
57-
<version>4.12.0</version>
58-
<exclusions>
59-
<exclusion>
60-
<artifactId>kotlin-stdlib-jdk8</artifactId>
61-
<groupId>org.jetbrains.kotlin</groupId>
62-
</exclusion>
63-
</exclusions>
57+
<version>4.10.0</version>
6458
</dependency>
6559

6660
<dependency>
6761
<groupId>org.freemarker</groupId>
6862
<artifactId>freemarker</artifactId>
69-
<version>2.3.33</version>
63+
<version>2.3.34</version>
7064
</dependency>
7165

7266
<dependency>
@@ -140,7 +134,7 @@
140134
<plugin> <!-- Generates code coverage report -->
141135
<groupId>org.jacoco</groupId>
142136
<artifactId>jacoco-maven-plugin</artifactId>
143-
<version>0.8.12</version>
137+
<version>0.8.13</version>
144138
<executions>
145139
<execution>
146140
<goals>
@@ -206,7 +200,7 @@
206200
<plugin> <!-- To create an .exe file for Windows platform -->
207201
<groupId>com.akathist.maven.plugins.launch4j</groupId>
208202
<artifactId>launch4j-maven-plugin</artifactId>
209-
<version>2.5.2</version>
203+
<version>2.6.0</version>
210204
<executions>
211205
<execution>
212206
<id>l4j-clui</id>

src/main/java/se/mwthinker/CMakeBuilder.java

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ public record ExternalProject(String name, String gitUrl, String gitTag) {}
2222
private final List<ExternalProject> externalProjects = new ArrayList<>();
2323
private final List<VcpkgObject> vcpkgObjects = new ArrayList<>();
2424
private final Set<String> vcpkgDependencies = new LinkedHashSet<>(); // Want to element keep order (to make it easier for a human to read).
25+
private final Set<String> fetchedVcpkgDependencies = new LinkedHashSet<>();
2526
private final Set<String> linkLibraries = new LinkedHashSet<>();
2627
private final Set<String> sources = new LinkedHashSet<>();
2728
private final Set<String> extraFiles = new LinkedHashSet<>();
2829
private String description = "Description";
2930
private String author = "";
31+
private final List<VcpkgConfigurationObject.Registry> registries = new ArrayList<>();
3032

3133
public CMakeBuilder(FileSystem fileSystem, Github github) {
3234
this.fileSystem = fileSystem;
@@ -38,11 +40,25 @@ public CMakeBuilder addExternalProjects(String name, String gitUrl, String gitTa
3840
return this;
3941
}
4042

43+
public CMakeBuilder addRegistry(String owner, String repo, String... packages) {
44+
String commitSha = github.fetchLatestCommitSHA(owner, repo);
45+
var registry = new VcpkgConfigurationObject.Registry();
46+
registry.setKind("git");
47+
registry.setBaseline(commitSha);
48+
registry.setRepository(Github.getRepositoryUrl(owner, repo));
49+
if (packages != null && packages.length > 0) {
50+
registry.setPackages(List.of(packages));
51+
}
52+
registries.add(registry);
53+
return this;
54+
}
55+
4156
public CMakeBuilder addExternalProjectsWithDependencies(String owner, String repo) {
42-
var repositoryUrl = github.getRepositoryUrl(owner, repo);
57+
var repositoryUrl = Github.getRepositoryUrl(owner, repo);
4358
String commitSha = github.fetchLatestCommitSHA(owner, repo);
4459
var vcpkgObject = github.fetchVcpkgObject(owner, repo, commitSha);
4560
vcpkgObjects.add(vcpkgObject);
61+
fetchedVcpkgDependencies.addAll(vcpkgObject.getDependencies());
4662
return addExternalProjects(repo, repositoryUrl, commitSha);
4763
}
4864

@@ -94,12 +110,13 @@ public void buildFiles() {
94110
fileSystem.copyResourceTo("CMakePresets.json");
95111
addExtraFile("vcpkg.json");
96112
saveVcpkgJson();
113+
saveVcpkgConfigurationJson();
97114

98115
fileSystem.copyResourceTo("gitattributes",".gitattributes");
99116
fileSystem.copyResourceTo("gitignore", ".gitignore");
100117

101118
if (!externalProjects.isEmpty()) {
102-
fileSystem.saveFileFromTemplate(Map.of("externalProjects", externalProjects), "ExternalFetchContent.ftl");
119+
fileSystem.saveFileFromTemplate(Map.of("externalProjects", externalProjects), "ExternalFetchContent.cmake");
103120
addExtraFile("ExternalFetchContent.cmake");
104121
}
105122

@@ -123,12 +140,29 @@ private void saveGithubAction() {
123140
fileSystem.saveFileFromTemplate(data, ".github/workflows/ci.yml");
124141
}
125142

143+
private void saveVcpkgConfigurationJson() {
144+
var newVcpkgConfiguration = new VcpkgConfigurationObject();
145+
var defaultRegistry = new VcpkgConfigurationObject.DefaultRegistry();
146+
newVcpkgConfiguration.setDefaultRegistry(defaultRegistry);
147+
defaultRegistry.setKind("git");
148+
var commitSHA = github.fetchLatestCommitSHA("microsoft", "vcpkg");
149+
defaultRegistry.setBaseline(commitSHA);
150+
defaultRegistry.setRepository(Github.getRepositoryUrl("microsoft", "vcpkg"));
151+
152+
if (!registries.isEmpty()) {
153+
newVcpkgConfiguration.setRegistries(registries);
154+
}
155+
156+
fileSystem.saveToFile(newVcpkgConfiguration, "vcpkg-configuration.json");
157+
}
158+
126159
private void saveVcpkgJson() {
127160
var newVcpkgObject = new VcpkgObject();
128161
newVcpkgObject.setName(fileSystem.getProjectName().toLowerCase());
129162
newVcpkgObject.setDescription(description);
130163

131164
vcpkgDependencies.forEach(newVcpkgObject::addDependency);
165+
fetchedVcpkgDependencies.forEach(newVcpkgObject::addDependency);
132166

133167
if (testProject) {
134168
newVcpkgObject.addDependency("gtest");

src/main/java/se/mwthinker/FileSystem.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.io.FileWriter;
1111
import java.io.IOException;
1212
import java.util.Map;
13+
import java.util.Objects;
1314

1415
public class FileSystem {
1516
private final File projectDir;
@@ -40,13 +41,13 @@ public void copyResourceTo(String resource) {
4041
copyResourceTo(getFileName(resource), resource);
4142
}
4243

43-
public void saveToFile(VcpkgObject vcpkgObject, String saveToFile) {
44+
public void saveToFile(Object jsonObject, String saveToFile) {
4445
try {
4546
ObjectMapper mapper = new ObjectMapper();
4647
ObjectWriter writer = mapper.writer(
4748
new DefaultPrettyPrinter().withObjectIndenter(new DefaultIndenter().withLinefeed("\n"))
4849
);
49-
writer.writeValue(new File(projectDir, saveToFile), vcpkgObject);
50+
writer.writeValue(new File(projectDir, saveToFile), jsonObject);
5051
} catch (IOException e) {
5152
throw new RuntimeException(e);
5253
}

src/main/java/se/mwthinker/GeneratorCli.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ public class GeneratorCli implements Callable<Integer>, CommandLine.IVersionProv
3333
@Option(names = { "-g", "--gui" }, paramLabel = "GUI", description = "Add gui library.")
3434
private boolean gui = false;
3535

36+
@Option(names = { "-f", "--useFetch" }, paramLabel = "GUI", description = "Use CMake FetchContent (instead .")
37+
private boolean fetch = false;
38+
3639
@Option(names = { "-t", "--test" }, paramLabel = "TEST", description = "Add test.")
3740
private boolean test = false;
3841

@@ -93,10 +96,18 @@ public Integer call() {
9396

9497
if (gui) {
9598
cmakeBuilder
96-
.addExternalProjectsWithDependencies("mwthinker","CppSdl2")
99+
.addLinkLibrary("CppSdl2::CppSdl2")
97100
.addSource("src/main.cpp")
98101
.addSource("src/testwindow.cpp")
99102
.addSource("src/testwindow.h");
103+
if (fetch) {
104+
cmakeBuilder
105+
.addExternalProjectsWithDependencies("mwthinker","CppSdl2");
106+
} else {
107+
cmakeBuilder
108+
.addVcpkgDependency("cppsdl2")
109+
.addRegistry("mwthinker", "mw-vcpkg-registry", "cppsdl2");
110+
}
100111
} else {
101112
cmakeBuilder
102113
.addSource("src/main.cpp")

src/main/java/se/mwthinker/Github.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class Github {
1717
public Github() {
1818
}
1919

20-
public String getRepositoryUrl(String owner, String repo) {
20+
public static String getRepositoryUrl(String owner, String repo) {
2121
return "https://github.com/" + owner + "/" + repo + ".git"; // TODO! May not work for every type of repository?
2222
}
2323

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package se.mwthinker;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
@JsonPropertyOrder({ "default-registry", "registries" })
11+
@JsonIgnoreProperties(ignoreUnknown = true)
12+
public class VcpkgConfigurationObject {
13+
14+
@JsonProperty("default-registry")
15+
private DefaultRegistry defaultRegistry;
16+
17+
@JsonProperty("registries")
18+
private List<Registry> registries = new ArrayList<>();
19+
20+
public DefaultRegistry getDefaultRegistry() {
21+
return defaultRegistry;
22+
}
23+
24+
public void setDefaultRegistry(DefaultRegistry defaultRegistry) {
25+
this.defaultRegistry = defaultRegistry;
26+
}
27+
28+
public List<Registry> getRegistries() {
29+
return registries;
30+
}
31+
32+
public void setRegistries(List<Registry> registries) {
33+
this.registries = registries;
34+
}
35+
36+
@JsonIgnoreProperties(ignoreUnknown = true)
37+
public static class DefaultRegistry {
38+
@JsonProperty("kind")
39+
private String kind;
40+
41+
@JsonProperty("baseline")
42+
private String baseline;
43+
44+
@JsonProperty("repository")
45+
private String repository;
46+
47+
public String getKind() {
48+
return kind;
49+
}
50+
51+
public void setKind(String kind) {
52+
this.kind = kind;
53+
}
54+
55+
public String getBaseline() {
56+
return baseline;
57+
}
58+
59+
public void setBaseline(String baseline) {
60+
this.baseline = baseline;
61+
}
62+
63+
public String getRepository() {
64+
return repository;
65+
}
66+
67+
public void setRepository(String repository) {
68+
this.repository = repository;
69+
}
70+
}
71+
72+
@JsonIgnoreProperties(ignoreUnknown = true)
73+
public static class Registry {
74+
@JsonProperty("kind")
75+
private String kind;
76+
77+
@JsonProperty("baseline")
78+
private String baseline;
79+
80+
@JsonProperty("repository")
81+
private String repository;
82+
83+
@JsonProperty("packages")
84+
private List<String> packages = new ArrayList<>();
85+
86+
public String getKind() {
87+
return kind;
88+
}
89+
90+
public void setKind(String kind) {
91+
this.kind = kind;
92+
}
93+
94+
public String getBaseline() {
95+
return baseline;
96+
}
97+
98+
public void setBaseline(String baseline) {
99+
this.baseline = baseline;
100+
}
101+
102+
public String getRepository() {
103+
return repository;
104+
}
105+
106+
public void setRepository(String repository) {
107+
this.repository = repository;
108+
}
109+
110+
public List<String> getPackages() {
111+
return packages;
112+
}
113+
114+
public void setPackages(List<String> packages) {
115+
this.packages = packages;
116+
}
117+
}
118+
}

src/main/java/se/mwthinker/VcpkgObject.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
import java.util.ArrayList;
88
import java.util.List;
99

10-
@JsonPropertyOrder({ "name", "version-string", "port-version", "homepage", "description", "license", "dependencies" })
10+
@JsonPropertyOrder({ "name", "version", "port-version", "homepage", "description", "license", "dependencies" })
1111
@JsonIgnoreProperties(ignoreUnknown = true)
1212
public class VcpkgObject {
1313

1414
@JsonProperty("name")
1515
private String name = "";
1616

17-
@JsonProperty("version-string")
17+
@JsonProperty("version")
1818
private String version = "0.1.0";
1919

2020
@JsonProperty("homepage")

src/main/resources/templates/CMakeLists.ftl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,14 @@ add_subdirectory(${testProjectName})
5757
find_package(${dependency} CONFIG REQUIRED)
5858
</#list>
5959

60+
<#if linkExternalLibraries?has_content>
6061
set_target_properties(
6162
${r"${ExternalDependencies}"}
6263

6364
PROPERTIES FOLDER
6465
ExternalDependencies
6566
)
67+
</#if>
6668

6769
if (MSVC)
6870
target_compile_options(${projectName}
@@ -79,15 +81,14 @@ endif ()
7981

8082
target_link_libraries(${projectName}
8183
PRIVATE
82-
${r"${ExternalDependencies}"}
8384
<#list linkLibraries as library>
8485
${library}
8586
</#list>
8687
)
8788

8889
set_target_properties(${projectName}
8990
PROPERTIES
90-
CXX_STANDARD 20
91+
CXX_STANDARD 23
9192
CXX_STANDARD_REQUIRED YES
9293
CXX_EXTENSIONS NO
9394
)

0 commit comments

Comments
 (0)