LINUX.ORG.RU

Избранные сообщения be_nt_all

ZXC 0.9.0

Новости — Open Source
Группа Open Source

Состоялся выпуск 0.9.0 библиотеки и кроссплатформенной консольной утилиты ZXC (github.com), реализующих высокопроизводительное многопоточное асимметричное сжатие без потерь и оптимизированное для игровых ресурсов, прошивок и пакетов приложений. Формат разработан по принципу «один раз записать, многократно читать» (WORM).

В отличие от таких кодеков, как LZ4, ZXC жертвует скоростью сжатия ради максимальной пропускной способности при распаковке.

Декларируется скорость распаковки на 40%+ выше, чем у LZ4 на Apple Silicon, на 25%+ выше на Google Axion (ARM64) и на 5%+ выше на x86_64, при этом во всех случаях обеспечивается более высокий коэффициент сжатия.

В этом выпуске представлен API многократно используемого контекста, возможность настройки размера блоков, полное справочное руководство по API и ABI, а также несколько исправлений, связанных с безопасностью, в том числе устранение уязвимости переполнения буфера в куче, обнаруженной в ходе фаззинга модуля сжатия.

Данный релиз содержит изменения, нарушающие ABI, поэтому SOVERSION увеличена до 2.

( читать дальше... )

>>> Подробности на GitHub

 , , , ,

dataman
()

krep 2.0.0

Новости — Open Source
Группа Open Source

11 февраля состоялся выпуск 2.0.0 krep — высокопроизводительной, многопоточной, SIMD-оптимизированной консольной утилиты для поиска строк.

Основные особенности:

  • В зависимости от типа шаблонов для оптимальной производительности используются алгоритмы Бойера—Мура—Хорспула, Кнута—Морриса—Пратта или Ахо—Корасик.
  • Использование отображаемого на память файла при обработке больших файлов.
  • Автоматическое распределение поиска по доступным ядрам процессора.
  • SIMD-оптимизация с поддержкой SSE4.2, AVX2 и NEON.

( читать дальше... )

>>> Подробности на GitHub

 , krep, , ,

dataman
()

Chawan 0.3.3 — текстовый веб-браузер и пейджер

Новости — Open Source
Chawan 0.3.3 — текстовый веб-браузер и пейджер
Группа Open Source

Chawan — это текстовый веб-браузер и пейджер для Unix-подобных систем, ориентированный на реализацию современных веб-стандартов. При этом Chawan стремится быть самодостаточным, простым в использовании и расширяемым.

Он включает в себя такие функции, как CSS, встроенные изображения в терминале (включение этой функции – по желанию; нужно отредактировать конфигурацию) и JavaScript, реализуемые через небольшой независимый браузерный движок.

( читать дальше... )

>>> Chawan 0.3.3

 , , ,

greenman
()

Numbat 1.17.0

Новости — Open Source
Группа Open Source

27 декабря, после почти одиннадцати месяцев разработки, состоялся выпуск 1.17.0 высокоточного консольного научного калькулятора numbat, написанного на языке Rust и распространяемого по лицензии MIT и/или Apache 2.0.

Отличительные особенности Numbat:

  • полная поддержка физических размерностей и единиц измерения;
  • язык программирования со статической типизацией для научных вычислений;
  • автодополнение имён функций, единиц измерения и переменных;
  • поиск по истории ввода;
  • большой набор встроенных функций и констант: математические, дата и время, обработка строк и другие.
  • и многое другое.

( читать дальше... )

>>> Документация

>>> Таблица сравнения с другими научными калькуляторами и языками программирования

>>> Список изменений версии 1.17.0 на GitHub

 , , , ,

dataman
()

Dasel 3.0.0

Новости — Open Source
Группа Open Source

После полутора лет разработки (и почти полного переписывания кода) состоялся выпуск 3.0.0 (и более поздние версии из этой ветки) кроссплатформенной консольной утилиты и библиотеки Dasel.

Утилита предназначена для выполнения запросов, изменения и преобразования структурированных данных. Поддерживаются форматы CSV, HCL, JSON, TOML, XML и YAML (планируется добавление других форматов).

Проект написан на языке Go и распространяется по лицензии MIT.

( читать дальше... )

