Outils du site

fr:linux_pipeline

Data du jeu : Pipeline Linux

Page de travail qui sert à relever les problèmes concernant la génération des data sous linux et a proposer des solutions. A terme j'espère que cette page sera remplacée par un tutorial sur comment générer les data de jeu sous linux

La génération des data du jeu s'effectue en 8 étapes via les scripts python suivant du dossier “code/nel/tools/build_gamedata” :

$ ls
0_setup.py   
1_export.py
2_build.py    
3_install.py
4_data_shard.py  
5_client_dev.py
6_client_patch.py    
7_client_install.py
8_upload.py              

install_client_dev.py
export_build_install.py  
install_data_shard.py

Cas ig_elevation

Certains outils utilisés par les scripts de construction des données situés “dans code/nel/tools/3d” n'ont pas été compilés sous linux. L'ouverture du CMakLists.txt permettrait de comprendre pourquoi :

vim code/nel/tools/3d/CMakeLists.txt
IF(WIN32)
  ADD_SUBDIRECTORY(ig_elevation)
  ADD_SUBDIRECTORY(lightmap_optimizer)
  
  IF(MFC_FOUND)
    ADD_SUBDIRECTORY(object_viewer)
    ADD_SUBDIRECTORY(object_viewer_exe)
    ADD_SUBDIRECTORY(tile_edit)
  ENDIF(MFC_FOUND)
  
  IF(WITH_NEL_MAXPLUGIN)
    IF(MAXSDK_FOUND)
      ADD_SUBDIRECTORY(plugin_max)
      ADD_SUBDIRECTORY(ligo)
    ENDIF(MAXSDK_FOUND)
  ENDIF(WITH_NEL_MAXPLUGIN)
   
ENDIF(WIN32)

