Forum de la communauté SFML

Aide => Général => Discussion démarrée par: Lolilolight le Novembre 25, 2013, 12:35:03 pm

Titre: Compiler une librairie.
Posté par: Lolilolight le Novembre 25, 2013, 12:35:03 pm
Salut, j'ai créer un projet sous code::block pour compiler une librairie statique et j'ai un fichier libSFGL.a
Je voudrais savoir comment tu as compiler SFML toi, avec code::blocks ou en mode console ?
Car je vois que toi tu as plusieurs fichier .a (un pour chaque module en fait), bref, je voudrais un peu savoir comment tu as fait.

Titre: Re : Compiler une librairie.
Posté par: Laurent le Novembre 25, 2013, 01:51:04 pm
Citer
Je voudrais savoir comment tu as compiler SFML toi, avec code::blocks ou en mode console ?
Je ne sais pas si tu as remarqué, mais je compile SFML avec tout un tas de compilateurs et d'OS ;)
Pour ça, comme tu peux le voir dans les sources, j'utilise CMake.

Citer
Car je vois que toi tu as plusieurs fichier .a (un pour chaque module en fait), bref, je voudrais un peu savoir comment tu as fait.
J'ai plusieurs projets, tout simplement.

A part ça je ne suis pas trop fan du fait que tu aies choisi un nom aussi lié à SFML pour ta propre bibliothèque :-\
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 25, 2013, 05:15:39 pm
Ok merci je pense que je vais simplement utiliser CMake plutôt. ^^

Pour le nom, ça, je n'ai rien trouvé d'autre pour l'instant donc je l'ai appelé simple and fast game library. (sfgl en abrégé)

Je changerai surement le nom après quand j'aurai trouvé mieux.

Mais ce nom illustre bien le but de cette librairie c'est à dire de créer des jeux avec seulement quelques lignes de codes :

En effet : le framework utilise son propre format de fichier pour charger une map en 2D avec SFML et la sauvegarder.
La map peut contenir n'importe quel type d'entité et le framework se charge lui même de sauvegarder la map, de la lire et de récupérer toutes les entités qui se trouve dans la vue pour pouvoir les afficher dans la renderwindow.
De plus j'ai même rajouté des entités pré-faîtes (tiles (le sol et les modèles qui ont en plus une ombre et des segments pour les intersctions avec la lumière et qui servent aussi à déterminer si un modèle est devant ou bien derrière un autre modèle pour l'ordre d'affichage des modèles), animations, monstres, personnages, ombres, lumières, etc...) avec une classe qui gère automatiquement les intersections entre la lumières et les entités, ainsi que entre les entités et la grille, mais si on ne veut pas utiliser les entités du framework on peut très bien faire ses propres entités. (Mais il faudra bien évidement recoder la classe qui sauvegarde et lis la map)
Bref ce que je veux faire c'est une librairie qui utilise SFML mais avec un niveau plus au dessus de SFML.
Car avec SFML il faut coder soi même les classes de sauvegarde de la map, les lumières, les ombres, les intersections entités et lumières, la grille pour tout stocker et récupérer ce qui est dans la vue de manière rapide, le resource holder, les collisions entité/grille (je ne fais pas de système de pixel-perfect), le pathfinding, le moteur de particule, etc...

Avec SFGL, il n'y aura plus besoin de faire tout ça.
Il n'y aura qu'à créer une entité, l'ajouté dans le monde (qui pourra être composée de une grande map ou plusieurs petites map) et la récupérer pour l'afficher.
Il faudra juste coder l'ihm soi même, et bien sûr, les ordres entre le client et le serveur.
Je compte même essayer d'introduire un système d'ia dans le framework, de quête, etc...
Mais ça, la partie gameplay du framework, se sera pour bien plus tard.
Titre: Re : Compiler une librairie.
Posté par: Laurent le Novembre 25, 2013, 08:55:08 pm
Citer
Mais ce nom illustre bien le but de cette librairie c'est à dire de créer des jeux avec seulement quelques lignes de codes
Oui je suis d'accord, mais avec un nom aussi proche on dirait que les deux bibliothèques sortent du même moule, ce qui n'est pas du tout le cas.
Titre: Re : Compiler une librairie.
Posté par: G. le Novembre 25, 2013, 09:22:49 pm
Pourquoi pas SFML++ puisque ta lib est une amélioration de SFML ? :D

Enfin sans déc, trouve un vrai nom différent avant d'uploader ça sur github etc. Est-ce que tu souhaites entretenir la confusion juste pour attirer des gens ? C'est un peu malhonnête. ;)
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 26, 2013, 10:52:48 am
Citer
Pourquoi pas SFML++ puisque ta lib est une amélioration de SFML ? :D

Enfin sans déc, trouve un vrai nom différent avant d'uploader ça sur github etc. Est-ce que tu souhaites entretenir la confusion juste pour attirer des gens ? C'est un peu malhonnête. ;)

Ok, en effet, il faut que je trouve un autre nom avant de mettre ça sur github.

Par contre je ne parviens pas à configurer CMake et je trouve ça assez compliqué, il me dit qu'il me faut un fichier CMakeList.txt, donc, j'ai cherché un tutoriel pour savoir comment en faire un, alors, j'ai essayer de créer ce fichier-ci :

cmake_minimum_required(VERSION 2.8)

#Déclaration du projet

project(SFGL)

set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})

#Inclusion de SFML

include_directories(C:/SFML-2.1/include)

link_directories(C:/SFML-2.1/lib)

#Configuration de l'exécutable