>>> Подробности на GitHub

 dasel, , , ,

dataman
()

SRELL 4.069 — библиотека ECMAScript-совместимых регулярных выражений

Новости — Разработка
Группа Разработка

10 сентября состоялся выпуск 4.069 C++ библиотеки SRELL (Std::RegEx-Like Library), реализующей ECMAScript-совместимые регулярные выражения.

Основные возможности библиотеки:

( читать дальше... )

Прошлая новость на ЛОРе

>>> Подробности на akenotsuki.com

 , , , ,

dataman
()

IDEmacs – набор конфигураций для Emacs, делающий его похожим на VSCode

Новости — Разработка
IDEmacs – набор конфигураций для Emacs, делающий его похожим на VSCode
Группа Разработка

Проект IDEmacs, основной задачей которого является подготовка пресетов настроек для emacs, делающих его похожим на популярные IDE, опубликовал первый подготовленный набор → для VSCode.

Набор включает в себя тему оформления, сочетания горячих клавиш, а также всяческие боковые меню и панели, свойственные VSCode.

( читать дальше... )

>>> Подробности

 ,

Zhbert
()

CDE 2.5.3

Новости — Open Source
Группа Open Source

25 ноября 2025 вышла версия Common Desktop Environment 2.5.3. В основном это релиз с исправлениями различных ошибок.

Common Desktop Environment — среда рабочего стола, основанная на Motif, в основном использовалась в проприетарных операционных системах UNIX, OpenVMS. CDE разработана в The Open Group совместно с Hewlett-Packard, IBM, Novell и Sun Microsystems и основана на Visual_User_Environment (VUE) от HP.

6 августа 2012 года исходный код CDE был опубликован на SourceForge.net под лицензией GNU LGPL, за последующие годы сообществом выпущен ряд новых версий.

( читать дальше... )

>>> Подробности

 ,

vbcnthfkmnth123
()

GLM 1.0.0 — математическая библиотека для C++

Новости — Разработка
GLM 1.0.0 — математическая библиотека для C++
Группа Разработка

24 января, после почти четырёхлетней паузы, состоялся выпуск 1.0.0 header-only SIMD-оптимизированной библиотеки для C++ GLM (github.com) (OpenGL Mathematics), основанной на спецификациях GLSL (pdf) (OpenGL Shading Language).

( читать дальше... )

>>> Подробности

 , , , ,

dataman
()

HTML: The Programming Language

Форум — Development

Я вам покушать принёс: HTML, the programming language

 , ,

ad0c
()

Как сделать свой QTableView

Форум — Development

В общем хочу поделится открыто классом QpTableView, который выводит ячейки в строке таблицы по шаблону в несколько рядов.

Небольшое видео для наглядности https://youtu.be/zgqkdXJhbpc?si=F0zMMr8oJgx69_47

По итогам работы понятно, что создавать свои виджеты на основе QAbstractItemView можно и нужно.

Но похоже придется из собирать свои виджеты в составе исходников Qt, что на самом деле не проблема (надо один раз попробовать только).

Надо сказать что на то, чтобы изучить исходный QTableView и QHeaderView и сделать свои варианты ушло 5 рабочих недель.

В основном время убило изменение ширины и высоты секций интерактивно мышкой (там отрисовка сразу идёт при перетаскивании края секции мышкой).

И ещё много ушло времени на модель выделения ячеек (selectionModel), что тоже оказалось не просто.

В общем, если кому интересно на гитхабе здесь: https://github.com/PavelDorofeev/How-to-create-own-QTableView-with-new-capabilities

 , ,

kkmspb
()

Makefile для сборки Love2d под Андроид/AppImage

Форум — Development

Сидел вот тут ковырялся, пересобирал и пердолился.
Подумал что стоит выложить, дабы другие пердолились поменьше.
Ниже описание, я его для себя писал и ещё ниже сам Makefile. Никаких изысков и красивостей. Собирает и ладно.
Кому надо под себя поправите, а кому не неадо, тому не надо.

