Un piccolo sfogo da programmatore amatoriale

Scrivo questo sfogo per raccontarvi quello che appare sempre di più come una realtà verso cui sta puntando molto del software attuale libero e non solo: la perdita sempre più forte della semplicità d’utilizzo e l’aumento della complessità per risolvere situazioni semplici. Io programmo in C++ usando la libreria Qt fin dalla versione 3. La libreria in se ha subito molti cambiamenti che a differenza della GTK di GNOME sono stati graduali e progressivi e questo si è riflettuto sulla libreria KDE. Per la gestione della compilazione dei programmi si è passati dal vecchio Make prima a QMake, tuttora esistente, e ora a CMake, Qbs e Ninja ed è proprio CMake l’esempio di questa spirale perversa. Sto facendo un programma sotto KDE 6 e ho creato una libreria condivisa basata sempre su questa piattaforma software. Il problema nasce non dalla compilazione della libreria e del programma ma dal fatto che sebbene abbia indicato le classi della libreria come esportabili esse non vengono collegate al programma che ne fa uso. Ho cercato se esisteva della documentazione a riguardo e la cosa che salta agli occhi è la verbosità. Ecco due esempi tratti dalla libreria KDE, per la precisione i CMake per la compilazione di KParts, prima nella versione 4 e poi della attuale versione 6:

project(kparts)
add_subdirectory( tests )
include_directories(${KDE4_KIO_INCLUDES} ${kparts_BINARY_DIR})if(HAVE_NEPOMUK)include_directories(${nepomuk_SOURCE_DIR} ${nepomuk_SOURCE_DIR}/core ${nepomuk_SOURCE_DIR}/types)endif(HAVE_NEPOMUK)if(Soprano_FOUND)include_directories(${SOPRANO_INCLUDE_DIR})endif(Soprano_FOUND)
########### next target ###############
set(kparts_LIB_SRCSpart.cppplugin.cpppartmanager.cppmainwindow.cppevent.cppbrowserextension.cppfactory.cpphistoryprovider.cppbrowserinterface.cppbrowserrun.cppbrowseropenorsavequestion.cppstatusbarextension.cppscriptableextension.cpptextextension.cpphtmlextension.cppfileinfoextension.cpplistingextension.cpp)
kde4_add_library(kparts ${LIBRARY_TYPE} ${kparts_LIB_SRCS})
target_link_libraries(kparts  LINK_PRIVATE ${KDE4_KDECORE_LIBS} kdeui kio)target_link_libraries(kparts  LINK_PUBLIC kio kdeui kdecore ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} )if(HAVE_NEPOMUK)target_link_libraries(kparts  LINK_PRIVATE nepomuk nepomukutils)target_link_libraries(kparts  LINK_PUBLIC nepomuk nepomukutils )endif(HAVE_NEPOMUK)
set_target_properties(kparts PROPERTIES VERSION ${GENERIC_LIB_VERSION}SOVERSION ${GENERIC_LIB_SOVERSION})
install(TARGETS kparts EXPORT kdelibsLibraryTargets ${INSTALL_TARGETS_DEFAULT_ARGS})
########### install files ###############

install( FILES kpart.desktop krop.desktop krwp.desktop browserview.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR} )install( FILES kparts_export.h part.h plugin.h partmanager.h mainwindow.h event.hbrowserextension.h factory.h historyprovider.h browserinterface.h genericfactory.hcomponentfactory.h browserrun.h statusbarextension.h browseropenorsavequestion.hscriptableextension.h textextension.h htmlextension.h fileinfoextension.hlistingextension.hDESTINATION ${INCLUDE_INSTALL_DIR}/kparts COMPONENT Devel )

add_library(KF6Parts)add_library(KF6::Parts ALIAS KF6Parts)

set_target_properties(KF6Parts PROPERTIESVERSION ${KPARTS_VERSION}SOVERSION ${KPARTS_SOVERSION}EXPORT_NAME Parts)

