Byla vydána verze 4.0 multiplatformního integrovaného vývojového prostředí (IDE) pro rychlý vývoj aplikaci (RAD) ve Free Pascalu Lazarus (Wikipedie). Přehled novinek v poznámkách k vydání. Využíván je Free Pascal Compiler (FPC) 3.2.2.
Podpora Windows 10 končí 14. října 2025. Připravovaná kampaň Konec desítek (End of 10) může uživatelům pomoci s přechodem na Linux.
Již tuto středu proběhne 50. Virtuální Bastlírna, tedy dle římského číslování L. Bude L značit velikost, tedy více diskutujících než obvykle, či délku, neboť díky svátku lze diskutovat dlouho do noci? Bude i příští Virtuální Bastlírna virtuální nebo reálná? Nejen to se dozvíte, když dorazíte na diskuzní večer o elektronice, softwaru, ale technice obecně, který si můžete představit jako virtuální posezení u piva spojené s učenou
… více »Český statistický úřad rozšiřuje Statistický geoportál o Datový portál GIS s otevřenými geografickými daty. Ten umožňuje stahování datových sad podle potřeb uživatelů i jejich prohlížení v mapě a přináší nové možnosti v oblasti analýzy a využití statistických dat.
Kevin Lin zkouší využívat chytré brýle Mentra při hraní na piano. Vytváří aplikaci AugmentedChords, pomocí které si do brýlí posílá notový zápis (YouTube). Uvnitř brýlí běží AugmentOS (GitHub), tj. open source operační systém pro chytré brýle.
Jarní konference EurOpen.cz 2025 proběhne 26. až 28. května v Brandýse nad Labem. Věnována je programovacím jazykům, vývoji softwaru a programovacím technikám.
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.
Před 25 lety zaplavil celý svět virus ILOVEYOU. Virus se šířil e-mailem, jenž nesl přílohu s názvem I Love You. Příjemci, zvědavému, kdo se do něj zamiloval, pak program spuštěný otevřením přílohy načetl z adresáře e-mailové adresy a na ně pak „milostný vzkaz“ poslal dál. Škody vznikaly jak zahlcením e-mailových serverů, tak i druhou činností viru, kterou bylo přemazání souborů uložených v napadeném počítači.
Byla vydána nová major verze 5.0.0 svobodného multiplatformního nástroje BleachBit (GitHub, Wikipedie) určeného především k efektivnímu čištění disku od nepotřebných souborů.
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…