abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 17:55 | Komunita

    Na čem aktuálně pracují vývojáři GNOME a KDE? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE.

    Ladislav Hagara | Komentářů: 0
    7.6. 14:55 | IT novinky

    Před 70 lety, 7. června 1954, ve věku 41 let, zemřel Alan Turing, britský matematik, logik, kryptoanalytik a zakladatel moderní informatiky.

    Ladislav Hagara | Komentářů: 8
    7.6. 11:44 | Zajímavý software

    NiceGUI umožňuje používat webový prohlížeč jako frontend pro kód v Pythonu. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.

    Ladislav Hagara | Komentářů: 1
    7.6. 10:55 | Nová verze

    Open source platforma Home Assistant (Demo, GitHub, Wikipedie) pro monitorování a řízení inteligentní domácnosti byla vydána ve verzi 2024.6. Z novinek lze vypíchnout lepší integraci LLM (OpenAI, Google AI, Ollama) nebo podporu Matter 1.3.

    Ladislav Hagara | Komentářů: 0
    6.6. 20:55 | IT novinky

    IKEA ve Spojeném království hledá zaměstnance do své nové pobočky. Do pobočky v počítačové hře Roblox. Nástupní mzda je 13,15 liber na hodinu.

    Ladislav Hagara | Komentářů: 0
    6.6. 10:44 | Zajímavý článek

    Alyssa Rosenzweig se v příspěvku na svém blogu Vulkan 1.3 na M1 za 1 měsíc rozepsala o novém Vulkan 1.3 ovladači Honeykrisp pro Apple M1 splňujícím specifikaci Khronosu. Vychází z ovladače NVK pro GPU od Nvidie. V plánu je dále rozchodit DXVK a vkd3d-proton a tím pádem Direct3D, aby na Apple M1 s Asahi Linuxem běžely hry pro Microsoft Windows.

    Ladislav Hagara | Komentářů: 41
    6.6. 01:00 | Nová verze

    Byla vydána (𝕏) květnová aktualizace aneb nová verze 1.90 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.90 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 0
    6.6. 00:44 | Nová verze

    Byla vydána (Mastodon, 𝕏) nová verze 2024.2 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek se seznamem nových nástrojů v oficiálním oznámení.

    Ladislav Hagara | Komentářů: 0
    5.6. 16:44 | IT novinky

    Počítačová hra Tetris slaví 40 let. Alexej Pažitnov dokončil první hratelnou verzi 6. června 1984. Mezitím vznikla celá řada variant. Například Peklo nebo Nebe. Loni měl premiéru film Tetris.

    Ladislav Hagara | Komentářů: 10
    5.6. 10:44 | Nová verze

    MicroPython (Wikipedie), tj. implementace Pythonu 3 optimalizovaná pro jednočipové počítače, byl vydán ve verzi 1.23.0. V přehledu novinek je vypíchnuta podpora dynamických USB zařízení nebo nové moduly openamp, tls a vfs.

    Ladislav Hagara | Komentářů: 0
    Rozcestník

    Toolkit

    26.8.2006 19:48 | Přečteno: 1274× | Linux

    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 :)

           

    Hodnocení: 79 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    26.8.2006 19:54 Jan Jílek | skóre: 6 | blog: Strider
    Rozbalit Rozbalit vše Re: Toolkit
    Neumím programovat, ale ocenuji vasi vytrvalost. Tesim se na komander. :-)
    Čas od času jsem sražen k zemi. Ale vždy vstanu a nedovolím nikomu držet mě na zemi.
    David Watzke avatar 26.8.2006 21:39 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Toolkit
    [ -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
    bych 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? :-)
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    David Watzke avatar 26.8.2006 21:42 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Toolkit
    A zase tam vidím cat a za ním deset sedů... ach jo :-D
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    Josef Kufner avatar 26.8.2006 22:39 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Toolkit
    Jojo, je to zlé... tak malá ukázka, jak to může být hezčejší:
    sed	-e 'vyraz1' \
    	-e 'vyraz2' \
    	-e 'vyraz3' \
    < nejaky_soubor
    
    Vý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.
    Hello world ! Segmentation fault (core dumped)
    26.8.2006 22:25 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
    Rozbalit Rozbalit vše Re: Toolkit
    Připadá mi to strašně složitý...
    -- Nezdar není hanbou, hanbou je strach z pokusu.
    26.8.2006 22:39 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Toolkit
    To bude tím, že to složité je. :-) Ale pořád jednodušší než obvyklý configure skript generovaný autoconfem - jenže ten aspoň člověk nemusí udržovat a upravovat…
    Josef Kufner avatar 26.8.2006 22:52 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Toolkit
    Ale taky je tu ještě jednodušší cesta, která sice nemusí nemusí fungovat vždy, ale aspoň je to jednoduší :)

    Kdysi jsem si napsal mfgen, což je jen bash script, který vygeneruje klasický makefile s tím, že závislosti nechá na gcc a zachovává konfiguraci uloženou ve výsledném makefile. Na nesložité programy je to IMHO dobře použitelné. Používám to celkem dlouho a jediné co jsem kdy dělal, tak bylo dopsání cílů na konec scriptu pro selftesty. Trošku mi tam chybí podpora pro pkgconfig, takže až budu něco psát, tak ji tam asi dodělám. Funguje jak s C, tak s C++.
    Hello world ! Segmentation fault (core dumped)
    Pred dlouhou dobou jsem na mfgen narazil a dodnes ho na male testovaci programky pouzivam, velmi uzitecna vec. Dekuji za jeho vytvoreni :)

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.