target_sources(KF6Parts PRIVATEpartbase.cpppart.cpppartloader.cppopenurlarguments.cppreadonlypart.cppreadwritepart.cpppartmanager.cppmainwindow.cppguiactivateevent.cpppartactivateevent.cppnavigationextension.cppopenurlevent.cppstatusbarextension.cppfileinfoextension.cpplistingfilterextension.cpplistingnotificationextension.cpp)
include(ECMGenerateHeaders)ecm_generate_headers(KParts_CamelCase_HEADERSHEADER_NAMESFileInfoExtensionGUIActivateEventListingFilterExtensionListingNotificationExtensionMainWindowNavigationExtensionOpenUrlArgumentsOpenUrlEventPartPartActivateEventPartBasePartLoaderPartManagerReadOnlyPartReadWritePartStatusBarExtensionREQUIRED_HEADERS KParts_HEADERSPREFIX KParts)install(FILES ${KParts_CamelCase_HEADERS}DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KParts/KPartsCOMPONENT Devel)
ecm_qt_declare_logging_category(KF6PartsHEADER kparts_logging.hIDENTIFIER KPARTSLOGCATEGORY_NAME kf.partsDESCRIPTION “KParts”EXPORT KPARTSLOG)
ecm_generate_export_header(KF6PartsEXPORT_FILE_NAME ${KParts_BINARY_DIR}/kparts/kparts_export.hBASE_NAME KPartsGROUP_BASE_NAME KFVERSION ${KF_VERSION}USE_VERSION_HEADERDEPRECATED_BASE_VERSION 0DEPRECATION_VERSIONSEXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT})
target_include_directories(KF6PartsPUBLIC “$<BUILD_INTERFACE:${KParts_BINARY_DIR}>”INTERFACE “$<INSTALL_INTERFACE:${KDE_INSTALL_INCLUDEDIR_KF}/KParts>”)
target_link_libraries(KF6PartsPUBLICKF6::KIOCore # KFileItem used in FileInfoExtension APIKF6::XmlGui # essential to the technologyPRIVATEKF6::ServiceKF6::I18nKF6::JobWidgetsKF6::KIOWidgets)
install(TARGETS KF6Parts EXPORT KF6PartsTargets ${KF_INSTALL_TARGETS_DEFAULT_ARGS})
install(FILES${KParts_BINARY_DIR}/kparts/kparts_export.h${KParts_HEADERS}DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KParts/kparts COMPONENT Devel)
install(FILES kde_terminal_interface.h DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KParts )
ecm_qt_install_logging_categories(EXPORT KPARTSLOGFILE kparts.categoriesDESTINATION ${KDE_INSTALL_LOGGINGCATEGORIESDIR})

ecm_generate_qdoc(KF6Parts kparts.qdocconf)

Capisco che gli strumenti a disposizione di un qualsiasi programmatore sono cambiati col tempo ma qui si sta arrivando lentamente al punto di rottura. Un altro esempio è l’ambiente desktop KDE che era nato con l’obiettivo di uniformare tutti i programmi ad un certo stile d’interfaccia grafica ma oramai tutti vanno a briglie sciolte: Kate possiede una interfaccia che definirei problematica; KDevelop a partire dalla versione 4 è dotato sia una pessima interfaccia grafica nata in un delirio di onnipotenza ( volevano emulare Eclipse… ) sia una forte instabilità legata alla sua architettura a plugin; Calligra Suite segue la moda minimalista ma si è dimenticato lo scopo della barra dei menu; digiKam fa piangere, visto l’ambiente pessimamente progettato; eccetera eccetera. CMake come KDE Plasma sta perdendo lentamente il filo ma anche altrove non si scherza: GNOME a furia di semplificare tutto si è autocannibalizzato. E dire che la filosofia UNIX è semplice: un programma che faccia un solo compito ma fatto bene che possa collaborare con altri per ottenere un risultato.

1 Mi Piace

CMake è il classico esempio della Curva di Seneca: un inizio semplice che poi col tempo, grazie al successo ottenuto, porta al suo aumento di funzionalità ( spesso inutili ) ed è questo fatto che porta alla sua caduta e questo prima o poi lo vedremo anche col kernel Linux, che lo si voglia oppure no. Vedendo quei listati, soprattutto l’ultimo, mi è venuta l’idea che il tutto poteva essere ridotto ad un:

set(parts_SRCS part.cpp plugin.cpp partmanager.cpp mainwindow.cpp event.cpp browserextension.cpp factory.cpp historyprovider.cpp browserinterface.cpp browserrun.cpp browseropenorsavequestion.cpp statusbarextension.cpp scriptableextension.cpp textextension.cpp htmlextension.cpp fileinfoextension.cpp listingextension.cpp)

create_library( kparts SOURCES ${kparts_SRCS} EXPORT_HEADERS SHARED KF6::KIOCore KF6::KIOWidgets KF6::XmlGui KF6::Services KF6::I18n KF6::JobWidgets)

Considero chiusa questa discussione.

Aggiornamento! Ho scoperto solo oggi come risolvere il problema…