- ИСПОЛЬЗОВАТЬ НА СВОЙ СТРАХ И РИСК, Я НЕ НЕСУ НИКАКОЙ ОТВЕТСТВЕННОСТИ
- ВСЁ ПРЕДОСТАВЛЯЕТСЯ КАК ЕСТЬ, ЛЮБЫЕ СОМНЕНИЯ ДОЛЖНЫ ВЕСТИ
- К ОТКАЗУ ОТ ИСПОЛЬЗОВАНИЯ, НЕ ПОНИМАЕШЬ ЧТО ЭТО, НЕ ТРОГАЙ

Love Distrib

Makefile упрощающий создание готовых Love2D сборок c включением вашего приложения позволяет

  • Собрать apk файл для Android
  • Собрать love файл для всех
  • Собрать AppImage файл для Linux x86_64

Положить Makefile в корень Love2D программы и отредактировать

  • app_name=имя программы
  • description=однострочное описание

Для Android дополнительно поправить

  • android_app_version_name=версия.приложения любая
  • android_app_version_code=число целое число

Важно android_app_version_code должно иметь значение
всегда увеличивающееся на 1 при каждой новой сборке, это
требуется для того чтобы при установке на Android apk
файла, уже установленное приложение обновлялось. Иначе
установка не произойдёт с выводом ошибки или вообще без неё.

Теперь однократно нужно развернуть зависимости для Android

  • make android-depends

Предполагается что sudo настроен, нужно установить java и
прочие мелочи, на запрос пароля ввести пароль для sudo затем
будут сгенерированны два ключа подписей и предварительно пароль

  • debug.keystore
  • release.keystore
  • .android_pass

На вопросы всякие можно просто нажимать ENTER, а когда спросят
всё ли верно Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct? написать yes и снова нажать ENTER. sdkmanager
тоже спросит, Review licenses that have not been accepted (y/N)?
согласны ли вы с условиями предоставления иструментов
для Android SDK/NDK тоже написать y и нажать ENTER
Ключи и пароль можно подменить на свои готовые
(только молю бога не совать основные ЗАТРЁТСЯ МОЖЕТ БЫТЬ!)
Пусть сгенерируется всё само. Суть в том что без подписей пакетов
Android просто молча не установит apk, просто не даст установить.

А вот теперь уже можно, редактировать свой код и пересобирать

  • make lovefile просто обычный app.love
  • make android выполнить сборку app.apk, app.abb
  • make appimage выполнить сборку app.AppImage

Первый раз apk будет собираться долго, но все последующие уже быстро
так как компиляции уже не будет, а просто будут обновляться lua файлики
из проекта. Вроде всё.


Проблемы

  • make android валится с ошибкой Решения
  • Запускать make android ещё раз и ещё раз. Бывает отпускает.
  • Грохнуть java killall java (там несколько процессов может быть) и ещё раз запустить make android
  • Удалить /.love-android-build-dir и заного выполнить
    • make android-depends подготовку зависимостей
    • make android попытку сборки apk

Нельзя отменять сборку через CTRL+C это сломает всё,
придётся вышеописанный квест пройти опять, с большой долей вероятности.
Перемудрёные механизмы системы сборки для Android дают о себе знать. :3

SRC=$(shell pwd)
app_name=appname
description=app short description
##########################################################
android_app_name=$(app_name) for Android
android_app_version_name=0.1
android_app_version_code=1
android_enableJetifier=true
android_useAndroidX=true
android_app_application_id=org.$(app_name).android
android_app_orientation=portrait
#########################################################
SECRET_PASSWORD_FOR_KEYGEN=$(HOME)/.android_pass
#########################################################
android_sign_release=true
##########################################################
DEVELOPMENT_ROOT_DIR=$(HOME)/.love-android-build-dir
DEVELOPMENT_KEYS_DIR=$(HOME)/.love-android-keys-dir
##########################################################
ANDROID_SDK_ROOT_DIR=$(DEVELOPMENT_ROOT_DIR)/ANDROID-SDK/
ANDROID_LOVE_ROOT_DIR=$(DEVELOPMENT_ROOT_DIR)/LOVE-ANDROID/
APPIMAGE_LOVE_ROOT_DIR=$(DEVELOPMENT_ROOT_DIR)/APPIMAGE/
##########################################################
PROPERTIES=$(ANDROID_LOVE_ROOT_DIR)/gradle.properties

