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.