file(

        GLOB_RECURSE

        source_files

        src/*

include/*

)

add_executable(

        SFGL_build

        ${source_files}

)

Malheureusement ça ne parse pas.

CMake Error: Error in cmake code at
D:/Projets/Projets-c++/SFGL/CMakeLists.txt:1:
Parse error.  Expected a command name, got unquoted argument with text "".
Configuring incomplete, errors occurred!

Voilà ce que cmake me dit quand je clique sur configure.

J'essaye de faire un fichier tout simple plutôt que celui de SFML qui utilise pleins d'options que je ne comprend s pas pour compiler aussi sur macosx, linux, etc...
Et de toute façon ceux de SFML ne convienne pas pour ma bibliothèque. :/
Comment tu as fait toi pour  générer tout tes fichier de configurations pour cmake, tu les as fait à a main ou bien tu as utilisé un outil ?

PS : C'est pas une confusion de nom qui va faire de ma librairie un succès lol, il suffit de voir ce qu'est devenu le projet sf3d.
Titre: Re : Compiler une librairie.
Posté par: Laurent le Novembre 26, 2013, 11:37:33 am
Il n'y a pas d'outil pour créer les scripts CMake, c'est un langage avec ses propres instructions, il faut l'apprendre. C'est un peu rude au début mais on finit par s'y faire ;)

Aucune idée par rapport à ton erreur. Vu l'erreur et le fait qu'elle survient ligne 1, on dirait que ton fichier contient de la choucroute garnie.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 26, 2013, 12:10:27 pm
Ouais mon fichier est bizarre on dirait, il me faudrait un éditeur de texte autre que le bloc note qui me rajoute je ne sais pas quoi...

Au pire je compiler ma librairie avec codeblocks et je copie/colle les fichiers libSFGL.a et les fichier du dossier include de ma librairie dans le dossier d'installation de ma librairie et ça marche aussi.

Par contre je ne suis pas sûr que ça fonctionne aussi sur macosx et linux en faisant comme ça...

Le seul truc qui m'ennuie c'est que je suis quand même obligé de linker SFML à mon projet qui utilise SFGL, même si SFGL utilise SFML, je crois qu'il faudrait que je fasse un en tête spécial un peu comme tu as fait pour opengl.

Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 26, 2013, 08:11:59 pm
Mais je ne comprends pas très bien votre réaction, ce n'est pas comme si je copiais SFML et que je la revendais donc je ne vois pas en quoi ce serait malhonnête de l'appeler SFGL, de plus, ce n'est pas parce que les noms se ressemble que 2 choses sont identiques.

Le projet SFML est sous license GNU si je ne me trompes donc c'est juste un projets dans le but d'aider tout comme le projets SFGL, et pas dans le but d'avoir du succès et de faire du commerce.

Bref j'ai déjà vu des documentaires sur l'apparition de la micro-informatique, je peux vous dire que il y a des sociétés qui ont fait des choses bien plus malhonnête que ça. (L'une qui demandait à une société de lui fournir un OS en imposant des conditions de tel sorte que la société n'aie aucun droit sur cet OS, l'autre qui à acheté les droits sur un OS et qui a plagié sur une autre société pour les interfaces graphiques de son OS, et l'autre qui a tenté un procès à sa rivale, et enfin la dernière qui exprime sa haine en disant que les OS vont disparaître, sans parler des nombreux clônes qu'il y a eu avec la rétro-ingénieurerie.)
Quand je pense que ce sont des gens qui ont des milliards de sous maintenant..., ce qui me dégoutte encore plus, hors que nous ont fait juste ça comme passion ou pour aider les gens mais qu'on pleure toujours pour trouver un emploi pour avoir sa propre maison, ce sont des choses qui me dégoutte donc voilà il y a des choses plus aberrantes que ça dans l'informatique donc en tant que administrateur de ce projet, je ne comprend pas trop tes réactions parfois sur le forum.
Je voulais juste te dire ça.
Titre: Re : Compiler une librairie.
Posté par: Laurent le Novembre 26, 2013, 08:49:52 pm
Evidemment que tu as le droit d'utiliser ce nom. Et je sais très bien que tu n'as pas d'intention "malhonnête".

Tout ce que je dis, c'est que c'est tellement proche que les gens vont penser que c'est un nouveau projet de l'équipe de SFML. Ou bien un projet officiellement reconnu comme étant le penchant 3D de SFML. C'est tout. Il y aura un lien, c'est inévitable. Après à toi de voir si tu veux que ton projet soit accolé à SFML (et est "digne" de l'être), ou si tu ne préfèrerais pas qu'il parte avec un "casier vierge" ;)
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 26, 2013, 09:28:38 pm
Citer
Après à toi de voir si tu veux que ton projet soit accolé à SFML (et est "digne" de l'être)

Bah j'aimerais bien, maintenant dans le projet il faut savoir qu'il n'y aura pas que de la 3D, mais aussi de la 2D. (Gestion de collision en 2D et en 3D, stockage des entités dans une map en 2D et plus tard en 3D, éclairage et ombrage en 2D et plus tard en 3D, génération de terrain et chargement de modèles et animations en 2D et en 3D, resources holder, graphes de scenes et multipass-rendering, etc...)
C'est juste une librairie que je suis entrain de créer pour m'aider plus tard à créer des jeux.
Et j'ai jugé cela bien de pouvoir la mettre en ligne mais c'est plus pour avoir de l'aide mais dans le but d'aider aussi, je ne sais pas du tout si SFGL deviendra un jour une vrai librairie digne de l'être comme SFML mais je l'espère en tout cas.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 27, 2013, 02:32:06 pm
Re, comme certains le save déjà, j'essaye de compiler une librairie utilisant SFML avec CMake.
J'ai donc suivis ce tutoriel que j'ai trouvé :

http://fr.sfml-dev.org/forums/index.php?action=post;topic=13683.0;last_msg=95882 (http://fr.sfml-dev.org/forums/index.php?action=post;topic=13683.0;last_msg=95882)

J'ai juste du rajouté le path du dossier ou se trouve SFML sur mon PC:
# This script locates the SFML library
# ------------------------------------
#
# Usage
# -----
#
# When you try to locate the SFML libraries, you must specify which modules you want to use (system, window, graphics, network, audio, main).
# If none is given, the SFML_LIBRARIES variable will be empty and you'll end up linking to nothing.
# example:
#   find_package(SFML COMPONENTS graphics window system) // find the graphics, window and system modules
#
# You can enforce a specific version, either MAJOR.MINOR or only MAJOR.
# If nothing is specified, the version won't be checked (ie. any version will be accepted).
# example:
#   find_package(SFML COMPONENTS ...)     // no specific version required
#   find_package(SFML 2 COMPONENTS ...)   // any 2.x version
#   find_package(SFML 2.4 COMPONENTS ...) // version 2.4 or greater
#
# By default, the dynamic libraries of SFML will be found. To find the static ones instead,
# you must set the SFML_STATIC_LIBRARIES variable to TRUE before calling find_package(SFML ...).
# Since you have to link yourself all the SFML dependencies when you link it statically, the following
# additional variables are defined: SFML_XXX_DEPENDENCIES and SFML_DEPENDENCIES (see their detailed
# description below).
# In case of static linking, the SFML_STATIC macro will also be defined by this script.
# example:
#   set(SFML_STATIC_LIBRARIES TRUE)
#   find_package(SFML 2 COMPONENTS network system)
#
# On Mac OS X if SFML_STATIC_LIBRARIES is not set to TRUE then by default CMake will search for frameworks unless
# CMAKE_FIND_FRAMEWORK is set to "NEVER" for example. Please refer to CMake documentation for more details.
# Moreover, keep in mind that SFML frameworks are only available as release libraries unlike dylibs which
# are available for both release and debug modes.
#
# If SFML is not installed in a standard path, you can use the SFML_ROOT CMake (or environment) variable
# to tell CMake where SFML is.
#
# Output
# ------
#
# This script defines the following variables:
# - For each specified module XXX (system, window, graphics, network, audio, main):
#   - SFML_XXX_LIBRARY_DEBUG:   the name of the debug library of the xxx module (set to SFML_XXX_LIBRARY_RELEASE is no debug version is found)
#   - SFML_XXX_LIBRARY_RELEASE: the name of the release library of the xxx module (set to SFML_XXX_LIBRARY_DEBUG is no release version is found)
#   - SFML_XXX_LIBRARY:         the name of the library to link to for the xxx module (includes both debug and optimized names if necessary)
#   - SFML_XXX_FOUND:           true if either the debug or release library of the xxx module is found
#   - SFML_XXX_DEPENDENCIES:    the list of libraries the module depends on, in case of static linking
# - SFML_LIBRARIES:    the list of all libraries corresponding to the required modules
# - SFML_FOUND:        true if all the required modules are found
# - SFML_INCLUDE_DIR:  the path where SFML headers are located (the directory containing the SFML/Config.hpp file)
# - SFML_DEPENDENCIES: the list of libraries SFML depends on, in case of static linking
#
# example:
#   find_package(SFML 2 COMPONENTS system window graphics audio REQUIRED)
#   include_directories(${SFML_INCLUDE_DIR})
#   add_executable(myapp ...)
#   target_link_libraries(myapp ${SFML_LIBRARIES})

# define the SFML_STATIC macro if static build was chosen
if(SFML_STATIC_LIBRARIES)
    add_definitions(-DSFML_STATIC)
endif()

# deduce the libraries suffix from the options
set(FIND_SFML_LIB_SUFFIX "")
if(SFML_STATIC_LIBRARIES)
    set(FIND_SFML_LIB_SUFFIX "${FIND_SFML_LIB_SUFFIX}-s")
endif()

# define the list of search paths for headers and libraries
set(FIND_SFML_PATHS
    ${SFML_ROOT}
    $ENV{SFML_ROOT}
    ~/Library/Frameworks
    /Library/Frameworks
    /usr/local
    /usr
    /sw
    /opt/local
    /opt/csw
    /opt
/SFML-2.1)

# find the SFML include directory
find_path(SFML_INCLUDE_DIR SFML/Config.hpp
          PATH_SUFFIXES include
          PATHS ${FIND_SFML_PATHS})


# check the version number
set(SFML_VERSION_OK TRUE)
if(SFML_FIND_VERSION AND SFML_INCLUDE_DIR)
    # extract the major and minor version numbers from SFML/Config.hpp
    # we have to handle framework a little bit differently :
    if("${SFML_INCLUDE_DIR}" MATCHES "SFML.framework")
        set(SFML_CONFIG_HPP_INPUT "${SFML_INCLUDE_DIR}/Headers/Config.hpp")
    else()
        set(SFML_CONFIG_HPP_INPUT "${SFML_INCLUDE_DIR}/SFML/Config.hpp")
    endif()
    FILE(READ "${SFML_CONFIG_HPP_INPUT}" SFML_CONFIG_HPP_CONTENTS)
    STRING(REGEX MATCH ".*#define SFML_VERSION_MAJOR ([0-9]+).*#define SFML_VERSION_MINOR ([0-9]+).*" SFML_CONFIG_HPP_CONTENTS "${SFML_CONFIG_HPP_CONTENTS}")
    STRING(REGEX REPLACE ".*#define SFML_VERSION_MAJOR ([0-9]+).*" "\\1" SFML_VERSION_MAJOR "${SFML_CONFIG_HPP_CONTENTS}")
    STRING(REGEX REPLACE ".*#define SFML_VERSION_MINOR ([0-9]+).*" "\\1" SFML_VERSION_MINOR "${SFML_CONFIG_HPP_CONTENTS}")
    math(EXPR SFML_REQUESTED_VERSION "${SFML_FIND_VERSION_MAJOR} * 10 + ${SFML_FIND_VERSION_MINOR}")

    # if we could extract them, compare with the requested version number
    if (SFML_VERSION_MAJOR)
        # transform version numbers to an integer
        math(EXPR SFML_VERSION "${SFML_VERSION_MAJOR} * 10 + ${SFML_VERSION_MINOR}")

        # compare them
        if(SFML_VERSION LESS SFML_REQUESTED_VERSION)
            set(SFML_VERSION_OK FALSE)
        endif()
    else()
        # SFML version is < 2.0
        if (SFML_REQUESTED_VERSION GREATER 19)
            set(SFML_VERSION_OK FALSE)
            set(SFML_VERSION_MAJOR 1)
            set(SFML_VERSION_MINOR x)
        endif()
    endif()
endif()

# find the requested modules
set(SFML_FOUND TRUE) # will be set to false if one of the required modules is not found
foreach(FIND_SFML_COMPONENT ${SFML_FIND_COMPONENTS})
    string(TOLOWER ${FIND_SFML_COMPONENT} FIND_SFML_COMPONENT_LOWER)
    string(TOUPPER ${FIND_SFML_COMPONENT} FIND_SFML_COMPONENT_UPPER)
    set(FIND_SFML_COMPONENT_NAME sfml-${FIND_SFML_COMPONENT_LOWER}${FIND_SFML_LIB_SUFFIX})

    # no suffix for sfml-main, it is always a static library
    if(FIND_SFML_COMPONENT_LOWER STREQUAL "main")
        set(FIND_SFML_COMPONENT_NAME sfml-${FIND_SFML_COMPONENT_LOWER})
    endif()

    # debug library
    find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG
                 NAMES ${FIND_SFML_COMPONENT_NAME}-d
                 PATH_SUFFIXES lib64 lib
                 PATHS ${FIND_SFML_PATHS})

    # release library
    find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE
                 NAMES ${FIND_SFML_COMPONENT_NAME}
                 PATH_SUFFIXES lib64 lib
                 PATHS ${FIND_SFML_PATHS})

    if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG OR SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE)
        # library found
        set(SFML_${FIND_SFML_COMPONENT_UPPER}_FOUND TRUE)
       
        # if both are found, set SFML_XXX_LIBRARY to contain both
        if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG AND SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE)
            set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY debug     ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG}
                                                          optimized ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE})
        endif()

        # if only one debug/release variant is found, set the other to be equal to the found one
        if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG AND NOT SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE)
            # debug and not release
            set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG})
            set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY         ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG})
        endif()
        if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE AND NOT SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG)
            # release and not debug
            set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE})
            set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY       ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE})
        endif()
    else()
        # library not found
        set(SFML_FOUND FALSE)
        set(SFML_${FIND_SFML_COMPONENT_UPPER}_FOUND FALSE)
        set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY "")
        set(FIND_SFML_MISSING "${FIND_SFML_MISSING} SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY")
    endif()

    # mark as advanced
    MARK_AS_ADVANCED(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY
                     SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE
                     SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG)

    # add to the global list of libraries
    set(SFML_LIBRARIES ${SFML_LIBRARIES} "${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY}")
endforeach()

# in case of static linking, we must also define the list of all the dependencies of SFML libraries
if(SFML_STATIC_LIBRARIES)

    # detect the OS
    if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
        set(FIND_SFML_OS_WINDOWS 1)
    elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
        set(FIND_SFML_OS_LINUX 1)
    elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
        set(FIND_SFML_OS_FREEBSD 1)
    elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
        set(FIND_SFML_OS_MACOSX 1)
    endif()

    # start with an empty list
    set(SFML_DEPENDENCIES)
    set(FIND_SFML_DEPENDENCIES_NOTFOUND)

    # macro that searches for a 3rd-party library
    macro(find_sfml_dependency output friendlyname)
        find_library(${output} NAMES ${ARGN} PATHS ${FIND_SFML_PATHS} PATH_SUFFIXES lib)
        if(${${output}} STREQUAL "${output}-NOTFOUND")
            unset(output)
            set(FIND_SFML_DEPENDENCIES_NOTFOUND "${FIND_SFML_DEPENDENCIES_NOTFOUND} ${friendlyname}")
        endif()
    endmacro()

    # sfml-system
    list(FIND SFML_FIND_COMPONENTS "system" FIND_SFML_SYSTEM_COMPONENT)
    if(NOT ${FIND_SFML_SYSTEM_COMPONENT} EQUAL -1)

        # update the list -- these are only system libraries, no need to find them
        if(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD OR FIND_SFML_OS_MACOSX)
            set(SFML_SYSTEM_DEPENDENCIES "pthread")
        endif()
        if(FIND_SFML_OS_LINUX)
            set(SFML_SYSTEM_DEPENDENCIES "rt")
        endif()
        if(FIND_SFML_OS_WINDOWS)
            set(SFML_SYSTEM_DEPENDENCIES "winmm")
        endif()
        set(SFML_DEPENDENCIES ${SFML_DEPENDENCIES} ${SFML_SYSTEM_DEPENDENCIES})
    endif()

    # sfml-network
    list(FIND SFML_FIND_COMPONENTS "network" FIND_SFML_NETWORK_COMPONENT)
    if(NOT ${FIND_SFML_NETWORK_COMPONENT} EQUAL -1)

        # update the list -- these are only system libraries, no need to find them
        if(FIND_SFML_OS_WINDOWS)
            set(SFML_NETWORK_DEPENDENCIES "ws2_32")
        endif()
        set(SFML_DEPENDENCIES ${SFML_DEPENDENCIES} ${SFML_NETWORK_DEPENDENCIES})
    endif()

    # sfml-window
    list(FIND SFML_FIND_COMPONENTS "window" FIND_SFML_WINDOW_COMPONENT)
    if(NOT ${FIND_SFML_WINDOW_COMPONENT} EQUAL -1)

        # find libraries
        if(FIND_SFML_OS_LINUX)
            find_sfml_dependency(X11_LIBRARY "X11" X11)
            find_sfml_dependency(XRANDR_LIBRARY "Xrandr" Xrandr)
        endif()

        # update the list
        if(FIND_SFML_OS_WINDOWS)
            set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "opengl32" "winmm" "gdi32")
        elseif(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD)
            set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "GL" ${X11_LIBRARY} ${XRANDR_LIBRARY})
            if(FIND_SFML_OS_FREEBSD)
                set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "usbhid")
            endif()
        elseif(FIND_SFML_OS_MACOSX)
            set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "GL" "-framework Foundation -framework AppKit -framework IOKit -framework Carbon")
        endif()
        set(SFML_DEPENDENCIES ${SFML_DEPENDENCIES} ${SFML_WINDOW_DEPENDENCIES})
    endif()

    # sfml-graphics
    list(FIND SFML_FIND_COMPONENTS "graphics" FIND_SFML_GRAPHICS_COMPONENT)
    if(NOT ${FIND_SFML_GRAPHICS_COMPONENT} EQUAL -1)
   
        # find libraries
        find_sfml_dependency(FREETYPE_LIBRARY "FreeType" freetype)
        find_sfml_dependency(GLEW_LIBRARY "GLEW" glew GLEW glew32 glew32s glew64 glew64s)
        find_sfml_dependency(JPEG_LIBRARY "libjpeg" jpeg)

        # update the list
        set(SFML_GRAPHICS_DEPENDENCIES ${FREETYPE_LIBRARY} ${GLEW_LIBRARY} ${JPEG_LIBRARY})
        set(SFML_DEPENDENCIES ${SFML_DEPENDENCIES} ${SFML_GRAPHICS_DEPENDENCIES})
    endif()

    # sfml-audio
    list(FIND SFML_FIND_COMPONENTS "audio" FIND_SFML_AUDIO_COMPONENT)
    if(NOT ${FIND_SFML_AUDIO_COMPONENT} EQUAL -1)

        # find libraries
        find_sfml_dependency(OPENAL_LIBRARY "OpenAL" openal openal32)
        find_sfml_dependency(SNDFILE_LIBRARY "libsndfile" sndfile)

        # update the list
        set(SFML_AUDIO_DEPENDENCIES ${OPENAL_LIBRARY} ${SNDFILE_LIBRARY})
        set(SFML_DEPENDENCIES ${SFML_DEPENDENCIES} ${SFML_AUDIO_DEPENDENCIES})
    endif()

endif()

# handle errors
if(NOT SFML_VERSION_OK)
    # SFML version not ok
    set(FIND_SFML_ERROR "SFML found but version too low (requested: ${SFML_FIND_VERSION}, found: ${SFML_VERSION_MAJOR}.${SFML_VERSION_MINOR})")
    set(SFML_FOUND FALSE)
elseif(SFML_STATIC_LIBRARIES AND FIND_SFML_DEPENDENCIES_NOTFOUND)
    set(FIND_SFML_ERROR "SFML found but some of its dependencies are missing (${FIND_SFML_DEPENDENCIES_NOTFOUND})")
    set(SFML_FOUND FALSE)
elseif(NOT SFML_FOUND)
    # include directory or library not found
    set(FIND_SFML_ERROR "Could NOT find SFML (missing: ${FIND_SFML_MISSING})")
endif()
if (NOT SFML_FOUND)
    if(SFML_FIND_REQUIRED)
        # fatal error
        message(FATAL_ERROR ${FIND_SFML_ERROR})
    elseif(NOT SFML_FIND_QUIETLY)
        # error but continue
        message("${FIND_SFML_ERROR}")
    endif()
endif()

# handle success
if(SFML_FOUND)
    message(STATUS "Found SFML ${SFML_VERSION_MAJOR}.${SFML_VERSION_MINOR} in ${SFML_INCLUDE_DIR}")
endif()

Et puis j'ai fais un fichier CMakeLists, j'ai juste rajouté quelques ligne pour spécifier ou se trouve les .h et les .a de ma librairie :

cmake_minimum_required(VERSION 2.8)


#Déclaration du projet

project(SFGL)

# Enable debug symbols by default
if(CMAKE_BUILD_TYPE STREQUAL "")
  set(CMAKE_BUILD_TYPE Debug)
endif()
# (you can also set it on the command line: -D CMAKE_BUILD_TYPE=Release)

# Set version information in a config.h file
configure_file(
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )
include_directories("${PROJECT_BINARY_DIR}")


# Define sources and executable
set(EXECUTABLE_NAME "SFGL")
add_executable(${EXECUTABLE_NAME} main.cpp)


# Detect and add SFML
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})
#Find any version 2.X of SFML
#See the FindSFML.cmake file for additional details and instructions
find_package(SFML 2 REQUIRED system window graphics network audio)
if(SFML_FOUND)
  include_directories(${SFML_INCLUDE_DIR}) 
  target_link_libraries(${EXECUTABLE_NAME} ${SFML_LIBRARIES})
endif()


# Install target
install(TARGETS ${EXECUTABLE_NAME} DESTINATION bin)


# CPack packaging
include(InstallRequiredSystemLibraries)
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
set(CPACK_PACKAGE_VERSION_MAJOR "${SFGL_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${SFGL_VERSION_MINOR}")
include(CPack)

set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})

#Génération de la liste des fichiers sources

file(

        GLOB_RECURSE

        source_files

        src/*
include/*

)



#Déclaration de l'exécutable

add_executable(

        sfgl_exe

        ${source_files}

)

Quand je run configure et generate ça marche mais la commande mingw32-make me sors une erreur :
No rules to make target '/SFML-2.1/lib/libsfml-system-d.a', needed by 'bin/Debug/SFGL.exe'. Stop

Alors voilà je sais pas trop ce que je dois faire là. :/
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 27, 2013, 03:07:56 pm
Bon finallement j'ai changé un peu le fichier :
cmake_minimum_required(VERSION 2.8)


#Déclaration du projet

project(SFGL)

# Enable debug symbols by default
if(CMAKE_BUILD_TYPE STREQUAL "")
  set(CMAKE_BUILD_TYPE Debug)
endif()
# (you can also set it on the command line: -D CMAKE_BUILD_TYPE=Release)

# Set version information in a config.h file
configure_file(
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )
include_directories("${PROJECT_BINARY_DIR}")


#Déclaration de l'exécutable

set(EXECUTABLE_NAME "SFGL")
add_executable(${EXECUTABLE_NAME} main.cpp)


# Detect and add SFML
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})
#Find any version 2.X of SFML
#See the FindSFML.cmake file for additional details and instructions
find_package(SFML 2 REQUIRED system window graphics network audio)
if(SFML_FOUND)
  include_directories(${SFML_INCLUDE_DIR}) 
  target_link_libraries(${EXECUTABLE_NAME} ${SFML_LIBRARIES})
endif()
#Génération de la liste des fichiers sources

file(

        GLOB_RECURSE

        source_files

        src/*
include/*

)
add_library(

        sfgl       

        ${source_files}

)

# Install target
install(TARGETS ${EXECUTABLE_NAME} DESTINATION bin)


# CPack packaging
include(InstallRequiredSystemLibraries)
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
set(CPACK_PACKAGE_VERSION_MAJOR "${SFGL_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${SFGL_VERSION_MINOR}")
include(CPack)

set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})

Mais ici j'ai une autre erreur, il me dit qu'il ne trouve pas le fichier SFML/System.hpp




Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 27, 2013, 03:27:29 pm
Bon finalement j'ai trouvé, en fait, le fichier cmake pour trouver SFML que j'utilisais n'était pas le bon. (Fallait que j'utilise celui dans mon dossier cmake de SFML version 2.1 et pas celui que j'ai trouvé sur ce lien.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 27, 2013, 07:28:26 pm
Sinon j'ai une question, comment faire pour lier un .lib dans un .lib ?

J'ai toujours besoin de lier libsfml-system.a à mon projet ainsi que tout les librairies qu'utilise SFML hors que SFGL utilise déjà toutes ces librairies donc je suis embêté avec des undefined references de partout. :/

Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 28, 2013, 06:20:59 pm
Bon je pense que je vais mettre tout sur git-hub ce week-end, j'espère que quelqu'un pourra trouver une solution à mon problème.
J'ai essayer de me baser sur les fichiers CMake fournis avec les sources de SFML et de les modifier mais sans succès. (Ca ne compile tout simplement pas, et ça ne m'affiche pas les emplacements des librairies qu'utilise SFGL comme ça me le fait lorsque je lance CMake puis que j'appuie sur configure avec les dossiers de SFML)

Par contre je n'ai pas crée différents modules. (Mais je pense que je vais quand même tâcher de le faire à l'avenir, quand j'aurai compris un peu mieux comment fonctionne tout ce bazard)

Car j'ai trouvé des tutoriels vraiment basique sur cmake mais ça ne suffit pas car dans le dossier SFML il y a moulte de fichiers et de conditions pour que ça fonctionne sur n'importe quelle plateforme avec n'importe quel compilateur.
De plus il y a aussi les fichiers Config, Macro, etc...
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 28, 2013, 07:54:20 pm
Bien que il n'y aura peut être pas besoin, je pense que je viens de mieux comprendre l'affaire, j'avais pas vu qu'il y a aussi des fichiers CMakeLists dans chaque module et donc je n'avais pas compris que l'ajout des fichiers source se faisait avec la macro sfml_add_library.

Par contre j'aurai préféré un truc du genre files (GLOB_RECURSIVE SRC src/* include/*) plutôt que de devoir écrire toute la liste des noms de tout les fichiers source à la main.

Bref je vais essayer de modifier ces fichiers pour les adapter aux différents module de SFGL, et puis, on verra bien si ça compile enfin ou pas...

Titre: Re : Compiler une librairie.
Posté par: Laurent le Novembre 28, 2013, 08:50:10 pm
Citer
Par contre j'aurai préféré un truc du genre files (GLOB_RECURSIVE SRC src/* include/*) plutôt que de devoir écrire toute la liste des noms de tout les fichiers source à la main.
Le problème de GLOB *, c'est qu'il ne verra pas l'ajout ou la suppression d'un fichier (qui déclenchent une reconfiguration CMake). En ajoutant les fichiers un à un au CMakeLists, tu modifies celui-ci, donc CMake se relance, comme tu t'y attends.

Sinon, je ne suis pas sûr que vouloir reprendre les scripts SFML sans même connaître CMake soit une bonne idée. Ils sont assez chiadés.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 28, 2013, 09:12:03 pm
Oui peut être que ce n'est pas une bonne idée mais ce que j'ai peur c'est de ne pas avoir les dépendances qu'utilise SFML sur les différents système dans ce cas là...

Bon, j'ai compris les scripts (enfin je pense) donc normalement ça devrait aller et si ça ne marche pas j'essayerai de faire mes propre script en ne tenant compte que de ma plateform dans un 1er temps.

Mais ça risque d'être aussi compliqué car il faudra aussi que je mentionne toute les dépendances de SFML sur ma plateform, etc...., et j'ai bien peur d'avoir des problèmes au linkage parce que j'aurai justement oublier une option ou bien de lier une librairie externe, ici le truc c'est que je les aurai tous, je n'ai qu'à rajouté sfml en lib externe et normalement le tour et jouer, et je devrai pas m'occuper de freetype, openal, glew et tout le bazar....

Donc bon j'ai juste repris les fichiers SFML de cmake, en modifiant tout les SFML en SFGL (sauf pour le fichier findSFML évidemment) et j'ai rajouté les headers, les .a et les .dll de sfml dans le dossier extlibs, maintenant il me reste à modifier les fichiers des différents module pour inclure les fichiers source de sfgl et sfml en tant que lib externe supplémentaire.

Bref si j'arrive pas à faire ça avec les fichiers CMake de sfml j'essayerai d'en recréer un tout nouveau. (Mais dans les 2 cas ce ne sera pas simple pour moi, je n'ai jamais utiliser CMake ni toutes ces librairies qui ne sont rien d'autre que de dépendances de SFML, j'ai vu qu'il y avait pleins d'options et j'ai peur que si j'en oublie une ça ne marche pas.
Le fichier CMakeList.txt du module Graphics me fait déjà bien peur. :/
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 29, 2013, 10:59:18 am
Bon, malgré le fait que tout cela soit assez chiadé, j'ai quand même réussi. :D
Mais je n'ai pas encore fini je dois encore faire tout les fichier CMakeLists des différents modules, et les instructions d'installation des différents fichier .dll et .a de SFML qui sont nécessaire à la compilation d'un projet SFGL.
Mais je pense que je vais linker SFML en mode static. (Comme toi tu as fait pour glew d'ailleurs)
Titre: Re : Compiler une librairie.
Posté par: Laurent le Novembre 29, 2013, 11:11:20 am
Lier SFML statiquement va t'obliger à lier toutes ses dépendances toi-même. Et si tu compiles ta bibliothèque statiquement, ça va encore déplacer l'édition de liens vers l'utilisateur final ; i.e. il devra lier ta bibliothèque, les dépendances de ta bibliothèque (si autres que SFML), SFML, et les dépendances de SFML.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 29, 2013, 03:19:56 pm
Là pour le moment je lie SFML statiquement à SFGL, et j'ai un projet qui utilise SFGL et SFML et en effet je dois lier SFML et SFGL à mon projet.

J'ai vu que tu a lié les dépendance de SFML dynamiquement, ça veut dire que si je lie SFML dynamiquement à SFGL, je n'aurai plus besoin de lier SFML à mon projet qui utilise sfgl c'est ça ?

Ok, je vais essayer de lier SFML dynamiquement à SFGL.
C'est en effet le seul gros problème qu'il me reste sinon ça fonctionne, je vais pouvoir créer des maps avec seulement quelques ligne de code youpiii!!!
(Il n'y aura plus que les interfaces graphique et la gestion d’événement à gérer indépendamment pour chacun de mes projets.)
Titre: Re : Compiler une librairie.
Posté par: Laurent le Novembre 29, 2013, 03:21:31 pm
Citer
J'ai vu que tu a lié les dépendance de SFML dynamiquement
Non pas spécialement. Mais de toute façon c'est pas le problème.

Citer
ça veut dire que si je lie SFML dynamiquement à SFGL, je n'aurai plus besoin de lier SFML à mon projet qui utilise sfgl c'est ça ?
Oui.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 29, 2013, 04:31:34 pm
Bon j'ai un problème quand je coche l'option Build shared libs, il me met un message d'erreur "bad realoc" pour un de mes fichier cpp de SFGL.

Donc je dois compiler avec l'option build shared lib de décochée, pas le choix.

Par contre, je ne parviens pas à lier SFML seul dynamiquement car l'option build shared libs est utilisée pour toutes les libs, hors que moi je voudrais lier seulement SFMl dynamiquement. (et pas sfgl sinon ça bug)

Cependant je ne vois pas comment faire, je suppose que si une librairie est liée statiquement les autres doivent l'être aussi non ?
Sinon comment le faire sans devoir utiliser la macro sfml_add_library ?
Pour l'instant je fais ça :

# add include paths of external libraries
include_directories(${FREETYPE_INCLUDE_DIRS} ${GLEW_INCLUDE_PATH} ${JPEG_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR} ${SFML_INCLUDE_DIR})

# build the list of libraries to link
# GL and X11 are only needed for shared build, as they are already linked by sfml-window
set(GRAPHICS_EXT_LIBS ${FREETYPE_LIBRARY} ${GLEW_LIBRARY} ${JPEG_LIBRARY} ${SFML_LIBRARIES})
.......Définition des autres librairies externe à lier......
sfgl_add_library(sfgl
                                 SOURCES ${SRC}
                                 EXTERNAL_LIBS ${OPENAL_LIBRARY} ${SNDFILE_LIBRARY} ${GRAPHICS_EXT_LIBS} ${SYSTEM_EXT_LIBS} ${WINDOW_EXT_LIBS} ${NETWORK_EXT_LIBS})
 

Faudrait que je modifie la macro pour lui passer une option static ou bien shared....
Mais je ne sais pas si je peux vraiment faire ça.
Titre: Re : Compiler une librairie.
Posté par: Laurent le Novembre 29, 2013, 04:45:00 pm
Citer
Bon j'ai un problème quand je coche l'option Build shared libs, il me met un message d'erreur "bad realoc" pour un de mes fichier cpp de SFGL.

Donc je dois compiler avec l'option build shared lib de décochée, pas le choix.
... Ou alors trouver la cause de ce problème.

Citer
Par contre, je ne parviens pas à lier SFML seul dynamiquement car l'option build shared libs est utilisée pour toutes les libs, hors que moi je voudrais lier seulement SFMl dynamiquement. (et pas sfgl sinon ça bug)
BUILD_SHARED_LIBS c'est uniquement pour les trucs que tu compiles, pas ceux que tu lies. Si tu utilises FindSML.cmake alors par défaut il te trouvera les bibliothèques dynamiques ; si tu veux qu'il trouve les bibliothèques statiques il faut définir l'option qui va bien avec de faire le find_package(SFML) (cf. la doc au début du fichier FindSFML.cmake).

Citer
Pour l'instant je fais ça
Pourquoi est-ce que tu t'embêtes avec les include paths et les bibliothèques des dépendances de SFML ?
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 29, 2013, 04:54:57 pm
Citer
Pourquoi est-ce que tu t'embêtes avec les include paths et les bibliothèques des dépendances de SFML ?

Je peux les virer, ça compilera quand même ???

Titre: Re : Compiler une librairie.
Posté par: Laurent le Novembre 29, 2013, 04:57:35 pm
Tu ne les utilises pas dans ton propre code, alors pourquoi tu aurais à t'en soucier ?
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 29, 2013, 05:07:36 pm
Oui, c'est vrai, je ne les utilises pas à part glew.h que j'ai copié dans le dossier include de mingw.

Par contre j'ai essayer de linker SFML dynamiquement mais malgré ça j'ai des undefined reference si je ne link pas les .a de sfml à mon projet :


# include the SFGL specific macros
include(${PROJECT_SOURCE_DIR}/cmake/Macros.cmake)

# let CMake know about our additional libraries paths (on Windows and OS X)
if (WINDOWS)
    set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "${PROJECT_SOURCE_DIR}/extlibs/headers")
    if(COMPILER_GCC)
        if(ARCH_32BITS)
                                    set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-mingw/x86")
            set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/bin/x86")
        elseif(ARCH_64BITS)
                                    set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-mingw/x64")
            set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/bin/x64")
        endif()
    elseif(COMPILER_MSVC)
        if(ARCH_32BITS)
            set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-msvc/x86")
        elseif(ARCH_64BITS)
            set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-msvc/x64")
        endif()
    endif()
elseif(MACOSX)
    set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "${PROJECT_SOURCE_DIR}/extlibs/headers")
    set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${PROJECT_SOURCE_DIR}/extlibs/libs-osx/lib/")
endif()

# add the SFGL sources path
include_directories(${PROJECT_SOURCE_DIR}/src)

# define the path of our additional CMake modules
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules/")

# set the output directory for SFGL libraries
set(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/lib")


include_directories(${SFML_INCLUDE_DIR})

add_definitions(-DSFML_DYNAMIC -DSTBI_FAILURE_USERMSG)
set(INCROOT ${PROJECT_SOURCE_DIR}/include/SFGL)
set(SRCROOT ${PROJECT_SOURCE_DIR}/src/SFGL)
set(SRC
        ${INCROOT}/erreur.h
        ${SRCROOT}/erreur.cpp
        ${INCROOT}/utilities.h
        ${SRCROOT}/utilities.cpp)
sfgl_add_library(sfgl
                                 SOURCES ${SRC}
                                 EXTERNAL_LIBS ${SFML_LIBRARIES})
# add the modules subdirectories
add_subdirectory(Math)
add_subdirectory(BoundingAreas)
add_subdirectory(Graphics)
add_subdirectory(Lighting)
add_subdirectory(Script)       
add_subdirectory(World)
add_subdirectory(Main)
                                 
 

PS : si tu veux un aperçu de mon autre fichier :

cmake_minimum_required(VERSION 2.8)

# define a macro that helps defining an option
macro(sfgl_set_option var default type docstring)
    if(NOT DEFINED ${var})
        set(${var} ${default})
    endif()
    set(${var} ${${var}} CACHE ${type} ${docstring} FORCE)
endmacro()

# set a default build type if none was provided
# this has to be done before the project() instruction!
sfgl_set_option(CMAKE_BUILD_TYPE Release STRING "Choose the type of build (Debug or Release)")

# project name
project(SFGL)

# include the configuration file
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake)

# setup version numbers
set(VERSION_MAJOR 1)
set(VERSION_MINOR 0)
set(VERSION_PATCH 0)
set(CMAKE_CXX_FLAGS "-std=c++11 -O3 -Os ${CMAKE_CXX_FLAGS} ")
# add the sfgl header path
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

# add an option for choosing the build type (shared or static)
sfgl_set_option(BUILD_SHARED_LIBS TRUE BOOL "TRUE to build sfgl as shared libraries, FALSE to build it as static libraries")

# add an option for building the examples
sfgl_set_option(SFGL_BUILD_EXAMPLES FALSE BOOL "TRUE to build the sfgl examples, FALSE to ignore them")

# add an option for building the API documentation
sfgl_set_option(SFGL_BUILD_DOC FALSE BOOL "TRUE to generate the API documentation, FALSE to ignore it")

# Mac OS X specific options
if(MACOSX)
    # add an option to build frameworks instead of dylibs (release only)
    sfgl_set_option(SFGL_BUILD_FRAMEWORKS FALSE BOOL "TRUE to build sfgl as frameworks libraries (release only), FALSE to build according to BUILD_SHARED_LIBS")
   
    # add an option to let the user specify a custom directory for frameworks installation (sfgl, sndfile, ...)
    sfgl_set_option(CMAKE_INSTALL_FRAMEWORK_PREFIX "/Library/Frameworks" STRING "Frameworks installation directory")
   
endif()

# define sfgl_STATIC if the build type is not set to 'shared'
if(NOT BUILD_SHARED_LIBS)
    add_definitions(-DSFGL_STATIC)
endif()

# remove SL security warnings with Visual C++
if(COMPILER_MSVC)
    add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
endif()

# define an option for choosing between static and dynamic C runtime (Windows only)
if(WINDOWS)
    sfgl_set_option(SFGL_USE_STATIC_STD_LIBS FALSE BOOL "TRUE to statically link to the standard libraries, FALSE to use them as DLLs")

    # the following combination of flags is not valid
    if (BUILD_SHARED_LIBS AND SFGL_USE_STATIC_STD_LIBS)
        message(FATAL_ERROR "BUILD_SHARED_LIBS and sfgl_USE_STATIC_STD_LIBS cannot be used together")
    endif()

    # for VC++, we can apply it globally by modifying the compiler flags
    if(COMPILER_MSVC AND SFGL_USE_STATIC_STD_LIBS)
        foreach(flag
                CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
                CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
            if(${flag} MATCHES "/MD")
                string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}")
            endif()
        endforeach()
    endif()
endif()

# disable the rpath stuff
set(CMAKE_SKIP_BUILD_RPATH TRUE)

# setup Mac OS X stuff
if(MACOSX)
    # sfgl_BUILD_FRAMEWORKS needs two things :
    # first, it's available only for release
    #    (because cmake currently doesn't allow specifying a custom framework name so XXX-d is not possible)
    # secondly, it works only with BUILD_SHARED_LIBS enabled
    if(SFGL_BUILD_FRAMEWORKS)
        # requirement #1
        if(NOT CMAKE_BUILD_TYPE STREQUAL "Release")
            message(FATAL_ERROR "CMAKE_BUILD_TYPE should be \"Release\" when sfgl_BUILD_FRAMEWORKS is TRUE")
            return()
        endif()

        # requirement #2
        if(NOT BUILD_SHARED_LIBS)
            message(FATAL_ERROR "BUILD_SHARED_LIBS should be TRUE when sfgl_BUILD_FRAMEWORKS is TRUE")
            return()
        endif()
    endif()
endif()

if(LINUX)
    if(BUILD_SHARED_LIBS)
        sfgl_set_option(SFGL_INSTALL_PKGCONFIG_FILES TRUE BOOL "TRUE to automatically install pkg-config files so other projects can find sfgl")
        if(SFGL_INSTALL_PKGCONFIG_FILES)
            foreach(sfgl_module IN ITEMS all)
                CONFIGURE_FILE(
                    "tools/pkg-config/sfgl-${sfgl_module}.pc.in"
                    "tools/pkg-config/sfgl-${sfgl_module}.pc"
                    @ONLY)
            INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/tools/pkg-config/sfgl-${sfgl_module}.pc"
                    DESTINATION "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/pkgconfig")
            endforeach()
        endif()
    else()
        if(SFGL_INSTALL_PKGCONFIG_FILES)
            message(WARNING "No pkg-config files are provided for the static sfgl libraries (sfgl_INSTALL_PKGCONFIG_FILES will be ignored).")
        endif()
    endif()
endif()

# enable project folders
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake")

# add the subdirectories
add_subdirectory(src/SFGL)
if(SFGL_BUILD_EXAMPLES)
    add_subdirectory(examples)
endif()
if(SFGL_BUILD_DOC)
    add_subdirectory(doc)
endif()

# setup the install rules
if(NOT SFGL_BUILD_FRAMEWORKS)
    install(DIRECTORY include
            DESTINATION .
            COMPONENT devel
            PATTERN ".svn" EXCLUDE)
else()
    # find only "root" headers
    file(GLOB SFGL_HEADERS RELATIVE ${PROJECT_SOURCE_DIR} "include/SFGL/*")

    # in fact we have to fool cmake to copy all the headers in subdirectories
    # to do that we have to add the "root" headers to the PUBLIC_HEADER
    # then we can run a post script to copy the remaining headers

    # we need a dummy file in order to compile the framework
    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp
                       COMMAND touch ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp)

    set(SFGL_SOURCES ${SFGL_HEADERS})
    list(APPEND SFGL_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp)

    # create sfgl.framework
    add_library(SFGL ${SFGL_SOURCES})

    # edit target properties
    set_target_properties(SFGL PROPERTIES
                          FRAMEWORK TRUE
                          FRAMEWORK_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
                          MACOSX_FRAMEWORK_IDENTIFIER org.sfgl-dev.sfgl
                          MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
                          MACOSX_FRAMEWORK_BUNDLE_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
                          PUBLIC_HEADER "${SFGL_HEADERS}")

    # add the remaining headers
    add_custom_command(TARGET SFGL
                       POST_BUILD
                       COMMAND cp -r ${PROJECT_SOURCE_DIR}/include/SFGL/* SFGL.framework/Versions/${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}/Headers)

    # adapt install directory to allow distributing dylibs/frameworks in user’s frameworks/application bundle
    # NOTE : it's not required to link agains sfgl.framework
    set_target_properties(SFGL PROPERTIES
                          BUILD_WITH_INSTALL_RPATH 1
                          INSTALL_NAME_DIR "@executable_path/../Frameworks")

    # install rule
    install(TARGETS SFGL
            FRAMEWORK DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX}
            COMPONENT devel)
endif()

install(FILES cmake/Modules/FindSFGL.cmake DESTINATION ${INSTALL_MISC_DIR}/cmake/Modules)
install(FILES license.txt DESTINATION ${INSTALL_MISC_DIR})
install(FILES readme.txt DESTINATION ${INSTALL_MISC_DIR})

if(WINDOWS)
    if(ARCH_32BITS)            
                install(FILES extlibs/bin/x86/sfml-system-2.dll DESTINATION bin)
                install(FILES extlibs/bin/x86/sfml-window-2.dll DESTINATION bin)
                install(FILES extlibs/bin/x86/sfml-graphics-2.dll DESTINATION bin)
                install(FILES extlibs/bin/x86/sfml-network-2.dll DESTINATION bin)
                install(FILES extlibs/bin/x86/sfml-audio-2.dll DESTINATION bin)
        install(FILES extlibs/bin/x86/libsndfile-1.dll DESTINATION bin)
        install(FILES extlibs/bin/x86/openal32.dll DESTINATION bin)
    elseif(ARCH_64BITS)
        install(FILES extlibs/bin/x64/libsndfile-1.dll DESTINATION bin)
        install(FILES extlibs/bin/x64/openal32.dll DESTINATION bin)
    endif()
elseif(MACOSX)
    install(DIRECTORY extlibs/libs-osx/Frameworks/sndfile.framework DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX})
    install(DIRECTORY extlibs/libs-osx/Frameworks/freetype.framework DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX})
   
endif()


Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 29, 2013, 05:31:29 pm
Nope, il ne veut vraiment pas me lier SFML dynamiquement à la compilation de ma librairie. :/ (Pourtant j'ai bien enlevé le find_package (SFML REQUIRED))
Titre: Re : Compiler une librairie.
Posté par: Laurent le Novembre 29, 2013, 06:54:33 pm
Citer
Pourtant j'ai bien enlevé le find_package (SFML REQUIRED)
Gné ?
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 29, 2013, 08:00:44 pm
Bof non que je mette ça ou pas il faut toujours que je link les .a de SFML à mon projet qui utilise SFGL.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 30, 2013, 09:33:50 am
Je pense qu'il ne faut pas chercher plus loin : comme mon projet utilise SFGL et SFML je pense que je suis obligé de toute façon de linker les 2 bibliothèques à mon projet.

Je crois que je n'ai donc plus qu'à régler ce bug pour la compilation de la librairie en mode shared.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 30, 2013, 10:34:33 am
Bon, j'ai bien fait un find_package(SFML 2 COMPONENTS graphics window system) mais lorsque je ne link pas les .a de SFML à mon projet qui utilise SFML et SFGL j'ai des undefined references, et lorsque je les link les .a de sfml à mon projet j'ai erreurs des multiples definitions off.
Mais je link peut être mal SFML, peut être que je ne devrait pas la link en utilisant cette macro  (que j'ai copié du fichier Macro.cmake de SFML) :
sfgl_add_library(sfgl SOURCES ${SRC} EXTERNAL_LIBS{SFML_LIBRAIRIES})

Mais la link autrement, maintenant faut que je sache comment la link...




Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Novembre 30, 2013, 10:43:06 am
Mais dans ce tutoriel : https://github.com/SFML/SFML/wiki/Tutorial%3A-Build-your-SFML-project-with-CMake

J'ai vu que tu linkais la bibliothè à l'exécutable avec target_link_libraries hors que moi je n'ai pas d'exécutable vu que c'est une librairie et pas un projet.

Donc bon je me demande comment faire pour la linker dynamiquement, à moins que find_package (SFML 2 COMPONENTS graphics window system) le fasse déjà ?

Bref je ne comprend pas très bien là.
Titre: Re : Compiler une librairie.
Posté par: Laurent le Novembre 30, 2013, 06:45:48 pm
target_link_libraries fonctionne pour tout type de target, pas que les exécutables.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 01, 2013, 09:55:03 am
Ha je pense que j'ai trouvé comment faire cette fois. :D
set(INCROOT ${PROJECT_SOURCE_DIR}/include/SFGL)
set(SRCROOT ${PROJECT_SOURCE_DIR}/src/SFGL)
set(SRC
${INCROOT}/erreur.h
${SRCROOT}/erreur.cpp
${INCROOT}/utilities.h
${SRCROOT}/utilities.cpp)
sfgl_add_library(sfgl
SOURCES ${SRC})
find_package(SFML 2 COMPONENTS graphics window system)
include_directories(${PROJECT_SOURCE_DIR}/src ${SFML_INCLUDE_DIR})
target_link_libraries (sfgl ${SFML_LIBRARIES})
Je test ça, si ça marche, alors je rajouterai les dernière classe de la librairie et je mettrai ça sur git-hub et je débuterai enfin le tutoriel. (Sur un autre site)
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 01, 2013, 10:48:26 am
Sinon, j'ai vu que tu avais aussi un module sfml-main mais ça ne marche qu'avec windows, donc, j'espère que en liant dynamiquement sfml ça marchera aussi sous les autres plateformes.

Une autre question sinon, je n'ai plus besoin des fichiers .a de sfml dans mon projet SFGL hein si je la link dynamiquement je n'ai besoin que des fichiers .dll de sfml hein ?

Parce que j'ai toujours des erreurs de undefined reference même en ayant linker sfml dynamiquement avec target_link_librairies. :/

Et le plus inquiétant est, quand je veux link sfml à mon projet qui utilise sfgl là je n'ai plus d'erreur de undefined reference mais il me dit qu'il me trouve 2 fois les mêmes fonction c'est à dire dans les .a de SFML et dans les .a de sfgl, donc, je comprend vraiment pas pourquoi quand je ne lie plus les .a de sfml à mon projet, il ne trouve plus les .a de sfml hors qu'elles sont liées dynamiquement aux .a de sfgl...
Titre: Re : Compiler une librairie.
Posté par: Laurent le Décembre 01, 2013, 11:07:15 am
Le problème c'est que tu fonces tête baissée dans des choses que tu ne maîtrises pas. Tu tâtonnes jusqu'à ce que "ça marche". Tu vas droit dans le mur comme ça. Tu devrais plutôt prendre les problèmes / questions un à un, tranquillement, prendre le temps de les comprendre et de les résoudre. Là tu patauges parce qu'il te manque une ou deux notions de base sur l'édition de liens et les bibliothèques ; si tu te renseignais sur ces sujets au lieu de bidouiller tes scripts CMake, tu gagnerais du temps.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 01, 2013, 11:35:28 am
Bah j'ai lu ce tutoriel : http://fr.openclassrooms.com/informatique/cours/creer-des-bibliotheques-avec-code-blocks/les-bibliotheques-dynamiques-2 (http://fr.openclassrooms.com/informatique/cours/creer-des-bibliotheques-avec-code-blocks/les-bibliotheques-dynamiques-2)

Pour essayer de comprendre un peu mieux comment linker tout ça.

Mais ce que je voudrais savoir c'est si, sous windows, avec le script findSFML, pour la liaison dynamique, tu as fais une bibliothèque à chargement implicite ou bien à chargement explicite ???

Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 01, 2013, 12:26:33 pm
Ecoute ton idée ne marche pas car même en liant dynamiquement SFML à sfgl je dois quand même encore lier les .a de SFML à mon projet.

Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 01, 2013, 12:51:27 pm
Et encore une chose, pour la compilation de SFML je ne vois pas d'option pour compiler en 32 ou en 64 bits, par défaut ça effectue une compilation en 32 ou bien en 64 bits ???

Car moi quand je compile sfgl et que je lie les .a de sfg et sfml à mon projet j'ai une erreur d'incompatibilité, et je compile mon projet en 32 bits.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 01, 2013, 01:02:55 pm
Ha non je n'ai rien dit c'est l'option CMAKE_OSX_ARCHITECTURES.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 01, 2013, 01:36:43 pm
Bon j'ai des problèmes d'incompatibilité maintenant entre du code 64 bits et du code 32 bits.  >:(

Pourtant j'ai bien compilé SFML et SFGL en 32 bits...., mais le programme ne veut plus s'exécuter.

Je pense que je vais tout simplement mettre tout ça sur github, et, voir, si y'a pas quelqu'un qui pourrait m'aider là dessus.
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 01, 2013, 10:03:20 pm
Bon sur ce coup là je sèche vraiment, j'ai même essayé de compiler sfgl avec le flag -m32 mais même problème. :/

Je pense que je vais repartir sur le mode statique en liant les dépendances d'sfml à sfgl, là bizarrement ça marchait, il y avait juste que je je devais lié les fichiers SFML et sfgl -s.a à mon projet. (donc beaucoup de fichier à lier quoi)

Mais au moins, ça marchait. :)



Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 02, 2013, 10:09:03 am
Bon finalement j'ai réussi.

Il fallait que je link sfml dans tout les modules de sfgl, et pas seulement dans le module principal.
Mais comme je ne m'y connais pas de trop avec CMake, que c'est ma 1ère librairie et que en plus je n'ai jamais eu l'occasion de travailler en entreprise et sur différentes plateformes, je pense que je vais laisser le soin à un expert d'améliorer l'installation de la librairie sur les différentes plateformes existantes.


Sinon, j'ai installé boost dans le dossier include de mingw parce que je n'ai pas envie de me casser plus la tête avec cmake pour l'instant, ça fait déjà une semaine que je suis dessus, j'ai essayer le code trouvé sur le tutoriel de Laurent pour installer boost mais malgré ça cmake me dit qu'il ne trouve pas boost donc...



Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 06, 2013, 02:38:15 pm
Salut, je voudrais savoir si pour les dépendances de SFML, je parle bien sûr des include et des .a, ces fichiers sont déjà présent dans les dossiers de mingw ou bien tu as fais quelque chose avec CMake pour qu'il les trouve automatiquement dès qu'on compile un projet SFML ?

Car, quand je fais les include de SFML il me trouve glew.h hors que celui-ci n'est pas dans le dossier d'installation de SFML.
Pareil pour les .a.

Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 06, 2013, 02:49:50 pm
Bref moi je pense que les dépendances de sfml sont dans le dossier de mingw car lorsque je retire les include de sfml dans mon dossier sfgl installé, ça ne compile plus il me dit qu'il ne trouve pas les fichiers headers de SFML.

Il n'y a que sur windows en linkage dynamic avec chargement explicite que normalement là tu n'as plus besoin des .a. (mais juste des .dll qu'il faut ajouter dans le dossier de l'exécutable)
Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 10, 2013, 10:57:37 am
Re :

J'ai un petite soucis de droits sur windows 7 avec CMake je m'explique :

Quand je veux link une librairie externe il me met cette erreur-ci :

ar.exe : D:/Projets/Projets-c++/SFGL/extlibs/libs-mingw/x86 : Permission denied.

J'ai essayer de changer les droits du dossier x86 (en mode gui et en mode commance) mais ça ne marche pas, il me le remet toujours en lecture seule...

Quelqu'un à déjà eu ce problème et à t'il trouvé une solution ???



Titre: Re : Compiler une librairie.
Posté par: Lolilolight le Décembre 10, 2013, 04:15:58 pm
Bon finalement ça n'arrive que lorsque j'utilise la macro de sfml pour lier les librairies externes que j'ai ce message d'erreur.

Au final, donc, j'ai remplacer ça par un bon vieux target_link_librairies.

Par contre pour mingw-tdm il me semble que il faut absolument télécharger 2 versions (la 32 bits et la 64 bits) si l'on veut compiler en 32 et en 64 bits.

L'option -32 ne semble pas marcher pour les tdm.