Americký výrobce čipů Intel propustí 15 procent zaměstnanců (en), do konce roku by jich v podniku mělo pracovat zhruba 75.000. Firma se potýká s výrobními problémy a opouští také miliardový plán na výstavbu továrny v Německu a Polsku.
MDN (Wikipedie), dnes MDN Web Docs, původně Mozilla Developer Network, slaví 20 let. V říjnu 2004 byl ukončen provoz serveru Netscape DevEdge, který byl hlavním zdrojem dokumentace k webovým prohlížečům Netscape a k webovým technologiím obecně. Mozille se po jednáních s AOL povedlo dokumenty z Netscape DevEdge zachránit a 23. července 2005 byl spuštěn MDC (Mozilla Developer Center). Ten byl v roce 2010 přejmenován na MDN.
Wayback byl vydán ve verzi 0.1. Wayback je "tak akorát Waylandu, aby fungoval Xwayland". Jedná se o kompatibilní vrstvu umožňující běh plnohodnotných X11 desktopových prostředí s využitím komponent z Waylandu. Cílem je nakonec nahradit klasický server X.Org, a tím snížit zátěž údržby aplikací X11.
Byla vydána nová verze 6.18 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Nově se lze k síti Tor připojit pomocí mostu WebTunnel. Tor Browser byl povýšen na verzi 14.5.5. Thunderbird na verzi 128.12.0. Další změny v příslušném seznamu.
Meta představila prototyp náramku, který snímá elektrickou aktivity svalů (povrchová elektromyografie, EMG) a umožňuje jemnými gesty ruky a prstů ovládat počítač nebo různá zařízení. Získané datové sady emg2qwerty a emg2pose jsou open source.
Byla vydána (𝕏) nová verze 25.7 open source firewallové a routovací platformy OPNsense (Wikipedie). Jedná se o fork pfSense postavený na FreeBSD. Kódový název OPNsense 25.7 je Visionary Viper. Přehled novinek v příspěvku na fóru.
Před 40 lety, 23. července 1985, společnost Commodore představila první počítač Amiga. Jednalo se o počítač "Amiga od Commodore", jenž byl později pojmenován Amiga 1000. Mělo se jednat o přímou konkurenci počítače Apple Macintosh uvedeného na trh v lednu 1984.
T‑Mobile USA ve spolupráci se Starlinkem spustil službu T-Satellite. Uživatelé služby mohou v odlehlých oblastech bez mobilního signálu aktuálně využívat satelitní síť s více než 650 satelity pro posílání a příjem zpráv, sdílení polohy, posílání zpráv na 911 a příjem upozornění, posílání obrázků a krátkých hlasových zpráv pomocí aplikace Zprávy Google. V plánu jsou také satelitní data.
Společnost Proxmox Server Solutions stojící za virtualizační platformou Proxmox Virtual Environment věnovala 10 000 eur nadaci The Perl and Raku Foundation (TPRF).
Byla vydána nová verze 2.4.65 svobodného multiplatformního webového serveru Apache (httpd). Řešena je bezpečnostní chyba CVE-2025-54090.
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…