Od 13. do 15. října proběhne v Praze OpenSSL Conference 2026. Na YouTube lze zhlédnout videozáznamy přednášek z loňského roku.
Eben Upton oznámil další zdražení jednodeskových počítačů Raspberry Pi. Tentokrát 2 GB varianty o 12,50 dolarů. Nově 2 GB Raspberry Pi 4 stojí 67,50 dolarů a 2 GB Raspberry Pi 5 stojí 77,50 dolarů.
OpenMandriva ROME, tj. průběžně aktualizovaná (rolling) edice linuxové distribuce OpenMandriva, byla vydána ve verzi 26.09. Vedle Flatpaku také s podporou Snapu.
Edison Design Group po více než 30 letech zveřejnil zdrojový kód svého EDG C/C++ front-endu. Ten proslul širokou podporou standardů C++ a kompatibilitou s dialekty kompilátorů od Microsoftu, GNU, Clangu, Sunu a dokonce i s prehistorickým cfrontem. EDG byl použit například v kompilátoru Intel C++ Classic, kompilátoru NVCC od firmy NVIDIA pro platformu CUDA nebo v našeptávači kódu IntelliSense v produktech společnosti Microsoft. Projekt nyní spravuje organizace The C++ Alliance a kód je dostupný pod licencí Apache 2.0, doplněnou o výjimky projektu LLVM.
Pocket Tank je malé kapesní virtuální akvárium postavené na vývojové desce ESP32-S3-Touch-AMOLED-1.8. Na dvoujádrovém mikrokontroléru ESP32-S3 s 8 MB PSRAM a 16 MB flash paměti běží jak simulace akvária, tak i malý jazykový model určující chování rybiček. Lokální model o velikosti 7,56 MB se 14 miliony parametrů vznikl destilací modelu Gemma 4 26B, tedy učitele s 26 miliardami parametrů. Kromě firmwaru pro skutečný modul s AMOLED
… více »Open-source nástroj Jevstiller vytváří (destiluje) malý lokální model, který se průběžně učí z odpovědí komerční služby Jev. Běžné dotazy vyřizuje přímo na vlastním hardware, čímž může řádově zkrátit čas odezvy a snížit provozní náklady díky menšímu využívání zpoplatněného API. Nejisté požadavky Jevstiller posílá do Jevu, rovněž průběžně kontroluje náhodná dvě procenta dotazů Jevem. Pokud se lokální model začne s Jevem rozcházet,
… více »Konference LinuxDays 2026 proběhne již tento víkend 3. a 4. října v Praze v areálu ČVUT v Dejvicích na FIT. Konference LinuxDays 2026 znamená desítky přednášek a workshopů, zástup zajímavých osobností, místo pro setkání, spoustu nových nápadů a informací a stánky řady různých projektů: Fedora, openSUSE, vpsFree.cz, Mozilla, MacGyver - bastlíři SH, OpenAlt a mnoho dalších. Vstup je volný.
Microsoft oznámil, že WSL kontejnery (WSLC) aneb linuxové kontejnery ve Windows Subsystem for Linux (WSL) jsou již obecně dostupné. Současně popsal jejich architekturu.
openSUSE Leap 16.1 vstoupil do RC fáze. Nově lze instalovat jako standardní systém (Standard) nebo jako neměnný systém s atomickými aktualizacemi (Immutable). Samostatná neměnná distribuce openSUSE Leap Micro končí.
Byl vydán Mozilla Firefox 157.0. S nejvýraznější vizuální proměnou za poslední roky. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 157 bude brzy k dispozici také na Flathubu a Snapcraftu.
Dneska jsem si trochu pohrál s configure skriptem, a chtěl jsem, aby z toho vzešlo něco, co se dá použít pro další projekty. Snažil jsem se trochu napodobit cmake:
#!/bin/sh
#
# configure script for Toolkit library
# Toolkit is distributed under the terms od BSD License
# Copyright (C) 2006 Jaroslav Šmíd <jardasmid@seznam.cz>
#
#
# Set up your project here
#
build_script()
{
echo "Running configure script for Toolkit ..."
PROJECT Toolkit
toolkit_sources=(
Toolkit/Alignment.cpp
Toolkit/Application.cpp
Toolkit/Archiver.cpp
Toolkit/Box.cpp
Toolkit/Button.cpp
Toolkit/ButtonBox.cpp
Toolkit/CheckButton.cpp
Toolkit/Container.cpp
Toolkit/Dialog.cpp
Toolkit/Entry.cpp
Toolkit/EventBox.cpp
Toolkit/File.cpp
Toolkit/FileUtils.cpp
Toolkit/Frame.cpp
Toolkit/HBox.cpp
Toolkit/HPaned.cpp
Toolkit/Image.cpp
Toolkit/IniFile.cpp
Toolkit/InputBox.cpp
Toolkit/Label.cpp
Toolkit/ListView.cpp
Toolkit/Menu.cpp
Toolkit/Notebook.cpp
Toolkit/Paned.cpp
Toolkit/ProgressBar.cpp
Toolkit/ScrolledWindow.cpp
Toolkit/Separator.cpp
Toolkit/String.cpp
Toolkit/Table.cpp
Toolkit/Timer.cpp
Toolkit/ToggleButton.cpp
Toolkit/VBox.cpp
Toolkit/Viewport.cpp
Toolkit/VPaned.cpp
Toolkit/Widget.cpp
Toolkit/Window.cpp
)
toolkit_headers=(
Toolkit/Alignment.h
Toolkit/Application.h
Toolkit/Archiver.h
Toolkit/Array.h
Toolkit/Bool.h
Toolkit/Box.h
Toolkit/Button.h
Toolkit/ButtonBox.h
Toolkit/Callback.h
Toolkit/CheckButton.h
Toolkit/Config.h
Toolkit/Container.h
Toolkit/Dialog.h
Toolkit/Entry.h
Toolkit/Enums.h
Toolkit/EventBox.h
Toolkit/File.h
Toolkit/FileUtils.h
Toolkit/Frame.h
Toolkit/HBox.h
Toolkit/HPaned.h
Toolkit/Image.h
Toolkit/IniFile.h
Toolkit/InputBox.h
Toolkit/Label.h
Toolkit/ListView.h
Toolkit/Menu.h
Toolkit/Notebook.h
Toolkit/Paned.h
Toolkit/ProgressBar.h
Toolkit/ScrolledWindow.h
Toolkit/Separator.h
Toolkit/String.h
Toolkit/StringArray.h
Toolkit/Table.h
Toolkit/Timer.h
Toolkit/ToggleButton.h
Toolkit/Toolkit.h
Toolkit/VBox.h
Toolkit/Viewport.h
Toolkit/VPaned.h
Toolkit/Widget.h
Toolkit/Window.h
)
ttranslator_sources=(
ttranslator/mainwindow.cpp
ttranslator/ttranslator.cpp
)
#
# Let's check depencies
#
echo "Checking depencies ..."
echo -en "\tpkg-config (required) ... "
which pkg-config >/dev/null 2>&1
if [ $? -eq 0 ]
then
echo "found."
else
echo "not found."
echo "Depencies test failed."
FAIL
fi
echo -en "\tgtk+-2.0 (required) ... "
pkg-config --exists gtk+-2.0
if [ $? -eq 0 ]
then
GTK2_CFLAGS="`pkg-config gtk+-2.0 --cflags 2>/dev/null`"
GTK2_LIBS="`pkg-config gtk+-2.0 --libs 2>/dev/null`"
echo "found."
else
echo "not found."
echo "Depencies test failed."
FAIL
fi
echo "Depencies test OK."
toolkit_includes="$GTK2_CFLAGS -I."
toolkit_libs="$GTK2_LIBS"
toolkit_defines="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE"
#
# Let's generate Toolkit/Config.h
#
echo -n "Generating Toolkit/Config.h ... "
[ -f Toolkit/Config.h ] && rm -f Toolkit/Config.h
if [ -f Toolkit/Config.h ]
then
echo "failed."
echo "ERROR: File Toolkit/Config.h exists in filesystem and could not be removed."
FAIL
fi
cat <Toolkit/Config_prefix.h >>Toolkit/Config.h
echo "#define TOOLKIT_INSTALL_PREFIX \"$INSTALL_PREFIX\"" >>Toolkit/Config.h
cat <Toolkit/Config_sufix.h >>Toolkit/Config.h
if [ ! -f Toolkit/Config.h ]
then
echo "failed."
echo "ERROR: File Toolkit/Config.h could not be created."
FAIL
fi
echo "done."
#
# Let's generate lib/pkgconfig/Toolkit.pc
# pkg-config package file
#
echo -n "Generating lib/pkgconfig/Toolkit.pc ... "
[ -f lib/pkgconfig/Toolkit.pc ] && rm -f lib/pkgconfig/Toolkit.pc
if [ -f lib/pkgconfig/Toolkit.pc ]
then
echo "failed."
echo "ERROR: File lib/pkgconfig/Toolkit.pc exists in filesystem and could not be removed."
FAIL
fi
cat <lib/pkgconfig/Toolkit.pc.template \
| sed "s|__INSTALL_PREFIX__|${INSTALL_PREFIX}|g" \
| sed "s|__DEFINES__|${toolkit_defines}|g" \
>>lib/pkgconfig/Toolkit.pc
if [ ! -f lib/pkgconfig/Toolkit.pc ]
then
echo "failed."
echo "ERROR: File lib/pkgconfig/Toolkit.pc could not be created."
FAIL
fi
echo "done."
#
# Add target
#
ADD_LIBRARY toolkit \
FILES ${toolkit_sources[@]} \
DEFINES ${toolkit_defines} \
INCLUDES ${toolkit_includes} \
LIBS ${toolkit_libs}
for I in "${toolkit_headers[@]}"
do
INSTALL_FILE "$I" "/include/Toolkit"
done
INSTALL_FILE "lib/pkgconfig/Toolkit.pc" "/lib/pkgconfig"
ttranslator_includes="${toolkit_includes}"
ttranslator_libs="toolkit ${toolkit_libs}"
ttranslator_defines="${toolkit_defines}"
ADD_EXECUTABLE ttranslator \
FILES ${ttranslator_sources[@]} \
DEFINES ${ttranslator_defines} \
INCLUDES ${ttranslator_includes} \
LIBS ${ttranslator_libs}
}
#
# Internal functions
# Do not modify
#
#
# Usage:
# FAIL
#
FAIL()
{
echo "ERROR: Configure sctipt failed."
exit 1
}
#
# Usage:
# PROJECT project_name [C] [CXX]
#
PROJECT()
{
[ -n "$1" ] && PROJECT_NAME="$1"
}
#
# Usage:
# ADD_EXECUTABLE executable_name FILES file_list INCLUDES include_list LIBS libs_list DEFINES defines_list
#
ADD_EXECUTABLE()
{
if [ -z "$1" -o -z "$2" ]
then
echo "ERROR: add_executable - bad usage"
FAIL
else
TARGETS_ORDER[${TARGETS_COUNT}]="EXE"
let TARGETS_COUNT=TARGETS_COUNT+1
EXECUTABLE_FILES[${EXECUTABLE_FILES_COUNT}]="$1"
shift
ADDING=
while [ -n "$1" ]
do
case "$1" in
FILES)
ADDING="FILES"
;;
DEFINES)
ADDING="DEFINES"
;;
LIBS)
ADDING="LIBS"
;;
INCLUDES)
ADDING="INCLUDES"
;;
*)
[ -z "$ADDING" ] && ADDING="FILES"
case "$ADDING" in
FILES)
EXECUTABLE_FILES_SOURCES[${EXECUTABLE_FILES_COUNT}]="${EXECUTABLE_FILES_SOURCES[${EXECUTABLE_FILES_COUNT}]} $1"
;;
DEFINES)
EXECUTABLE_FILES_DEFINES[${EXECUTABLE_FILES_COUNT}]="${EXECUTABLE_FILES_DEFINES[${EXECUTABLE_FILES_COUNT}]} $1"
;;
LIBS)
EXECUTABLE_FILES_LIBS[${EXECUTABLE_FILES_COUNT}]="${EXECUTABLE_FILES_LIBS[${EXECUTABLE_FILES_COUNT}]} $1"
;;
INCLUDES)
EXECUTABLE_FILES_INCLUDES[${EXECUTABLE_FILES_COUNT}]="${EXECUTABLE_FILES_INCLUDES[${EXECUTABLE_FILES_COUNT}]} $1"
;;
*)
;;
esac
;;
esac
shift
done
unset ADDING
FILES_TO_INSTALL[${FILES_TO_INSTALL_COUNT}]="output/${EXECUTABLE_FILES[${EXECUTABLE_FILES_COUNT}]}"
FILES_TO_INSTALL_TARGETS[${FILES_TO_INSTALL_COUNT}]="/bin"
let FILES_TO_INSTALL_COUNT=FILES_TO_INSTALL_COUNT+1
let EXECUTABLE_FILES_COUNT=EXECUTABLE_FILES_COUNT+1
fi
}
#
# Usage:
# ADD_LIBRARY library_name FILES file_list INCLUDES include_list LIBS libs_list DEFINES defines_list
#
ADD_LIBRARY()
{
if [ -z "$1" -o -z "$2" ]
then
echo "ERROR: ADD_LIBRARY - bad usage"
FAIL
else
TARGETS_ORDER[${TARGETS_COUNT}]="LIB"
let TARGETS_COUNT=TARGETS_COUNT+1
LIBRARY_FILES[${LIBRARY_FILES_COUNT}]="$1"
shift
ADDING=
while [ -n "$1" ]
do
case "$1" in
FILES)
ADDING="FILES"
;;
DEFINES)
ADDING="DEFINES"
;;
LIBS)
ADDING="LIBS"
;;
INCLUDES)
ADDING="INCLUDES"
;;
*)
[ -z "$ADDING" ] && ADDING="FILES"
case "$ADDING" in
FILES)
LIBRARY_FILES_SOURCES[${LIBRARY_FILES_COUNT}]="${LIBRARY_FILES_SOURCES[${LIBRARY_FILES_COUNT}]} $1"
;;
DEFINES)
LIBRARY_FILES_DEFINES[${LIBRARY_FILES_COUNT}]="${LIBRARY_FILES_DEFINES[${LIBRARY_FILES_COUNT}]} $1"
;;
LIBS)
LIBRARY_FILES_LIBS[${LIBRARY_FILES_COUNT}]="${LIBRARY_FILES_LIBS[${LIBRARY_FILES_COUNT}]} $1"
;;
INCLUDES)
LIBRARY_FILES_INCLUDES[${LIBRARY_FILES_COUNT}]="${LIBRARY_FILES_INCLUDES[${LIBRARY_FILES_COUNT}]} $1"
;;
*)
;;
esac
;;
esac
shift
done
FILES_TO_INSTALL[${FILES_TO_INSTALL_COUNT}]="output/lib${LIBRARY_FILES[${LIBRARY_FILES_COUNT}]}.so"
FILES_TO_INSTALL_TARGETS[${FILES_TO_INSTALL_COUNT}]="/lib"
let FILES_TO_INSTALL_COUNT=FILES_TO_INSTALL_COUNT+1
let LIBRARY_FILES_COUNT=LIBRARY_FILES_COUNT+1
fi
}
#
# Usage:
# INSTALL_FILE <FILE> <DEST_DIR>
#
INSTALL_FILE()
{
if [ -z "$1" -o -z "$2" ]
then
echo "ERROR: INSTALL_FILES - bad usage"
FAIL
else
FILES_TO_INSTALL[${FILES_TO_INSTALL_COUNT}]="$1"
FILES_TO_INSTALL_TARGETS[${FILES_TO_INSTALL_COUNT}]="$2"
let FILES_TO_INSTALL_COUNT=FILES_TO_INSTALL_COUNT+1
fi
}
#
# Internal code
# Do not modify
#
PROJECT_NAME=
TARGETS_ORDER=()
TARGETS_COUNT=0
EXECUTABLE_FILES_COUNT=0
EXECUTABLE_FILES=()
EXECUTABLE_FILES_SOURCES=()
EXECUTABLE_FILES_DEFINES=()
EXECUTABLE_FILES_LIBS=()
EXECUTABLE_FILES_INCLUDES=()
LIBRARY_FILES_COUNT=0
LIBRARY_FILES=()
LIBRARY_FILES_SOURCES=()
LIBRARY_FILES_DEFINES=()
LIBRARY_FILES_LIBS=()
LIBRARY_FILES_INCLUDES=()
FILES_TO_INSTALL_COUNT=0
FILES_TO_INSTALL=()
FILES_TO_INSTALL_TARGETS=()
INSTALL_PREFIX="/usr/local"
#
# Parse command line
#
for I in $@
do
case $I in
--prefix=*)
M_PREFIX=`cut -d= -f2 <<<$I`
[ -n "$M_PREFIX" ] && INSTALL_PREFIX="$M_PREFIX"
;;
esac
done
#
# Run build script
#
build_script
#
# Have mr programmer set project name?
#
if [ -z "${PROJECT_NAME}" ]
then
echo "ERROR: Seems mr programmer forgot to set project name."
echo "ERROR: Tell him, he can do that by calling PROJECT() function."
FAIL
fi
#
# Have mr programmer added some targets?
#
if [ $TARGETS_COUNT -eq 0 ]
then
echo "ERROR: Seems mr programmer forgot to add some targets."
echo "ERROR: Tell him, he can do that by calling ADD_LIBRARY() and ADD_EXECUTABLE functions."
FAIL
fi
#
# Generate install and uninstall script
#
echo -n "Generating install and uninstall scripts ... "
[ -f install.sh ] && rm -f install.sh
if [ -f install.sh ]
then
echo "failed."
echo "ERROR: File install.sh exists in filesystem and could not be removed."
FAIL
fi
[ -f uninstall.sh ] && rm -f uninstall.sh
if [ -f uninstall.sh ]
then
echo "failed."
echo "ERROR: File install.sh exists in filesystem and could not be removed."
FAIL
fi
#
# Install script
#
cat <<_EOF >>install.sh
#!/bin/sh
INSTALL_PREFIX="${INSTALL_PREFIX}"
[ -n "\${DESTDIR}" ] && INSTALL_PREFIX="\${DESTDIR}"
FAIL()
{
echo "ERROR: Install script failed."
exit 1
}
FILES_TO_INSTALL=(
_EOF
for I in ${FILES_TO_INSTALL[@]}
do
echo -e "\t$I" >>install.sh
done
cat <<_EOF >>install.sh
)
_EOF
echo "FILES_TO_INSTALL_TARGETS=(" >>install.sh
for I in ${FILES_TO_INSTALL_TARGETS[@]}
do
echo -e "\t$I" >>install.sh
done
cat <<_EOF >>install.sh
)
echo "Installing ${PROJECT_NAME} ..."
C_INDEX=0
for I in \${FILES_TO_INSTALL[@]}
do
SOURCE="\$I"
if [ ! -f "\${SOURCE}" ]
then
echo "ERROR: File \${SOURCE} doesn't exists in filesystem."
echo "ERROR: Maybe you forgot to run make."
FAIL
fi
TARGET_D="\${INSTALL_PREFIX}\${FILES_TO_INSTALL_TARGETS[\${C_INDEX}]}"
TARGET="\${TARGET_D}/\`basename \${SOURCE}\`"
echo "\${TARGET}"
[ -d "\${TARGET_D}" ] || mkdir -p "\${TARGET_D}" >/dev/null 2>&1
if [ ! -d "\${TARGET_D}" ]
then
echo "ERROR: Target directory for \`basename \${SOURCE}\` could not be created."
FAIL
fi
[ -f "\${TARGET}" ] && rm -f "\${TARGET}" >/dev/null 2>&1
if [ -f "\${TARGET}" ]
then
echo "ERROR: File \${TARGET} exists in filesystem and could not be removed."
FAIL
fi
cp "\${SOURCE}" "\${TARGET}" >/dev/null 2>&1
if [ ! -f "\${TARGET}" ]
then
echo "ERROR: File \${TARGET} could not be created."
FAIL
fi
let C_INDEX=C_INDEX+1
done
echo "Instalation succesfull."
_EOF
#
# Uninstall script
#
cat <<_EOF >>uninstall.sh
#!/bin/sh
INSTALL_PREFIX="${INSTALL_PREFIX}"
[ -n "\${DESTDIR}" ] && INSTALL_PREFIX="\${DESTDIR}"
FAIL()
{
echo "ERROR: Uninstall script failed."
exit 1
}
FILES_TO_INSTALL=(
_EOF
for I in ${FILES_TO_INSTALL[@]}
do
echo -e "\t$I" >>uninstall.sh
done
cat <<_EOF >>uninstall.sh
)
_EOF
echo "FILES_TO_INSTALL_TARGETS=(" >>uninstall.sh
for I in ${FILES_TO_INSTALL_TARGETS[@]}
do
echo -e "\t$I" >>uninstall.sh
done
cat <<_EOF >>uninstall.sh
)
echo "Uninstalling ${PROJECT_NAME} ..."
C_INDEX=0
for I in \${FILES_TO_INSTALL[@]}
do
SOURCE="\$I"
TARGET_D="\${INSTALL_PREFIX}\${FILES_TO_INSTALL_TARGETS[\${C_INDEX}]}"
TARGET="\${TARGET_D}/\`basename \${SOURCE}\`"
echo "\${TARGET}"
[ -f "\${TARGET}" ] && rm -f "\${TARGET}" >/dev/null 2>&1
if [ -f "\${TARGET}" ]
then
echo "ERROR: File \${TARGET} could not be removed."
FAIL
fi
let C_INDEX=C_INDEX+1
done
echo "Uninstalation succesfull."
_EOF
chmod +x install.sh
chmod +x uninstall.sh
echo "done."
#
# Generates Makefile
#
echo -n "Generating Makefile ... "
[ -f Makefile ] && rm -f Makefile >/dev/null 2>&1
if [ -f Makefile ]
then
echo "failed."
echo "ERROR: Makefile exists in filesystem and could not be removed."
FAIL
fi
CURRENT_EXE_TARGET=0
CURRENT_LIB_TARGET=0
TARGETS_OUTPUT_FILES=()
CUR_TARGET_NUM=0
for I in ${TARGETS_ORDER[@]}
do
case $I in
EXE)
CURRENT_BUILD_TARGET_OUTPUT="output/${EXECUTABLE_FILES[${CURRENT_EXE_TARGET}]}"
let CURRENT_EXE_TARGET=CURRENT_EXE_TARGET+1
;;
LIB)
CURRENT_BUILD_TARGET_OUTPUT="output/lib${LIBRARY_FILES[${CURRENT_LIB_TARGET}]}.so"
let CURRENT_LIB_TARGET=CURRENT_LIB_TARGET+1
;;
*)
continue
;;
esac
TARGETS_OUTPUT_FILES[${CUR_TARGET_NUM}]="${CURRENT_BUILD_TARGET_OUTPUT}"
let CUR_TARGET_NUM=CUR_TARGET_NUM+1
done
# Makefile section "all:"
cat <<_EOF >>Makefile
all: ${TARGETS_OUTPUT_FILES[@]}
_EOF
#
CURRENT_EXE_TARGET=0
CURRENT_LIB_TARGET=0
CLEAN_OUTPUTS=
CLEAN_OBJS=
for I in ${TARGETS_ORDER[@]}
do
case $I in
EXE)
CURRENT_BUILD_TARGET="EXE"
CURRENT_BUILD_TARGET_NAME=${EXECUTABLE_FILES[${CURRENT_EXE_TARGET}]}
CURRENT_BUILD_TARGET_SOURCES=${EXECUTABLE_FILES_SOURCES[${CURRENT_EXE_TARGET}]}
CURRENT_BUILD_TARGET_DEFINES=${EXECUTABLE_FILES_DEFINES[${CURRENT_EXE_TARGET}]}
CURRENT_BUILD_TARGET_INCLUDES=${EXECUTABLE_FILES_INCLUDES[${CURRENT_EXE_TARGET}]}
CURRENT_BUILD_TARGET_LIBS=${EXECUTABLE_FILES_LIBS[${CURRENT_EXE_TARGET}]}
CURRENT_BUILD_TARGET_OUTPUT="output/${CURRENT_BUILD_TARGET_NAME}"
let CURRENT_EXE_TARGET=CURRENT_EXE_TARGET+1
;;
LIB)
CURRENT_BUILD_TARGET="LIB"
CURRENT_BUILD_TARGET_NAME=${LIBRARY_FILES[${CURRENT_LIB_TARGET}]}
CURRENT_BUILD_TARGET_SOURCES=${LIBRARY_FILES_SOURCES[${CURRENT_LIB_TARGET}]}
CURRENT_BUILD_TARGET_DEFINES=${LIBRARY_FILES_DEFINES[${CURRENT_EXE_TARGET}]}
CURRENT_BUILD_TARGET_INCLUDES=${LIBRARY_FILES_INCLUDES[${CURRENT_EXE_TARGET}]}
CURRENT_BUILD_TARGET_LIBS=${LIBRARY_FILES_LIBS[${CURRENT_EXE_TARGET}]}
CURRENT_BUILD_TARGET_OUTPUT="output/lib${CURRENT_BUILD_TARGET_NAME}.so"
let CURRENT_LIB_TARGET=CURRENT_LIB_TARGET+1
;;
*)
continue
;;
esac
CLEAN_OUTPUTS="${CLEAN_OUTPUTS} ${CURRENT_BUILD_TARGET_OUTPUT}"
OUTPUT_OBJS=()
CUR_OBJ_NUM=0
for SOURCE_FILE in ${CURRENT_BUILD_TARGET_SOURCES}
do
SOURCE_FILE_NAME="`basename ${SOURCE_FILE}`"
SOURCE_FILE_NAME="`cut -d. -f1 <<<${SOURCE_FILE_NAME}`"
SOURCE_FILE_DIR="`dirname ${SOURCE_FILE}`"
OUTPUT_OBJ_DIR="output/objs/${SOURCE_FILE_DIR}"
[ -d "${OUTPUT_OBJ_DIR}" ] || mkdir -p "${OUTPUT_OBJ_DIR}" >/dev/null 2>&1
if [ ! -d "${OUTPUT_OBJ_DIR}" ]
then
echo "failed."
echo "ERROR: Directory ${OUTPUT_OBJ_DIR} for object files could not be created."
FAIL
fi
OUTPUT_OBJS[${CUR_OBJ_NUM}]="${OUTPUT_OBJ_DIR}/${SOURCE_FILE_NAME}.o"
let CUR_OBJ_NUM=CUR_OBJ_NUM+1
done
unset CUR_OBJ_NUM
unset SOURCE_FILE_NAME
unset SOURCE_FILE_DIR
unset OUTPUT_OBJ_DIR
CLEAN_OBJS="${CLEAN_OBJS} ${OUTPUT_OBJS[@]}"
DEP_LIBS=
CURRENT_BUILD_TARGET_LIBS_NEW=
for LIB in ${CURRENT_BUILD_TARGET_LIBS}
do
if [ "`cut -dl -f1 <<<$LIB`" != "-" -a "`cut -dL -f1 <<<$LIB`" != "-" ]
then
for LIB_TARGET in ${LIBRARY_FILES[@]}
do
if [ "$LIB_TARGET" = "$LIB" ]
then
DEP_LIBS="${DEP_LIBS} output/lib${LIB}.so"
CURRENT_BUILD_TARGET_LIBS_NEW="${CURRENT_BUILD_TARGET_LIBS_NEW} -L./output -l${LIB}"
break
fi
done
unset LIB_TARGET
else
CURRENT_BUILD_TARGET_LIBS_NEW="${CURRENT_BUILD_TARGET_LIBS_NEW} ${LIB}"
fi
done
CURRENT_BUILD_TARGET_LIBS=${CURRENT_BUILD_TARGET_LIBS_NEW}
unset CURRENT_BUILD_TARGET_LIBS_NEW
cat <<_EOF >>Makefile
${CURRENT_BUILD_TARGET_OUTPUT}: ${DEP_LIBS} ${OUTPUT_OBJS[@]}
_EOF
unset DEP_LIBS
if [ "${CURRENT_BUILD_TARGET}" = "LIB" ]
then
cat >>Makefile <<_EOF
g++ -g -shared -W1,-soname,lib${CURRENT_BUILD_TARGET_NAME}.so ${CURRENT_BUILD_TARGET_DEFINES} ${CURRENT_BUILD_TARGET_LIBS} ${OUTPUT_OBJS[@]} -o ${CURRENT_BUILD_TARGET_OUTPUT} -lc
_EOF
else
cat >>Makefile <<_EOF
g++ -Wall ${CURRENT_BUILD_TARGET_DEFINES} ${CURRENT_BUILD_TARGET_LIBS} ${OUTPUT_OBJS[@]} -o ${CURRENT_BUILD_TARGET_OUTPUT}
_EOF
fi
#TODO: OBJS
CUR_SOURCE_INDEX=0
if [ "${CURRENT_BUILD_TARGET}" = "LIB" ]
then
for SOURCE_FILE in ${CURRENT_BUILD_TARGET_SOURCES}
do
cat >>Makefile <<_EOF
${OUTPUT_OBJS[${CUR_SOURCE_INDEX}]}: ${SOURCE_FILE}
g++ -fPIC -Wall -g -c -o ${OUTPUT_OBJS[${CUR_SOURCE_INDEX}]} ${CURRENT_BUILD_TARGET_INCLUDES} ${CURRENT_BUILD_TARGET_DEFINES} ${SOURCE_FILE}
_EOF
let CUR_SOURCE_INDEX=CUR_SOURCE_INDEX+1
done
else
for SOURCE_FILE in ${CURRENT_BUILD_TARGET_SOURCES}
do
cat >>Makefile <<_EOF
${OUTPUT_OBJS[${CUR_SOURCE_INDEX}]}: ${SOURCE_FILE}
g++ -Wall -c -o ${OUTPUT_OBJS[${CUR_SOURCE_INDEX}]} ${CURRENT_BUILD_TARGET_INCLUDES} ${CURRENT_BUILD_TARGET_DEFINES} ${SOURCE_FILE}
_EOF
let CUR_SOURCE_INDEX=CUR_SOURCE_INDEX+1
done
fi
done
# Makefile sections install, uninstall and strip
cat <<_EOF >>Makefile
install: all
@exec ./install.sh
uninstall:
@exec ./uninstall.sh
strip: all
_EOF
for I in ${TARGETS_OUTPUT_FILES[@]}
do
cat <<_EOF >>Makefile
strip ${I}
_EOF
done
cat <<_EOF >>Makefile
clean:
_EOF
for I in ${CLEAN_OUTPUTS} ${CLEAN_OBJS}
do
cat <<_EOF >>Makefile
@rm -f "$I" >/dev/null 2>&1
_EOF
done
echo "done."
Docela prasácky napsaný, ne zrovna 3x rychlé, ale funguje. Taky si můžete všimnout, že Toolkit se hezky přidá do databáze pkg-config :)
Toolkit má už 7248 řádků :) a má asi 250 kB po kompilaci. Bohužel však stále chybí dodělat spousta widgetů, ale to hlavní už funguje. Zatím jsem s tím udělal hlavní okno JXP Commanderu + about dialog. Není to moc, ale postupuju. Do konce roku už by mohla být funkční a stabilní verze JXP Commanderu. Možná k Vánocům pod stromeček :)
Tiskni
Sdílej:
[ -f Toolkit/Config.h ] && rm -f Toolkit/Config.h
if [ -f Toolkit/Config.h ]
then
echo "failed."
echo "ERROR: File Toolkit/Config.h exists in filesystem and could not be removed."
FAIL
fibych nahradil třeba za
rm Toolkit/Config.h 2>/dev/null || \
{
echo "failed."
echo "ERROR: File Toolkit/Config.h exists in filesystem and could not be removed."
FAIL
}Protože rm -f nevrací 1, když soubor neexistuje, tak raději -f nepoužijeme... A dvakrát checkovat jestli soubor existuje? Nebude lepší raději kontrolovat návraťák?
sed -e 'vyraz1' \ -e 'vyraz2' \ -e 'vyraz3' \ < nejaky_souborVýhodou oproti zápisu do jednoho -e '' se středníky to má tu, že v případě chyby sed řekne číslo řádku na kterém je, což odpovídá pořadí -e.
configure skript generovaný autoconfem - jenže ten aspoň člověk nemusí udržovat a upravovat…