Questão de licença de headers [RESOLVIDO]

1. Questão de licença de headers [RESOLVIDO]

M.
XProtoman

(usa Fedora)

Enviado em 24/03/2017 - 14:07h

Boa tarde a todos,

Estou pegando as declarações de função completas de vários headers, porém ignorando e omitindo várias partes desnecessárias como macros, #defines, etc. Essas declarações são modificadas para passar em um processador/complicador que desenvolvi.

Primeira questão: Sou obrigado a colocar a licença original nos headers nas minhas modificações?

Segunda questão: O produto da compilação pelo meu processador, que utilizará apenas os nomes das funções, também deverá apresentar a licença original do autor dos headers?

Para ter algo como exemplo, imagine que extraí as funções de <GL/gl.h>, como a abaixo:
GLAPI void GLAPIENTRY glClearIndex( GLfloat c ); 


Ela modificada para trabalhar no processador:
void $sym(glClearIndex)( GLfloat c ); 


Ela presente no arquivo gerado(depois do processamento):
glClearIndex 


PS: Não quero induzir a uma resposta, mas acredito para meus dois questionamentos preciso apresentar a licença do autor, mesmo no produto gerado.


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/03/2017 - 22:58h

Depende do tipo de licença, e depende do tipo de entrega que o seu produto vai gerar.

O texto das licenças em arquivos de includes está posto lá como comentários. Comentários são descartados quando você gera um executável ou biblioteca.

No entanto, uma licença como a GPL exige que você disponibilize o código fonte de qualquer produto que você (re)distribuir em forma binária se você embutir nele qualquer parte (mesmo que seja só uma linha) de qualquer arquivo licenciado com GPL. Além disso, muitas licenças (incluindo GPL e BSD) exigem que a documentação do produto reproduza partes do texto da licença ou dos créditos ou copyrights do material que você tenha incluído no seu produto.

3. Re: Questão de licença de headers

M.
XProtoman

(usa Fedora)

Enviado em 06/04/2017 - 07:58h

Bom dia paulo1205,

Segue uma imagem para você entender o sistema: http://imgur.com/a/9mJh6

A seguir escrevi os detalhes.

Demorei a responder o tópico porque passei muito tempo pensando. Não se preocupe que não tem GPL envolvido, apenas licenças no estilo BSD e no máximo LGPL.

Faz uns anos que vi o binário do jogo Quake Wars e me impressionei por ele não ter muitas bibliotecas ligadas se comparado a outro jogo do Linux, Neverwinter Nights, mais antigo, nem mesmo OpenGL estava presente em Quake Wars. Fazem alguns meses que vi o SDL 2.0 sem muitas bibliotecas ligadas também.

Um dia descobri o dlopen e dlsym e matei a charada do que pode ter sido usado por Quake Wars e o SDL e o motivo de ser utilizado.

Quero e estou usando "carga de biblioteca dinâmica"(acho que é esse o termo do que é feito com dlopen e dlsym) porque acho que se desenvolver algum software vou ter um pouco mais de tranquilidade em rodá-lo em diferentes distribuições, sendo necessário que apenas o sistema possua as bibliotecas que faço carga.

Não sei como o Quake e o SDL fazem carga, porque não analisei o código.

Pensando muito no problema encontrei um caminho que foi o de facilitar minha vida ao fazer um preprocessador que captura o nome das funções e gera um header e um fonte, porém o que alimenta ele precisa ser feito pelo usuário, você precisa pegar as funções/símbolos(do header original) que você quer e criar um outro header ajustado para alimentar o preprocessador.

O que é pego é declaração completa da função, exemplo:
void funcao(int argumento); 
.

Nada além disso é pego do header(original). No código fonte gerado estará presente apenas o nome das funções:
funcao 


Porém no header gerado vai conter algo similar isso:
void (*funcao)(int argumento); 
.

Minha preocupação é que não quero outras licenças desnecessariamente adicionadas a licença original da minha biblioteca. Estou por exemplo fazendo carga do gnutls e libudev, ambos sob LGPL, mas minha biblioteca usa licença similar a BSD.

Acho que a licença original no máximo deve fazer parte dos headers gerados, porém não do código fonte gerado, porque eles contém apenas o nome das funções.

A justificativa do header gerado possivelmente precisar da licença é porque o resultado dele é próximo do header original. Porém acho que não justifica licenciar o fonte gerado.

O que acha?

O SDL com certeza faz carga de biblioteca e está licenciado apenas em zlib, quando deveria também estar licenciado em LGPL porque faz uso da libudev.

____________________
“Mas nós sabemos que a razão de a maioria estar aqui, é a nossa afinidade com a desobediência!” (Morpheus)


4. Re: Questão de licença de headers

M.
XProtoman

(usa Fedora)