all:
	echo "make android-depends - create depends for android apk build"
	echo "make android         - build android apk/aabb pakages"
	echo "make lovefile        - create portable app.love file"
	echo "make appimage        - create portable x86_64 executable file"

android-depends:
	$(MAKE) install-love-android;
	$(MAKE) install-system-depends;
	$(MAKE) install-android-sdk-ndk;
	$(MAKE) generate-android-debug-keys;
	$(MAKE) generate-android-release-keys;

android:
	$(MAKE) generate-android-properties;
	$(MAKE) generate-application-icons;
	$(MAKE) packeges-build;
	$(MAKE) packeges-copy;
ifeq ($(android_sign_release),true)

	$(MAKE) packeges-sign-release;
else
	$(MAKE) packeges-sign-debug;
endif
	$(MAKE) packeges-sign-verify;

lovefile:
	zip -9 -r $(app_name).love . -x Makefile -x ./*.apk -x ./*.aab -x ./*.AppImage


SRC_IMAGE_ICON="NONE"
ifneq ($(wildcard $(SRC)/icon.png),)
SRC_IMAGE_ICON=$(SRC)/icon.png
DST_IMAGE_PATH=$(ANDROID_LOVE_ROOT_DIR)/app/src/main/res/drawable
endif
ifneq ($(wildcard $(SRC)/assets/icon.png),)
SRC_IMAGE_ICON=$(SRC)/assets/icon.png
DST_IMAGE_PATH=$(ANDROID_LOVE_ROOT_DIR)/app/src/main/res/drawable
endif
ifneq ($(wildcard $(SRC)/assets/images/icon.png),)
SRC_IMAGE_ICON=$(SRC)/assets/images/icon.png
DST_IMAGE_PATH=$(ANDROID_LOVE_ROOT_DIR)/app/src/main/res/drawable
endif




appimage:lovefile
	mkdir -p $(APPIMAGE_LOVE_ROOT_DIR);
ifeq ($(wildcard $(APPIMAGE_LOVE_ROOT_DIR)/love-11.5-x86_64.AppImage),)
	wget https://github.com/love2d/love/releases/download/11.5/love-11.5-x86_64.AppImage -O $(APPIMAGE_LOVE_ROOT_DIR)/love-11.5-x86_64.AppImage
	wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage  -O $(APPIMAGE_LOVE_ROOT_DIR)/appimagetool-x86_64.AppImage
endif
	cd $(APPIMAGE_LOVE_ROOT_DIR);                       \
	-rm -rd squashfs-root;                              \
	chmod +x love-11.5-x86_64.AppImage;                 \
	chmod +x appimagetool-x86_64.AppImage;              \
	./love-11.5-x86_64.AppImage --appimage-extract;     \
	cat squashfs-root/bin/love $(SRC)/$(app_name).love > squashfs-root/bin/$(app_name); \
	rm  squashfs-root/bin/love;                         \
	chmod +x squashfs-root/bin/$(app_name);             \
	sed 's/love/$(app_name)/g' -i squashfs-root/AppRun; \
	convert $(SRC_IMAGE_ICON) -resize 256x256 squashfs-root/$(app_name).png;  \
	echo ""                                   > squashfs-root/love.desktop;   \
	echo "[Desktop Entry]"                   >> squashfs-root/love.desktop;   \
	echo "Name=$(app_name)"                  >> squashfs-root/love.desktop;   \
	echo "Comment=$(description)"            >> squashfs-root/love.desktop;   \
	echo "MimeType=application/x-love-game;" >> squashfs-root/love.desktop;   \
	echo "Exec=$(app_name) %f"               >> squashfs-root/love.desktop;   \
	echo "Type=Application"                  >> squashfs-root/love.desktop;   \
	echo "Categories=Game;"                  >> squashfs-root/love.desktop;   \
	echo "Terminal=false"                    >> squashfs-root/love.desktop;   \
	echo "Icon=/$(app_name)"                 >> squashfs-root/love.desktop;   \
	echo "NoDisplay=true"                    >> squashfs-root/love.desktop;   \
	./appimagetool-x86_64.AppImage squashfs-root $(SRC)/$(app_name).AppImage;



install-love-android:
	-`git clone --recurse-submodules https://github.com/love2d/love-android/ $(ANDROID_LOVE_ROOT_DIR)`

generate-android-properties:
	echo "" > $(PROPERTIES)
	echo "app.name=$(android_app_name)" >> $(PROPERTIES)
	echo "app.version_name=$(android_app_version_name)" >> $(PROPERTIES)
	echo "app.version_code=$(android_app_version_code)" >> $(PROPERTIES)
	echo "android.enableJetifier=$(android_enableJetifier)" >> $(PROPERTIES)
	echo "android.useAndroidX=$(android_useAndroidX)" >> $(PROPERTIES)
	echo "app.application_id=$(android_app_application_id)" >> $(PROPERTIES)
	echo "app.orientation=$(android_app_orientation)" >> $(PROPERTIES)

install-system-depends:
	sudo apt install imagemagick openjdk-17-jdk openjdk-17-jre-headless sdkmanager

install-android-sdk-ndk:
	mkdir -p $(ANDROID_SDK_ROOT_DIR);                \
	export ANDROID_SDK_ROOT=$(ANDROID_SDK_ROOT_DIR); \
	sdkmanager --install "platforms;android-33";    \
	sdkmanager --install "ndk;23.2.8568313";        \
	sdkmanager --install "platform-tools;33.0.0";   \
	sdkmanager --install "build-tools;33.0.0";      \
	sdkmanager --install "cmdline-tools;latest";    \
	sdkmanager --licenses;

generate-android-debug-keys:
	mkdir -p $(DEVELOPMENT_KEYS_DIR);
ifeq ($(wildcard $(SECRET_PASSWORD_FOR_KEYGEN)),"")
	uuidgen > $(SECRET_PASSWORD_FOR_KEYGEN)
endif
ifeq ($(wildcard $(DEVELOPMENT_KEYS_DIR)/debug.keystore),"")
	keytool -genkey  \
			-v -keystore $(DEVELOPMENT_KEYS_DIR)/debug.keystore \
			-storepass:file   $(SECRET_PASSWORD_FOR_KEYGEN)     \
			-alias debug      \
			-keyalg RSA       \
			-keysize 2048     \
			-validity 100000
endif

generate-android-release-keys:
	mkdir -p $(DEVELOPMENT_KEYS_DIR);
ifeq ($(wildcard $(SECRET_PASSWORD_FOR_KEYGEN)),"")
	uuidgen > $(SECRET_PASSWORD_FOR_KEYGEN)
endif
ifeq ("$(wildcard $(DEVELOPMENT_KEYS_DIR)/release.keystore)","")
	keytool -genkey  \
			-v -keystore $(DEVELOPMENT_KEYS_DIR)/release.keystore \
			-storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN)        \
			-alias release    \
			-keyalg RSA       \
			-keysize 2048     \
			-validity 100000
endif

generate-application-icons:
ifneq ($(SRC_IMAGE_ICON),"NONE")
	convert $(SRC_IMAGE_ICON) -resize 72x72   $(DST_IMAGE_PATH)-hdpi/love.png
	convert $(SRC_IMAGE_ICON) -resize 48x48   $(DST_IMAGE_PATH)-mdpi/love.png
	convert $(SRC_IMAGE_ICON) -resize 96x96   $(DST_IMAGE_PATH)-xhdpi/love.png
	convert $(SRC_IMAGE_ICON) -resize 144x144 $(DST_IMAGE_PATH)-xxhdpi/love.png
	convert $(SRC_IMAGE_ICON) -resize 192x192 $(DST_IMAGE_PATH)-xxxhdpi/love.png
endif

packeges-build:
	rm $(SRC)/*.apk;                                                \
	rm $(SRC)/*.aab;                                                \
	rm $(SRC)/*.love;                                               \
	rm $(SRC)/*.AppImage;                                           \
	export ANDROID_SDK_ROOT=$(ANDROID_SDK_ROOT_DIR);                \
	export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64;            \
	cp /bin/python3 $(HOME)/.local/bin/python;                      \
	rm -rd $(ANDROID_LOVE_ROOT_DIR)/app/src/embed/assets;           \
	mkdir -p $(ANDROID_LOVE_ROOT_DIR)/app/src/embed/assets;         \
	cp -r $(SRC)/* $(ANDROID_LOVE_ROOT_DIR)/app/src/embed/assets;   \
	rm $(ANDROID_LOVE_ROOT_DIR)/app/src/embed/assets/Makefile;      \
	cp $(ANDROID_LOVE_ROOT_DIR)/license.txt $(ANDROID_LOVE_ROOT_DIR)/app/src/embed/assets/love-licenses.txt;\
	cd $(ANDROID_LOVE_ROOT_DIR);                                    \
	chmod +x gradlew;                                               \
	./gradlew assembleNormalRecord;                                 \
	./gradlew assembleEmbedNoRecordRelease;                         \
	./gradlew bundleEmbedNoRecordRelease;

packeges-copy:
	cp $(ANDROID_LOVE_ROOT_DIR)/app/build/outputs/apk/embedNoRecord/release/app-embed-noRecord-release-unsigned.apk $(SRC)/;
	cp $(ANDROID_LOVE_ROOT_DIR)/app/build/outputs/bundle/embedNoRecordRelease/app-embed-noRecord-release.aab $(SRC)/;
	cp $(ANDROID_LOVE_ROOT_DIR)/app/build/outputs/apk/normalRecord/release/app-normal-record-release-unsigned.apk $(SRC)/;

packeges-sign-debug:
	jarsigner -verbose -keystore $(DEVELOPMENT_KEYS_DIR)/debug.keystore -storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN)  $(SRC)/app-embed-noRecord-release-unsigned.apk debug;
	jarsigner -verbose -keystore $(DEVELOPMENT_KEYS_DIR)/debug.keystore -storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN)  $(SRC)/app-embed-noRecord-release.aab debug;
	jarsigner -verbose -keystore $(DEVELOPMENT_KEYS_DIR)/debug.keystore -storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN)  $(SRC)/app-normal-record-release-unsigned.apk debug;

packeges-sign-release:
	jarsigner -verbose -keystore $(DEVELOPMENT_KEYS_DIR)/release.keystore -storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN) $(SRC)/app-embed-noRecord-release-unsigned.apk release;
	jarsigner -verbose -keystore $(DEVELOPMENT_KEYS_DIR)/release.keystore -storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN) $(SRC)/app-embed-noRecord-release.aab release;
	jarsigner -verbose -keystore $(DEVELOPMENT_KEYS_DIR)/release.keystore -storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN) $(SRC)/app-normal-record-release-unsigned.apk release;

packeges-sign-verify:
	jarsigner -verify $(SRC)/app-embed-noRecord-release-unsigned.apk release;
	jarsigner -verify $(SRC)/app-embed-noRecord-release.aab release;
	jarsigner -verify $(SRC)/app-normal-record-release-unsigned.apk release;
.SILENT:all

 , , , ,

LINUX-ORG-RU
()

Дёргание SOшки из Love файла - обходной путь.

Форум — Development

Ну… не совсем из love файла, но около того.
В общем так, для начала сразу скажу что делать так не надо.
Но если очень хочется то можно.

В чём суть, вы например написали программу/игру на Love2D и вам вдруг ну очень хочется добавить к ней вашу библиотеку типа libcool.so в которой что-то делается и вы эту библиотеку вызываете из вашего lua кода, только вот беда. Если вы создали love файл mycoolgame.love и положили в него libcool.so ваш код не сможет загрузить библиотеку libcool.so ибо mycoolgame.love это zip архив. Ну, не получится и всё тут. Но если очень хочется то есть черезжопный метод, мы внутри нашего love файла создадим архив с нашей библиотекой и возможно дополнительными файлами, при запуске, мы монтируем этот архив и распаковываем в каталог игры и автоматически добавляем пути до распакованных файлов в cpath и path.

Например вот наша библиотека которую мы хотим распространять вместе с нашей игрой прямо в love файле.

#include <stdio.h>

#ifdef LUAJIT
#include <luajit-2.1/lua.h>
#include <luajit-2.1/lualib.h>
#include <luajit-2.1/lauxlib.h>
#else
#include <lua5.1/lua.h>
#include <lua5.1/lualib.h>
#include <lua5.1/lauxlib.h>
#endif

int example_c_function(lua_State* L)
{
    int a = lua_tointeger(L,1);
    a+=a;
    lua_pushnumber(L,a);
    lua_pushstring(L,"hello from c");
    return 2;
}

int luaopen_lib(lua_State* L)
{
    static const struct luaL_Reg nativeFuncLib [] =
    {
         {"example_c_function", example_c_function},
         {NULL, NULL}
    };
    luaL_register(L, "lib", nativeFuncLib);
    return 1;
}

Соберём её

gcc -DLUAJIT=1 main.c `pkg-config --libs --cflags luajit` --shared -o lib.so

Аахивируем её

mkdir libs
cp lib.so libs/lib.so
zip -r9 libs.zip libs

А вот собственно сама суть и сам механизм распаковки и импорта путей.

function autoreq(zip)
    if not zip then
       print("[autoreq] failed get zip archive for unpack, argument is 'nil'")
       return false;
    end
    local function unpack(dirname,mount_point,base)
        local items = love.filesystem.getDirectoryItems(mount_point)
        if items then
            for _,val in pairs(items) do
                local path = dirname..'/'..val;
                local path_mount = mount_point..'/'..val;
                if love.filesystem.getInfo(path_mount,'directory') then
                   package.path  = package.path  ..';'..base..'/'..path..'/?.lua;';
                   package.cpath = package.cpath ..';'..base..'/'..path..'/?.so;';
                   love.filesystem.createDirectory(path)
                   unpack(path,path_mount,base)
                 elseif love.filesystem.getInfo(path_mount,'file')then
                        print("[autoreq] unpack -> "..val)
                        love.filesystem.write(path,love.filesystem.read(path_mount));
                else
                   print("[autoreq] ok -> "..val)
                end
            end
        end
    end
    local base = love.filesystem.getSaveDirectory();
    print("[autoreq] check depends in '"..base.."'")
    local dirname = "libs"
    local mount_point = "_autoreq_libs_"
    local dir = love.filesystem.createDirectory(dirname)
    local dir = love.filesystem.createDirectory(mount_point)
    data, err = love.filesystem.newFileData(zip)
    if not data then
       print("[autoreq] failed get zip archive for unpack -> '"..zip.."'")
       return false;
    end
    local success,msg = love.filesystem.mount(data,mount_point)
    unpack(dirname,mount_point,base);
    love.filesystem.setRequirePath ( package.path  );
    love.filesystem.setCRequirePath( package.cpath );
    local success,msg = love.filesystem.unmount(data);
    love.filesystem.remove(mount_point);
    print("[autoreq] all done okey")
    return true;
end

autoreq("libs.zip"); -- вызываем распаковку архива с библиотекой и импорта путей
require('lib'); -- вызываем нашу библиотеку

function love.load()
print(lib.example_c_function()) -- вызываем функцию из неё
end

Создаём love файл с нашей программой и её зависимостями

zip -r9 coolgame.love  main.lua libs.zip

Запускаем

love coolgame.love 
[autoreq] check depends in '/home/dron/.local/share/love/coolgame'
[autoreq] unpack -> lib.so
[autoreq] all done okey
0	hello from c

Всё работает, наша soшка может распространяться в обычном love файле. Будет создана такая структура каталогов. В автоматическом каталоге игры.

dron@gnu:~/.local/share/love$ tree 
.
└── coolgame
    └── libs
        └── libs
            └── lib.so

4 directories, 1 file
dron@gnu:~/.local/share/love$ 

Ну вот собственно и всё. На деле можно в lib.zip насовать произвольные файлы, с произвольными каталогами, например выполнить сборку openssl/luasec/luasocket

luarocks --tree `pwd`/luasec install openssl
luarocks --tree `pwd`/luasec install luasec
zip -9 -r libs.zip luasec -x 'luasec/lib/luarocks*'

И получившийся libs.zip просто добавить в свой love файл тем самым получив всё что нужно для работы с https в вашей программе. Я так и сделал в своей проверялке новостей например. Работать будет всё абсолютно прозрачно, ничего в коде учитывать и менять не надо. В том и прелесть. Ну разве что один раз вызвать autoreq('libs.zip') и всё.

Да, теряется смысл в переносимости love файлов ведь теперь там платформоспецифичные библиотеки таскаются. Но это просто вариант таскания с собой soшки если уж надо, но без всяких appimage упаковок и прочего, по иному дёрнуть внешнюю библиотеку из своей поставки из архива, просто никак нельзя. Но порой вот надо бывает. Я голову ломал довольно долго если честно пока не допёрло. Может кому пригодится.

Вроде всё. Досвиданья.

 , , , ,

LINUX-ORG-RU
()

CadZinho 0.3

Новости — Open Source
CadZinho 0.3
Группа Open Source

А вы не были в Бразилии, где в лесах не очень много диких САПР? Они к-а-а-к нарисуют на плоскости (пока)!

Но это не важно, ведь дон Ezequiel Rabelo de Aguiar приручил CadZinho с помощью языка C, лёгкой IMGUI-библиотеки Nuklear, SDL 2.0 , OpenGL, Lua и лицензии MIT.


Список изменений:

  • улучшен интерфейс;
  • добавлена возможность локализации интерфейса;
  • портирование на Emscripten.

Ссылки:

>>> Подробности

 , , , ,

dataman
()

Интерпретатор GNU APL под Termux (ARM)

Форум — Development

Всем привет. Простите меня за эту относительно мусорную тему. Интересно вот, есть где-нибудь скомпиленый бинарник интерпретатора языка APL под архитектуру ARM? А то под Termux ./configure и make никак никогда не пашут.

 , , , ,

projectorist
()

OpenToonz 1.7.*

Новости — Open Source
Группа Open Source

После более года разработки состоялись выпуски 1.7 и 1.7.1 программы создания двумерных анимаций OpenToonz.

Краткий список изменений:

( читать дальше... )

>>> Подробности

 , , ,

dataman
()

fmt 10.0.0

Новости — Open Source
Группа Open Source

После восьми месяцев разработки состоялся выпуск 10.0.0 библиотеки форматирования данных fmt (github.com) — быстрой и безопасной альтернативы stdio и iostreams для C++.

#include <fmt/color.h>

int main() {
    fmt::print(fmt::emphasis::bold | fg(fmt::color::red),
           "Elapsed time: {0:.2f} seconds", 1.23);
}

Список изменений:

( читать дальше... )

>>> Подробности

 , ,

dataman
()

FTXUI 4.1.1 - библиотека в функциональном стиле для создания консольных приложений

Новости — Open Source
FTXUI 4.1.1 - библиотека в функциональном стиле для создания консольных приложений
Группа Open Source

После более трёх месяцев разработки состоялся выпуск 4.1.1 кроссплатформенной библиотеки для C++ (стандарт C++17) FTXUI (Functional Terminal (X) User Interface), предназначенной для создания приложений с текстовым интерфейсом и распространяемой по лицензии MIT.

( читать дальше... )

>>> Подробности

 , , , ,

dataman
()

FINAL CUT 0.9.0 - библиотека для создания консольных приложений

Новости — Open Source
Группа Open Source

22 мая, после более полутора лет разработки, состоялся выпуск 0.9.0 C++ библиотеки FINAL CUT, предназначенной для создания приложений с текстовым интерфейсом, не зависящей от библиотек ncurses, termbox или подобных, и распространяемой по лицензии LGPL-3.0.

( читать дальше... )

>>> Подробности

 , , , ,

dataman
()

После года молчания, новая версия редактора TEA (50.1.0)

Новости — Open Source
Группа Open Source

Несмотря на добавление одной только циферки к номеру версии, изменений в популярном текстовом редакторе много. Некоторые незримы – это исправления для старых и новых Clang’ов, а также вывод ряда зависимостей в разряд отключенных по умолчанию (aspell, qml, libpoppler, djvuapi) при сборке с meson и cmake. Также, в ходе безуспешной возни разработчика с манускриптом Войнича, TEA обзавелся новыми функциями сортировки, фильтрации и анализа текста. Например, можно фильтровать строки по образцу с заданными повторяющимися символами, что годно не токмо для упомянутого манускрипта, но и при расшифровке прочих каверзных текстов, язык коих заранее неведом.

>>> Подробности

 , ,

roxton
()