abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:55 | Nová verze

    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.

    Ladislav Hagara | Komentářů: 0
    dnes 00:33 | Komunita

    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.

    Ladislav Hagara | Komentářů: 6
    včera 23:22 | Pozvánky

    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 »
    bkralik | Komentářů: 0
    včera 22:33 | IT novinky

    Dle plánu dnes končí služba Skype. Uživatelé mohou pokračovat v Microsoft Teams.

    Ladislav Hagara | Komentářů: 0
    včera 21:44 | IT novinky

    Č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.

    Ladislav Hagara | Komentářů: 1
    včera 12:33 | Zajímavý projekt

    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.

    Ladislav Hagara | Komentářů: 1
    včera 12:11 | Pozvánky

    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.

    Ladislav Hagara | Komentářů: 0
    4.5. 21:44 | Komunita

    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.

    Ladislav Hagara | Komentářů: 0
    4.5. 14:22 | IT novinky

    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.

    Ladislav Hagara | Komentářů: 31
    3.5. 22:33 | Nová verze

    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ů.

    Ladislav Hagara | Komentářů: 2
    Jaký filesystém primárně používáte?
     (58%)
     (1%)
     (8%)
     (22%)
     (4%)
     (2%)
     (2%)
     (0%)
     (1%)
     (3%)
    Celkem 530 hlasů
     Komentářů: 22, poslední včera 10:06
    Rozcestník

    Toolkit

    26.8.2006 19:48 | Přečteno: 1284× | 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.