Launcher: LD_LIBRARY_PATH drivers GL/Vulkan pour le jeu (fix NixOS dlopen libGL)
This commit is contained in:
@@ -12,6 +12,44 @@ const ConfigManager = require('./configmanager')
|
||||
|
||||
const logger = LoggerUtil.getLogger('ProcessBuilder')
|
||||
|
||||
/**
|
||||
* SurviePote : dossiers système contenant libGL/libEGL/libvulkan (dispatch + drivers).
|
||||
* Nécessaire là où dlopen ne les voit pas (ex: NixOS hors wrapper, LD_LIBRARY_PATH vide).
|
||||
* Ne retourne que des dossiers existants. Ordre : dispatch d'abord, drivers ensuite.
|
||||
*
|
||||
* @returns {Array.<string>} Dossiers à ajouter à LD_LIBRARY_PATH pour le jeu.
|
||||
*/
|
||||
function resolveSystemGLDirs(){
|
||||
const dirs = []
|
||||
const candidates = [
|
||||
'/run/opengl-driver/lib',
|
||||
'/run/opengl-driver-32/lib',
|
||||
'/usr/lib/x86_64-linux-gnu',
|
||||
'/usr/lib64',
|
||||
'/usr/lib'
|
||||
]
|
||||
for(const dir of candidates){
|
||||
try {
|
||||
if(fs.existsSync(dir) && !dirs.includes(dir)){
|
||||
dirs.push(dir)
|
||||
}
|
||||
} catch(_err) { /* ignore */ }
|
||||
}
|
||||
// NixOS : libglvnd (dispatch libGL/libEGL) + vulkan-loader dans le store.
|
||||
try {
|
||||
const store = fs.readdirSync('/nix/store')
|
||||
for(const entry of store){
|
||||
if(entry.includes('libglvnd') || entry.includes('vulkan-loader')){
|
||||
const lib = path.join('/nix/store', entry, 'lib')
|
||||
if(fs.existsSync(lib) && !dirs.includes(lib)){
|
||||
dirs.push(lib)
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch(_err) { /* pas NixOS, ignore */ }
|
||||
return dirs
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Only forge and fabric are top level mod loaders.
|
||||
@@ -77,9 +115,23 @@ class ProcessBuilder {
|
||||
|
||||
logger.info('Launch Arguments:', loggableArgs)
|
||||
|
||||
// SurviePote : sur NixOS, libGL/libEGL/libvulkan (dispatch + drivers Mesa) ne sont PAS
|
||||
// dans les chemins système vus par dlopen (LD_LIBRARY_PATH vide hors wrapper nix).
|
||||
// Sans ça : "[LWJGL] libGL.so.1 not found in system paths" -> crash "no OpenGL context API".
|
||||
const gameEnv = { ...process.env }
|
||||
if(process.platform === 'linux'){
|
||||
const glDirs = resolveSystemGLDirs()
|
||||
if(glDirs.length > 0){
|
||||
const prev = gameEnv.LD_LIBRARY_PATH ? gameEnv.LD_LIBRARY_PATH + ':' : ''
|
||||
gameEnv.LD_LIBRARY_PATH = prev + glDirs.join(':')
|
||||
logger.info('Prepended GL driver dirs to LD_LIBRARY_PATH:', glDirs.join(':'))
|
||||
}
|
||||
}
|
||||
|
||||
const child = child_process.spawn(ConfigManager.getJavaExecutable(this.server.rawServer.id), args, {
|
||||
cwd: this.gameDir,
|
||||
detached: ConfigManager.getLaunchDetached()
|
||||
detached: ConfigManager.getLaunchDetached(),
|
||||
env: gameEnv
|
||||
})
|
||||
|
||||
if(ConfigManager.getLaunchDetached()){
|
||||
|
||||
Reference in New Issue
Block a user