Organizátoři konference LinuxDays ukončili veřejné přihlašování přednášek. Teď je na vás, abyste vybrali nejlepší témata, která na letošní konferenci zaznějí. Hlasovat můžete do neděle 7. září. Poté podle výsledků hlasování organizátoři sestaví program pro letošní ročník. Konference proběhne 4. a 5. října v Praze.
Byla vydána verze 11.0.0 vizuálního programovacího jazyka Snap! (Wikipedie) inspirovaného jazykem Scratch (Wikipedie). Přehled novinek na GitHubu.
Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma. Vypíchnout lze, že v Plasmě byl implementován 22letý požadavek. Historie schránky nově umožňuje ohvězdičkovat vybrané položky a mít k ním trvalý a snadný přístup.
Wayfire, kompozitní správce oken běžící nad Waylandem a využívající wlroots, byl vydán ve verzi 0.10.0. Zdrojové kódy jsou k dispozici na GitHubu. Videoukázky na YouTube.
Před necelými čtyřmi měsíci byl Steven Deobald jmenován novým výkonným ředitelem GNOME Foundation. Včera skončil, protože "nebyl pro tuto roli v tento čas ten pravý".
Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 156 (pdf).
Armbian, tj. linuxová distribuce založená na Debianu a Ubuntu optimalizovaná pro jednodeskové počítače na platformě ARM a RISC-V, ke stažení ale také pro Intel a AMD, byl vydán ve verzi 25.8.1. Přehled novinek v Changelogu.
Včera večer měl na YouTube premiéru dokumentární film Python: The Documentary | An origin story.
Společnost comma.ai po třech letech od vydání verze 0.9 vydala novou verzi 0.10 open source pokročilého asistenčního systému pro řidiče openpilot (Wikipedie). Zdrojové kódy jsou k dispozici na GitHubu.
Ubuntu nově pro testování nových verzí vydává měsíční snapshoty. Dnes vyšel 4. snapshot Ubuntu 25.10 (Questing Quokka).
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…