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 01:22 | Nová verze

    Byla vydána nová verze 1.12.0 dynamického programovacího jazyka Julia (Wikipedie) určeného zejména pro vědecké výpočty. Přehled novinek v příspěvku na blogu a v poznámkách k vydání. Aktualizována byla také dokumentace.

    Ladislav Hagara | Komentářů: 0
    včera 15:11 | Bezpečnostní upozornění

    V Redisu byla nalezena a v upstreamu již opravena kritická zranitelnost CVE-2025-49844 s CVSS 10.0 (RCE, vzdálené spouštění kódu).

    Ladislav Hagara | Komentářů: 4
    včera 14:00 | IT novinky

    Ministr a vicepremiér pro digitalizaci Marian Jurečka dnes oznámil, že přijme rezignaci ředitele Digitální a informační agentury Martina Mesršmída, a to k 23. říjnu 2025. Mesršmíd nabídl svou funkci během minulého víkendu, kdy se DIA potýkala s problémy eDokladů, které některým občanům znepříjemnily využití možnosti prokázat se digitální občankou u volebních komisí při volbách do Poslanecké sněmovny.

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

    Společnost Meta představila OpenZL. Jedná se o open source framework pro kompresi dat s ohledem na jejich formát. Zdrojové kódy jsou k dispozici na GitHubu.

    Ladislav Hagara | Komentářů: 0
    včera 03:33 | IT novinky

    Google postupně zpřístupňuje českým uživatelům Režim AI (AI Mode), tj. nový režim vyhledávání založený na umělé inteligenci. Režim AI nabízí pokročilé uvažování, multimodalitu a možnost prozkoumat jakékoliv téma do hloubky pomocí dodatečných dotazů a užitečných odkazů na weby.

    Ladislav Hagara | Komentářů: 0
    7.10. 18:11 | Nová verze

    Programovací jazyk Python byl vydán v nové major verzi 3.14.0. Podrobný přehled novinek v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 2
    7.10. 16:33 | IT novinky

    Bylo oznámeno, že Qualcomm kupuje Arduino. Současně byla představena nová deska Arduino UNO Q se dvěma čipy: MPU Qualcomm Dragonwing QRB2210, na kterém může běžet Linux, a MCU STM32U585 a vývojové prostředí Arduino App Lab.

    Ladislav Hagara | Komentářů: 4
    7.10. 15:55 | Nová verze

    Multiplatformní open source voxelový herní engine Luanti byl vydán ve verzi 5.14.0. Podrobný přehled novinek v changelogu. Původně se jedná o Minecraftem inspirovaný Minetest v říjnu loňského roku přejmenovaný na Luanti.

    Ladislav Hagara | Komentářů: 0
    7.10. 13:22 | Nová verze

    Byla vydána nová stabilní verze 6.10 (YouTube) multiplatformního frameworku a GUI toolkitu Qt. Podrobný přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    6.10. 23:55 | Komunita

    Ubuntu 26.04 LTS bude (𝕏) Resolute Raccoon (rezolutní mýval).

    Ladislav Hagara | Komentářů: 5
    Jaké řešení používáte k vývoji / práci?
     (38%)
     (46%)
     (15%)
     (17%)
     (21%)
     (15%)
     (17%)
     (15%)
     (15%)
    Celkem 198 hlasů
     Komentářů: 13, poslední včera 07:41
    Rozcestník

    Toolkit

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