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 12:33 | Nová verze

    Byl vydán Debian Installer Trixie RC 2, tj. druhá RC verze instalátoru Debianu 13 s kódovým názvem Trixie.

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

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za červen (YouTube).

    Ladislav Hagara | Komentářů: 0
    dnes 02:33 | Nová verze

    Libreboot (Wikipedie) – svobodný firmware nahrazující proprietární BIOSy, distribuce Corebootu s pravidly pro proprietární bloby – byl vydán ve verzi 25.06 "Luminous Lemon". Přidána byla podpora desek Acer Q45T-AM a Dell Precision T1700 SFF a MT. Současně byl ve verzi 25.06 "Onerous Olive" vydán také Canoeboot, tj. fork Librebootu s ještě přísnějšími pravidly.

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

    Licence GNU GPLv3 o víkendu oslavila 18 let. Oficiálně vyšla 29. června 2007. Při té příležitosti Richard E. Fontana a Bradley M. Kuhn restartovali, oživili a znovu spustili projekt Copyleft-Next s cílem prodiskutovat a navrhnout novou licenci.

    Ladislav Hagara | Komentářů: 0
    včera 16:55 | Nová verze

    Svobodný nemocniční informační systém GNU Health Hospital Information System (HIS) (Wikipedie) byl vydán ve verzi 5.0 (Mastodon).

    Ladislav Hagara | Komentářů: 0
    včera 16:22 | Komunita

    Open source mapová a navigační aplikace OsmAnd (OpenStreetMap Automated Navigation Directions, Wikipedie, GitHub) oslavila 15 let.

    Ladislav Hagara | Komentářů: 0
    včera 11:55 | Zajímavý software

    Vývojář Spytihněv, autor počítačové hry Hrot (Wikipedie, ProtonDB), pracuje na nové hře Brno Transit. Jedná se o příběhový psychologický horor o strojvedoucím v zácviku, uvězněném v nejzatuchlejším metru východně od všeho, na čem záleží. Vydání je plánováno na čtvrté čtvrtletí letošního roku.

    Ladislav Hagara | Komentářů: 38
    1.7. 18:22 | IT novinky

    V uplynulých dnech byla v depu Českých drah v Brně-Maloměřicích úspěšně dokončena zástavba speciální antény satelitního internetu Starlink od společnosti SpaceX do jednotky InterPanter 660 004 Českých drah. Zástavbu provedla Škoda Group. Cestující se s InterPanterem, vybaveným vysokorychlostním satelitním internetem, setkají například na linkách Svitava Brno – Česká Třebová – Praha nebo Moravan Brno – Břeclav – Přerov – Olomouc.

    Ladislav Hagara | Komentářů: 21
    1.7. 13:11 | Nová verze

    Byla vydána nová verze 8.7.0 správce sbírky fotografií digiKam (Wikipedie). Přehled novinek i s náhledy v oficiálním oznámení (NEWS). Nejnovější digiKam je ke stažení také jako balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo ke spuštění a spustit.

    Ladislav Hagara | Komentářů: 0
    1.7. 12:22 | IT novinky

    Před 30 lety, k 1. 7. 1995, byl v ČR liberalizován Internet - tehdejší Eurotel přišel o svou exkluzivitu a mohli začít vznikat první komerční poskytovatelé přístupu k Internetu [𝕏].

    Ladislav Hagara | Komentářů: 4
    Jaký je váš oblíbený skriptovací jazyk?
     (59%)
     (28%)
     (7%)
     (2%)
     (0%)
     (1%)
     (3%)
    Celkem 342 hlasů
     Komentářů: 16, poslední 8.6. 21:05
    Rozcestník

    Toolkit

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