Skip to content

Commit 9d7e8f3

Browse files
AustinShalitJLLeitschuh
authored andcommitted
Add Launcher Binary (#648)
* Add Launcher binary * Compile the launcher instead of using a prebuilt version
1 parent 08a4ad9 commit 9d7e8f3

File tree

3 files changed

+145
-19
lines changed

3 files changed

+145
-19
lines changed

build.gradle

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ buildscript {
77
}
88

99
dependencies {
10-
classpath group: 'de.dynamicfiles.projects.gradle.plugins', name: 'javafx-gradle-plugin', version: '8.5.1'
10+
classpath group: 'de.dynamicfiles.projects.gradle.plugins', name: 'javafx-gradle-plugin', version: '8.5.2'
1111
classpath 'com.netflix.nebula:gradle-aggregate-javadocs-plugin:2.2.+'
1212
classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.8'
1313
}
@@ -85,7 +85,7 @@ def getVersionSimple = { ->
8585
}
8686
}
8787

88-
allprojects {
88+
configure(allprojects - project(':ui:linuxLauncher')) {
8989
apply plugin: 'java'
9090
apply plugin: 'application'
9191
apply plugin: 'jacoco'
@@ -301,6 +301,30 @@ project(":core") {
301301
}
302302
}
303303

304+
project (":ui:linuxLauncher") {
305+
apply plugin: 'cpp'
306+
307+
model {
308+
binaries {
309+
all {
310+
cppCompiler.args '-pthread', '-ldl'
311+
linker.args '-pthread', '-ldl'
312+
}
313+
}
314+
components {
315+
linuxLauncher(NativeExecutableSpec) {
316+
sources {
317+
cpp {
318+
source {
319+
srcDir "src/cpp"
320+
}
321+
}
322+
}
323+
}
324+
}
325+
}
326+
}
327+
304328
project (":ui:preloader") {
305329
apply plugin: 'java'
306330
apply plugin: 'idea'
@@ -339,7 +363,10 @@ project(":ui") {
339363
}
340364

341365
evaluationDependsOn(':core')
342-
evaluationDependsOnChildren()
366+
evaluationDependsOn(':ui:preloader')
367+
if (System.getProperty("os.name").toLowerCase().contains("linux")) {
368+
jfxNative.dependsOn tasks.getByPath(':ui:linuxLauncher:linuxLauncherExecutable')
369+
}
343370
compileTestJava.dependsOn tasks.getByPath(':core:testClasses')
344371

345372
idea.module {
@@ -375,10 +402,9 @@ project(":ui") {
375402
// See: https://plumbr.eu/blog/java/on-a-quest-for-missing-stacktraces
376403
jvmArgs = ["-XX:-OmitStackTraceInFastThrow"]
377404

378-
// This was a workaround introduced by the plugin dev. For some reason the build fails
379-
// when the workaround is enabled in Java 1.8.0_101. If you are building with a version
380-
// less than _101 you may need to set this to false.
381-
skipNativeLauncherWorkaround124 = true
405+
bundleArguments = [
406+
"linux.launcher.url": file('linuxLauncher/build/exe/linuxLauncher/linuxLauncher').toURI().toURL()
407+
]
382408
}
383409
mainClassName = jfx.mainClass
384410
}
@@ -389,20 +415,22 @@ project(":ui") {
389415
*/
390416
task jacocoRootReport(type: JacocoReport, group: 'Coverage reports') {
391417
description = 'Generates an aggregate report from all subprojects'
392-
dependsOn(subprojects.test)
418+
configure(subprojects - project(':ui:linuxLauncher')) {
419+
dependsOn(test)
393420

394-
additionalSourceDirs = files(subprojects.sourceSets.main.allSource.srcDirs)
395-
sourceDirectories = files(subprojects.sourceSets.main.allSource.srcDirs)
396-
classDirectories = files(subprojects.sourceSets.main.output)
397-
executionData = files(subprojects.jacocoTestReport.executionData)
421+
additionalSourceDirs = files(sourceSets.main.allSource.srcDirs)
422+
sourceDirectories = files(sourceSets.main.allSource.srcDirs)
423+
classDirectories = files(sourceSets.main.output)
424+
executionData = files(jacocoTestReport.executionData)
398425

399-
reports {
400-
html.enabled = true
401-
xml.enabled = true
402-
}
426+
reports {
427+
html.enabled = true
428+
xml.enabled = true
429+
}
403430

404-
doFirst {
405-
executionData = files(executionData.findAll { it.exists() })
431+
doFirst {
432+
executionData = files(executionData.findAll { it.exists() })
433+
}
406434
}
407435
}
408436

settings.gradle

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1-
include 'core', 'ui', 'ui:preloader'
1+
include 'core', 'ui', 'ui:preloader', 'ui:linuxLauncher'
22
rootProject.name = 'GRIP'
3+
include 'linuxLauncher'
4+

ui/linuxLauncher/src/cpp/launcher.cpp

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/*
2+
* Copyright (c) 2014, Oracle and/or its affiliates.
3+
* All rights reserved. Use is subject to license terms.
4+
*
5+
* This file is available and licensed under the following license:
6+
*
7+
* Redistribution and use in source and binary forms, with or without
8+
* modification, are permitted provided that the following conditions
9+
* are met:
10+
*
11+
* - Redistributions of source code must retain the above copyright
12+
* notice, this list of conditions and the following disclaimer.
13+
* - Redistributions in binary form must reproduce the above copyright
14+
* notice, this list of conditions and the following disclaimer in
15+
* the documentation and/or other materials provided with the distribution.
16+
* - Neither the name of Oracle Corporation nor the names of its
17+
* contributors may be used to endorse or promote products derived
18+
* from this software without specific prior written permission.
19+
*
20+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31+
*/
32+
33+
34+
#include <dlfcn.h>
35+
#include <locale.h>
36+
#include <string>
37+
#include <libgen.h>
38+
#include <stdio.h>
39+
#include <unistd.h>
40+
41+
42+
typedef bool (*start_launcher)(int argc, char* argv[]);
43+
typedef void (*stop_launcher)();
44+
45+
#define MAX_PATH 1024
46+
47+
std::string GetProgramPath() {
48+
std::string result;
49+
char *buffer = new char[MAX_PATH];
50+
51+
if (buffer != NULL) {
52+
if (readlink("/proc/self/exe", buffer, MAX_PATH - 1) != -1) {
53+
buffer[MAX_PATH - 1] = '\0';
54+
result = buffer;
55+
}
56+
57+
delete[] buffer;
58+
}
59+
60+
return result;
61+
}
62+
63+
int main(int argc, char *argv[]) {
64+
int result = 1;
65+
setlocale(LC_ALL, "en_US.utf8");
66+
void* library = NULL;
67+
68+
{
69+
std::string programPath = GetProgramPath();
70+
std::string libraryName = dirname((char*)programPath.c_str());
71+
libraryName += "/libpackager.so";
72+
library = dlopen(libraryName.c_str(), RTLD_LAZY);
73+
74+
if (library == NULL) {
75+
printf("%s not found.\n", libraryName.c_str());
76+
}
77+
}
78+
79+
if (library != NULL) {
80+
start_launcher start = (start_launcher)dlsym(library, "start_launcher");
81+
stop_launcher stop = (stop_launcher)dlsym(library, "stop_launcher");
82+
83+
if (start(argc, argv) == true) {
84+
result = 0;
85+
86+
if (stop != NULL) {
87+
stop();
88+
}
89+
}
90+
91+
dlclose(library);
92+
}
93+
94+
95+
return result;
96+
}

0 commit comments

Comments
 (0)