L'outil ig_elevation est spécifique à l'environnement WIN32 mais ne dépend pas des MFC (Bibliothèque pour l'interface graphique windows.

Un regard rapide au seul fichier main.cpp montre qu'en effet c'est un programme en ligne de commande qui utilise l'entête “windows.h” et rien d'autre de spécifique. Je commente la ligne pour repérer l'endroit où des appels aux fonctions “windows” sont utilisées

#include <vector>
#include <string>
  
#include "nel/misc/config_file.h"
#include "nel/misc/file.h"
#include "nel/misc/bitmap.h"
#include "nel/misc/block_memory.h"
#include "nel/misc/i_xml.h"
#include "nel/misc/app_context.h"
  
#include "nel/ligo/zone_region.h"
  
#include "nel/3d/scene_group.h"
  
// #include <windows.h>

Lancement de la compilation

$ cd code/nel/tools/3d/ig_levation
$ gcc main.cpp
In file included from /usr/include/nel/misc/config_file.h:20:0,
               from main.cpp:27:
/usr/include/nel/misc/types_nl.h:420:3: erreur: #error "NeL must 
be configured for debug or release" In file included from main.cpp:31:0:
/usr/include/nel/misc/i_xml.h:29:27: erreur fatale: libxml/parser.h : 
Aucun fichier ou dossier de ce type
compilation terminée.

La compilation bloque sur 2 erreurs, des options spécifiques à NEL et le chemin des entête de la librairie libxml. Je ressort mon modèle de ligne de commande pour la compilation des programmes NEL et j'ajoute dedans le chemin de libxml de ma machine “/usr/include/libxml2/”

$ g++  -static main.cpp -o ig_elevation -lnelmisc -lpthread -ldl -lm -lrt -I /opt/khanat/ryzomcore/code/nel/include/ -I /usr/include/libxml2/   -L /opt/khanat/ryzomcore/code/build/lib -D NL_RELEASE

Toutes les erreurs dues à l'absence de l'entête “windows” sont concentrées dans 2 endroits différents et concerne apparemment les fonctions GetCurrentDirectory, FindNextFile, SetCurrentDirectory, findData, FindClose ainsi que les déclarations des paramètres qu'elles utilisent.

main.cpp: In function ‘void dir(const string&, std::vector<std::basic_string<char> >&, bool)’:
main.cpp:132:2: erreur: ‘WIN32_FIND_DATA’ was not declared in this scope
main.cpp:132:18: erreur: expected ‘;’ before ‘findData’
main.cpp:133:2: erreur: ‘HANDLE’ was not declared in this scope
main.cpp:133:9: erreur: expected ‘;’ before ‘hFind’
main.cpp:136:40: erreur: ‘GetCurrentDirectory’ was not declared in this scope
main.cpp:137:2: erreur: ‘hFind’ was not declared in this scope
main.cpp:137:43: erreur: ‘findData’ was not declared in this scope
main.cpp:137:51: erreur: ‘FindFirstFile’ was not declared in this scope
main.cpp:138:18: erreur: ‘INVALID_HANDLE_VALUE’ was not declared in this scope
main.cpp:140:3: erreur: ‘DWORD’ was not declared in this scope
main.cpp:140:9: erreur: expected ‘;’ before ‘res’
main.cpp:141:7: erreur: ‘res’ was not declared in this scope
main.cpp:141:14: erreur: ‘INVALID_FILE_ATTRIBUTES’ was not declared in this scope
main.cpp:141:47: erreur: ‘FILE_ATTRIBUTE_DIRECTORY’ was not declared in this scope
main.cpp:148:37: erreur: ‘FindNextFile’ was not declared in this scope
main.cpp:151:18: erreur: ‘FindClose’ was not declared in this scope
main.cpp: In function ‘void SaveInstanceGroup(const char*, NL3D::CInstanceGroup*)’:
main.cpp:226:30: erreur: invalid initialization of non-const reference of type ‘std::string& {aka   std::basic_string<char>&}’ from an rvalue of type ‘std::string {aka std::basic_string<char>}’
main.cpp:50:6: erreur: in passing argument 1 of ‘void outString(std::string&)’
main.cpp:231:51: erreur: invalid initialization of non-const reference of type ‘std::string& {aka std::basic_string<char>&}’ from an rvalue of type ‘std::basic_string<char>’
main.cpp:50:6: erreur: in passing argument 1 of ‘void outString(std::string&)’
main.cpp: In function ‘int main(int, char**)’:
main.cpp:278:40: erreur: ‘GetCurrentDirectory’ was not declared in this scope
main.cpp:338:99: erreur: invalid initialization of non-const reference of type ‘std::string& {aka std::basic_string<char>&}’ from an rvalue of type ‘std::basic_string<char>’
main.cpp:50:6: erreur: in passing argument 1 of ‘void outString(std::string&)’
main.cpp:364:101: erreur: invalid initialization of non-const reference of type ‘std::string& {aka std::basic_string<char>&}’ from an rvalue of type ‘std::basic_string<char>’
main.cpp:50:6: erreur: in passing argument 1 of ‘void outString(std::string&)’
main.cpp:380:49: erreur: ‘SetCurrentDirectory’ was not declared in this scope

Ce sont des fonctions basiques pour pacourir le contenu d'un dossier. Un extrait des lignes concernées le montre :

void dir (const string &sFilter, vector<string> &sAllFiles, bool bFullPath)
{
      WIN32_FIND_DATA findData;
      HANDLE hFind;
      char sCurDir[MAX_PATH];
      sAllFiles.clear ();
      GetCurrentDirectory (MAX_PATH, sCurDir);
      hFind = FindFirstFile (sFilter.c_str(), &findData);
      while (hFind != INVALID_HANDLE_VALUE)
      {
              DWORD res = GetFileAttributes(findData.cFileName);
              if (res != INVALID_FILE_ATTRIBUTES && !(res&FILE_ATTRIBUTE_DIRECTORY))
              {
                      if (bFullPath)
                              sAllFmakeiles.push_back(string(sCurDir) + "\\" + findData.cFileName);
                      else
                              sAllFiles.push_back(findData.cFileName);
              }
              if (FindNextFile (hFind, &findData) == 0)
                      break;
      }
      FindClose (hFind);
}

Une simple fonction qui parcours les fichiers d'un dossiers et renvoie la liste dans la variable sAllFiles. A présent il faut se retrousser les manches et fournir le patch à kervala pour la version linux

fr/linux_pipeline.txt · Dernière modification: 2016/09/14 06:51 (modification externe)