Byl vydán Debian 13.6, tj. šestá opravná verze Debianu 13 s kódovým názvem Trixie a Debian 12.15, tj. poslední patnáctá opravná verze Debianu 12 s kódovým názvem Bookworm, k dispozici je LTS. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 13 a Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.
V jádře Linux byla nalezena a v upstreamu již byla opravena kritická zranitelnost GhostLock aneb CVE-2026-43499. Lokálnímu uživateli umožňuje získat práva roota a také obejít kontejnerovou izolaci. Zranitelnost existovala v Linuxu 15 let, tj. od roku 2011, od Linuxu verze 2.6.39.
Evropská komise předběžně shledala, že návykový design aplikací Instagram a Facebook od americké společnosti Meta porušuje unijní nařízení o digitálních službách (DSA). Návykový design zahrnuje například takzvané nekonečné posouvání, automatické přehrávání videí, tzv. push notifikace, kdy aplikace uživatele vybízí k návratu do jejího prostředí, či vysoce personalizovaný algoritmus, který rychle pozná, co uživatele baví a snaží
… více »Byla vydána verze 1.97.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.
Švýcarská společnost Punkt. má nově v nabídce telefon Punkt. MC03. Telefon byl navržen ve Švýcarsku s důrazem na soukromí a digitální suverenitu a vyroben v Německu. V telefonu běží operační systém AphyOS (Apostrophy OS) založený na AOSP (Android Open Source Project) 15. Cena telefonu je 745 eur.
TypeScript (Wikipedie), tj. JavaScript rozšířený o statické typování a další atributy, byl vydán v nové verzi 7.0. Kompilátor byl kvůli výkonu přepsán z TypeScriptu do Go.
Europarlament podpořil pozměněnou verzi výjimky známé jako „chat control 1.0“ umožňující firmám skenovat soukromou komunikaci na internetu kvůli ochraně dětí před zneužitím. Pozměňovací návrhy přijaté europoslanci však počítají s tím, že z výjimky bude vyřazena šifrovaná komunikace. Výjimka přestala platit začátkem dubna poté, co se Evropský parlament a Rada EU nedokázaly shodnout na jejím prodloužení. Rada následně přijala
… více »Nejnovější X.Org X server 21.1.24 a Xwayland 24.1.13 řeší 2 bezpečnostní chyby.
Clement "Clem" Lefebvre publikoval souhrn dění v Linux Mintu za červen 2026. Vypíchnuta je vylepšená podpora Waylandu. Už není považována za experimentální. V příští verzi Linux Mintu, plánována je na Vánoce, bude běh Cinnamonu plně podporován na X11 i Waylandu. V květnu na vývoj Linux Mintu přispělo 611 dárců celkovou částkou 19 612 dolarů. Dalších 2 326 patronů přispělo na Patreonu celkovou částkou 5 334 dolarů.
V Linuxu v KVM byla nalezena a v upstreamu již byla opravena kritická zranitelnost Januscape aneb CVE-2026-53359. Root na hostovaném počítači (virtuální stroj) může obejít izolaci a získat plnou kontrolu nad hostitelským systémem (DoS útok nebo vzdálené spuštění kódu s právy roota). Na obou hlavních architekturách – Intel i AMD. Zranitelnost v Linuxu existovala téměř 16 let (od srpna 2010 do června 2026).
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…