Enviado em 06/04/2017 - 08:04h

Descobri que o SDL não coloca a licença das outras bibliotecas, então penso não deve ser necessário nem para o header gerado, nem mesmo para o fonte gerado:
/*
Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/

#include "../../SDL_internal.h"

#ifndef _SDL_udev_h
#define _SDL_udev_h

#if HAVE_LIBUDEV_H

#ifndef SDL_USE_LIBUDEV
#define SDL_USE_LIBUDEV 1
#endif

#include "SDL_loadso.h"
#include "SDL_events.h"
#include <libudev.h>
#include <sys/time.h>
#include <sys/types.h>

/**
* \brief Device type
*/

typedef enum
{
SDL_UDEV_DEVICEADDED = 1,
SDL_UDEV_DEVICEREMOVED
} SDL_UDEV_deviceevent;

/* A device can be any combination of these classes */
typedef enum
{
SDL_UDEV_DEVICE_UNKNOWN = 0x0000,
SDL_UDEV_DEVICE_MOUSE = 0x0001,
SDL_UDEV_DEVICE_KEYBOARD = 0x0002,
SDL_UDEV_DEVICE_JOYSTICK = 0x0004,
SDL_UDEV_DEVICE_SOUND = 0x0008,
SDL_UDEV_DEVICE_TOUCHSCREEN = 0x0010
} SDL_UDEV_deviceclass;

typedef void (*SDL_UDEV_Callback)(SDL_UDEV_deviceevent udev_type, int udev_class, const char *devpath);

typedef struct SDL_UDEV_CallbackList {
SDL_UDEV_Callback callback;
struct SDL_UDEV_CallbackList *next;
} SDL_UDEV_CallbackList;

typedef struct SDL_UDEV_PrivateData
{
const char *udev_library;
void *udev_handle;
struct udev *udev;
struct udev_monitor *udev_mon;
int ref_count;
SDL_UDEV_CallbackList *first, *last;

/* Function pointers */
const char *(*udev_device_get_action)(struct udev_device *);
const char *(*udev_device_get_devnode)(struct udev_device *);
const char *(*udev_device_get_subsystem)(struct udev_device *);
struct udev_device *(*udev_device_get_parent_with_subsystem_devtype)(struct udev_device *udev_device, const char *subsystem, const char *devtype);
const char *(*udev_device_get_property_value)(struct udev_device *, const char *);
const char *(*udev_device_get_sysattr_value)(struct udev_device *udev_device, const char *sysattr);
struct udev_device *(*udev_device_new_from_syspath)(struct udev *, const char *);
void (*udev_device_unref)(struct udev_device *);
int (*udev_enumerate_add_match_property)(struct udev_enumerate *, const char *, const char *);
int (*udev_enumerate_add_match_subsystem)(struct udev_enumerate *, const char *);
struct udev_list_entry *(*udev_enumerate_get_list_entry)(struct udev_enumerate *);
struct udev_enumerate *(*udev_enumerate_new)(struct udev *);
int (*udev_enumerate_scan_devices)(struct udev_enumerate *);
void (*udev_enumerate_unref)(struct udev_enumerate *);
const char *(*udev_list_entry_get_name)(struct udev_list_entry *);
struct udev_list_entry *(*udev_list_entry_get_next)(struct udev_list_entry *);
int (*udev_monitor_enable_receiving)(struct udev_monitor *);
int (*udev_monitor_filter_add_match_subsystem_devtype)(struct udev_monitor *, const char *, const char *);
int (*udev_monitor_get_fd)(struct udev_monitor *);
struct udev_monitor *(*udev_monitor_new_from_netlink)(struct udev *, const char *);
struct udev_device *(*udev_monitor_receive_device)(struct udev_monitor *);
void (*udev_monitor_unref)(struct udev_monitor *);
struct udev *(*udev_new)(void);
void (*udev_unref)(struct udev *);
struct udev_device * (*udev_device_new_from_devnum)(struct udev *udev, char type, dev_t devnum);
dev_t (*udev_device_get_devnum) (struct udev_device *udev_device);
} SDL_UDEV_PrivateData;

extern int SDL_UDEV_Init(void);
extern void SDL_UDEV_Quit(void);
extern void SDL_UDEV_UnloadLibrary(void);
extern int SDL_UDEV_LoadLibrary(void);
extern void SDL_UDEV_Poll(void);
extern void SDL_UDEV_Scan(void);
extern int SDL_UDEV_AddCallback(SDL_UDEV_Callback cb);
extern void SDL_UDEV_DelCallback(SDL_UDEV_Callback cb);




#endif /* HAVE_LIBUDEV_H */

#endif /* _SDL_udev_h */


____________________
“Mas nós sabemos que a razão de a maioria estar aqui, é a nossa afinidade com a desobediência!” (Morpheus)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts