Portál AbcLinuxu, 6. května 2025 14:56
Dneska jsem si trochu pohrál s configure skriptem, a chtěl jsem, aby z toho vzešlo něco, co se dá použít pro další projekty. Snažil jsem se trochu napodobit cmake:
#!/bin/sh # # configure script for Toolkit library # Toolkit is distributed under the terms od BSD License # Copyright (C) 2006 Jaroslav Šmíd <jardasmid@seznam.cz> # # # Set up your project here # build_script() { echo "Running configure script for Toolkit ..." PROJECT Toolkit toolkit_sources=( Toolkit/Alignment.cpp Toolkit/Application.cpp Toolkit/Archiver.cpp Toolkit/Box.cpp Toolkit/Button.cpp Toolkit/ButtonBox.cpp Toolkit/CheckButton.cpp Toolkit/Container.cpp Toolkit/Dialog.cpp Toolkit/Entry.cpp Toolkit/EventBox.cpp Toolkit/File.cpp Toolkit/FileUtils.cpp Toolkit/Frame.cpp Toolkit/HBox.cpp Toolkit/HPaned.cpp Toolkit/Image.cpp Toolkit/IniFile.cpp Toolkit/InputBox.cpp Toolkit/Label.cpp Toolkit/ListView.cpp Toolkit/Menu.cpp Toolkit/Notebook.cpp Toolkit/Paned.cpp Toolkit/ProgressBar.cpp Toolkit/ScrolledWindow.cpp Toolkit/Separator.cpp Toolkit/String.cpp Toolkit/Table.cpp Toolkit/Timer.cpp Toolkit/ToggleButton.cpp Toolkit/VBox.cpp Toolkit/Viewport.cpp Toolkit/VPaned.cpp Toolkit/Widget.cpp Toolkit/Window.cpp ) toolkit_headers=( Toolkit/Alignment.h Toolkit/Application.h Toolkit/Archiver.h Toolkit/Array.h Toolkit/Bool.h Toolkit/Box.h Toolkit/Button.h Toolkit/ButtonBox.h Toolkit/Callback.h Toolkit/CheckButton.h Toolkit/Config.h Toolkit/Container.h Toolkit/Dialog.h Toolkit/Entry.h Toolkit/Enums.h Toolkit/EventBox.h Toolkit/File.h Toolkit/FileUtils.h Toolkit/Frame.h Toolkit/HBox.h Toolkit/HPaned.h Toolkit/Image.h Toolkit/IniFile.h Toolkit/InputBox.h Toolkit/Label.h Toolkit/ListView.h Toolkit/Menu.h Toolkit/Notebook.h Toolkit/Paned.h Toolkit/ProgressBar.h Toolkit/ScrolledWindow.h Toolkit/Separator.h Toolkit/String.h Toolkit/StringArray.h Toolkit/Table.h Toolkit/Timer.h Toolkit/ToggleButton.h Toolkit/Toolkit.h Toolkit/VBox.h Toolkit/Viewport.h Toolkit/VPaned.h Toolkit/Widget.h Toolkit/Window.h ) ttranslator_sources=( ttranslator/mainwindow.cpp ttranslator/ttranslator.cpp ) # # Let's check depencies # echo "Checking depencies ..." echo -en "\tpkg-config (required) ... " which pkg-config >/dev/null 2>&1 if [ $? -eq 0 ] then echo "found." else echo "not found." echo "Depencies test failed." FAIL fi echo -en "\tgtk+-2.0 (required) ... " pkg-config --exists gtk+-2.0 if [ $? -eq 0 ] then GTK2_CFLAGS="`pkg-config gtk+-2.0 --cflags 2>/dev/null`" GTK2_LIBS="`pkg-config gtk+-2.0 --libs 2>/dev/null`" echo "found." else echo "not found." echo "Depencies test failed." FAIL fi echo "Depencies test OK." toolkit_includes="$GTK2_CFLAGS -I." toolkit_libs="$GTK2_LIBS" toolkit_defines="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE" # # Let's generate Toolkit/Config.h # echo -n "Generating Toolkit/Config.h ... " [ -f Toolkit/Config.h ] && rm -f Toolkit/Config.h if [ -f Toolkit/Config.h ] then echo "failed." echo "ERROR: File Toolkit/Config.h exists in filesystem and could not be removed." FAIL fi cat <Toolkit/Config_prefix.h >>Toolkit/Config.h echo "#define TOOLKIT_INSTALL_PREFIX \"$INSTALL_PREFIX\"" >>Toolkit/Config.h cat <Toolkit/Config_sufix.h >>Toolkit/Config.h if [ ! -f Toolkit/Config.h ] then echo "failed." echo "ERROR: File Toolkit/Config.h could not be created." FAIL fi echo "done." # # Let's generate lib/pkgconfig/Toolkit.pc # pkg-config package file # echo -n "Generating lib/pkgconfig/Toolkit.pc ... " [ -f lib/pkgconfig/Toolkit.pc ] && rm -f lib/pkgconfig/Toolkit.pc if [ -f lib/pkgconfig/Toolkit.pc ] then echo "failed." echo "ERROR: File lib/pkgconfig/Toolkit.pc exists in filesystem and could not be removed." FAIL fi cat <lib/pkgconfig/Toolkit.pc.template \ | sed "s|__INSTALL_PREFIX__|${INSTALL_PREFIX}|g" \ | sed "s|__DEFINES__|${toolkit_defines}|g" \ >>lib/pkgconfig/Toolkit.pc if [ ! -f lib/pkgconfig/Toolkit.pc ] then echo "failed." echo "ERROR: File lib/pkgconfig/Toolkit.pc could not be created." FAIL fi echo "done." # # Add target # ADD_LIBRARY toolkit \ FILES ${toolkit_sources[@]} \ DEFINES ${toolkit_defines} \ INCLUDES ${toolkit_includes} \ LIBS ${toolkit_libs} for I in "${toolkit_headers[@]}" do INSTALL_FILE "$I" "/include/Toolkit" done INSTALL_FILE "lib/pkgconfig/Toolkit.pc" "/lib/pkgconfig" ttranslator_includes="${toolkit_includes}" ttranslator_libs="toolkit ${toolkit_libs}" ttranslator_defines="${toolkit_defines}" ADD_EXECUTABLE ttranslator \ FILES ${ttranslator_sources[@]} \ DEFINES ${ttranslator_defines} \ INCLUDES ${ttranslator_includes} \ LIBS ${ttranslator_libs} } # # Internal functions # Do not modify # # # Usage: # FAIL # FAIL() { echo "ERROR: Configure sctipt failed." exit 1 } # # Usage: # PROJECT project_name [C] [CXX] # PROJECT() { [ -n "$1" ] && PROJECT_NAME="$1" } # # Usage: # ADD_EXECUTABLE executable_name FILES file_list INCLUDES include_list LIBS libs_list DEFINES defines_list # ADD_EXECUTABLE() { if [ -z "$1" -o -z "$2" ] then echo "ERROR: add_executable - bad usage" FAIL else TARGETS_ORDER[${TARGETS_COUNT}]="EXE" let TARGETS_COUNT=TARGETS_COUNT+1 EXECUTABLE_FILES[${EXECUTABLE_FILES_COUNT}]="$1" shift ADDING= while [ -n "$1" ] do case "$1" in FILES) ADDING="FILES" ;; DEFINES) ADDING="DEFINES" ;; LIBS) ADDING="LIBS" ;; INCLUDES) ADDING="INCLUDES" ;; *) [ -z "$ADDING" ] && ADDING="FILES" case "$ADDING" in FILES) EXECUTABLE_FILES_SOURCES[${EXECUTABLE_FILES_COUNT}]="${EXECUTABLE_FILES_SOURCES[${EXECUTABLE_FILES_COUNT}]} $1" ;; DEFINES) EXECUTABLE_FILES_DEFINES[${EXECUTABLE_FILES_COUNT}]="${EXECUTABLE_FILES_DEFINES[${EXECUTABLE_FILES_COUNT}]} $1" ;; LIBS) EXECUTABLE_FILES_LIBS[${EXECUTABLE_FILES_COUNT}]="${EXECUTABLE_FILES_LIBS[${EXECUTABLE_FILES_COUNT}]} $1" ;; INCLUDES) EXECUTABLE_FILES_INCLUDES[${EXECUTABLE_FILES_COUNT}]="${EXECUTABLE_FILES_INCLUDES[${EXECUTABLE_FILES_COUNT}]} $1" ;; *) ;; esac ;; esac shift done unset ADDING FILES_TO_INSTALL[${FILES_TO_INSTALL_COUNT}]="output/${EXECUTABLE_FILES[${EXECUTABLE_FILES_COUNT}]}" FILES_TO_INSTALL_TARGETS[${FILES_TO_INSTALL_COUNT}]="/bin" let FILES_TO_INSTALL_COUNT=FILES_TO_INSTALL_COUNT+1 let EXECUTABLE_FILES_COUNT=EXECUTABLE_FILES_COUNT+1 fi } # # Usage: # ADD_LIBRARY library_name FILES file_list INCLUDES include_list LIBS libs_list DEFINES defines_list # ADD_LIBRARY() { if [ -z "$1" -o -z "$2" ] then echo "ERROR: ADD_LIBRARY - bad usage" FAIL else TARGETS_ORDER[${TARGETS_COUNT}]="LIB" let TARGETS_COUNT=TARGETS_COUNT+1 LIBRARY_FILES[${LIBRARY_FILES_COUNT}]="$1" shift ADDING= while [ -n "$1" ] do case "$1" in FILES) ADDING="FILES" ;; DEFINES) ADDING="DEFINES" ;; LIBS) ADDING="LIBS" ;; INCLUDES) ADDING="INCLUDES" ;; *) [ -z "$ADDING" ] && ADDING="FILES" case "$ADDING" in FILES) LIBRARY_FILES_SOURCES[${LIBRARY_FILES_COUNT}]="${LIBRARY_FILES_SOURCES[${LIBRARY_FILES_COUNT}]} $1" ;; DEFINES) LIBRARY_FILES_DEFINES[${LIBRARY_FILES_COUNT}]="${LIBRARY_FILES_DEFINES[${LIBRARY_FILES_COUNT}]} $1" ;; LIBS) LIBRARY_FILES_LIBS[${LIBRARY_FILES_COUNT}]="${LIBRARY_FILES_LIBS[${LIBRARY_FILES_COUNT}]} $1" ;; INCLUDES) LIBRARY_FILES_INCLUDES[${LIBRARY_FILES_COUNT}]="${LIBRARY_FILES_INCLUDES[${LIBRARY_FILES_COUNT}]} $1" ;; *) ;; esac ;; esac shift done FILES_TO_INSTALL[${FILES_TO_INSTALL_COUNT}]="output/lib${LIBRARY_FILES[${LIBRARY_FILES_COUNT}]}.so" FILES_TO_INSTALL_TARGETS[${FILES_TO_INSTALL_COUNT}]="/lib" let FILES_TO_INSTALL_COUNT=FILES_TO_INSTALL_COUNT+1 let LIBRARY_FILES_COUNT=LIBRARY_FILES_COUNT+1 fi } # # Usage: # INSTALL_FILE <FILE> <DEST_DIR> # INSTALL_FILE() { if [ -z "$1" -o -z "$2" ] then echo "ERROR: INSTALL_FILES - bad usage" FAIL else FILES_TO_INSTALL[${FILES_TO_INSTALL_COUNT}]="$1" FILES_TO_INSTALL_TARGETS[${FILES_TO_INSTALL_COUNT}]="$2" let FILES_TO_INSTALL_COUNT=FILES_TO_INSTALL_COUNT+1 fi } # # Internal code # Do not modify # PROJECT_NAME= TARGETS_ORDER=() TARGETS_COUNT=0 EXECUTABLE_FILES_COUNT=0 EXECUTABLE_FILES=() EXECUTABLE_FILES_SOURCES=() EXECUTABLE_FILES_DEFINES=() EXECUTABLE_FILES_LIBS=() EXECUTABLE_FILES_INCLUDES=() LIBRARY_FILES_COUNT=0 LIBRARY_FILES=() LIBRARY_FILES_SOURCES=() LIBRARY_FILES_DEFINES=() LIBRARY_FILES_LIBS=() LIBRARY_FILES_INCLUDES=() FILES_TO_INSTALL_COUNT=0 FILES_TO_INSTALL=() FILES_TO_INSTALL_TARGETS=() INSTALL_PREFIX="/usr/local" # # Parse command line # for I in $@ do case $I in --prefix=*) M_PREFIX=`cut -d= -f2 <<<$I` [ -n "$M_PREFIX" ] && INSTALL_PREFIX="$M_PREFIX" ;; esac done # # Run build script # build_script # # Have mr programmer set project name? # if [ -z "${PROJECT_NAME}" ] then echo "ERROR: Seems mr programmer forgot to set project name." echo "ERROR: Tell him, he can do that by calling PROJECT() function." FAIL fi # # Have mr programmer added some targets? # if [ $TARGETS_COUNT -eq 0 ] then echo "ERROR: Seems mr programmer forgot to add some targets." echo "ERROR: Tell him, he can do that by calling ADD_LIBRARY() and ADD_EXECUTABLE functions." FAIL fi # # Generate install and uninstall script # echo -n "Generating install and uninstall scripts ... " [ -f install.sh ] && rm -f install.sh if [ -f install.sh ] then echo "failed." echo "ERROR: File install.sh exists in filesystem and could not be removed." FAIL fi [ -f uninstall.sh ] && rm -f uninstall.sh if [ -f uninstall.sh ] then echo "failed." echo "ERROR: File install.sh exists in filesystem and could not be removed." FAIL fi # # Install script # cat <<_EOF >>install.sh #!/bin/sh INSTALL_PREFIX="${INSTALL_PREFIX}" [ -n "\${DESTDIR}" ] && INSTALL_PREFIX="\${DESTDIR}" FAIL() { echo "ERROR: Install script failed." exit 1 } FILES_TO_INSTALL=( _EOF for I in ${FILES_TO_INSTALL[@]} do echo -e "\t$I" >>install.sh done cat <<_EOF >>install.sh ) _EOF echo "FILES_TO_INSTALL_TARGETS=(" >>install.sh for I in ${FILES_TO_INSTALL_TARGETS[@]} do echo -e "\t$I" >>install.sh done cat <<_EOF >>install.sh ) echo "Installing ${PROJECT_NAME} ..." C_INDEX=0 for I in \${FILES_TO_INSTALL[@]} do SOURCE="\$I" if [ ! -f "\${SOURCE}" ] then echo "ERROR: File \${SOURCE} doesn't exists in filesystem." echo "ERROR: Maybe you forgot to run make." FAIL fi TARGET_D="\${INSTALL_PREFIX}\${FILES_TO_INSTALL_TARGETS[\${C_INDEX}]}" TARGET="\${TARGET_D}/\`basename \${SOURCE}\`" echo "\${TARGET}" [ -d "\${TARGET_D}" ] || mkdir -p "\${TARGET_D}" >/dev/null 2>&1 if [ ! -d "\${TARGET_D}" ] then echo "ERROR: Target directory for \`basename \${SOURCE}\` could not be created." FAIL fi [ -f "\${TARGET}" ] && rm -f "\${TARGET}" >/dev/null 2>&1 if [ -f "\${TARGET}" ] then echo "ERROR: File \${TARGET} exists in filesystem and could not be removed." FAIL fi cp "\${SOURCE}" "\${TARGET}" >/dev/null 2>&1 if [ ! -f "\${TARGET}" ] then echo "ERROR: File \${TARGET} could not be created." FAIL fi let C_INDEX=C_INDEX+1 done echo "Instalation succesfull." _EOF # # Uninstall script # cat <<_EOF >>uninstall.sh #!/bin/sh INSTALL_PREFIX="${INSTALL_PREFIX}" [ -n "\${DESTDIR}" ] && INSTALL_PREFIX="\${DESTDIR}" FAIL() { echo "ERROR: Uninstall script failed." exit 1 } FILES_TO_INSTALL=( _EOF for I in ${FILES_TO_INSTALL[@]} do echo -e "\t$I" >>uninstall.sh done cat <<_EOF >>uninstall.sh ) _EOF echo "FILES_TO_INSTALL_TARGETS=(" >>uninstall.sh for I in ${FILES_TO_INSTALL_TARGETS[@]} do echo -e "\t$I" >>uninstall.sh done cat <<_EOF >>uninstall.sh ) echo "Uninstalling ${PROJECT_NAME} ..." C_INDEX=0 for I in \${FILES_TO_INSTALL[@]} do SOURCE="\$I" TARGET_D="\${INSTALL_PREFIX}\${FILES_TO_INSTALL_TARGETS[\${C_INDEX}]}" TARGET="\${TARGET_D}/\`basename \${SOURCE}\`" echo "\${TARGET}" [ -f "\${TARGET}" ] && rm -f "\${TARGET}" >/dev/null 2>&1 if [ -f "\${TARGET}" ] then echo "ERROR: File \${TARGET} could not be removed." FAIL fi let C_INDEX=C_INDEX+1 done echo "Uninstalation succesfull." _EOF chmod +x install.sh chmod +x uninstall.sh echo "done." # # Generates Makefile # echo -n "Generating Makefile ... " [ -f Makefile ] && rm -f Makefile >/dev/null 2>&1 if [ -f Makefile ] then echo "failed." echo "ERROR: Makefile exists in filesystem and could not be removed." FAIL fi CURRENT_EXE_TARGET=0 CURRENT_LIB_TARGET=0 TARGETS_OUTPUT_FILES=() CUR_TARGET_NUM=0 for I in ${TARGETS_ORDER[@]} do case $I in EXE) CURRENT_BUILD_TARGET_OUTPUT="output/${EXECUTABLE_FILES[${CURRENT_EXE_TARGET}]}" let CURRENT_EXE_TARGET=CURRENT_EXE_TARGET+1 ;; LIB) CURRENT_BUILD_TARGET_OUTPUT="output/lib${LIBRARY_FILES[${CURRENT_LIB_TARGET}]}.so" let CURRENT_LIB_TARGET=CURRENT_LIB_TARGET+1 ;; *) continue ;; esac TARGETS_OUTPUT_FILES[${CUR_TARGET_NUM}]="${CURRENT_BUILD_TARGET_OUTPUT}" let CUR_TARGET_NUM=CUR_TARGET_NUM+1 done # Makefile section "all:" cat <<_EOF >>Makefile all: ${TARGETS_OUTPUT_FILES[@]} _EOF # CURRENT_EXE_TARGET=0 CURRENT_LIB_TARGET=0 CLEAN_OUTPUTS= CLEAN_OBJS= for I in ${TARGETS_ORDER[@]} do case $I in EXE) CURRENT_BUILD_TARGET="EXE" CURRENT_BUILD_TARGET_NAME=${EXECUTABLE_FILES[${CURRENT_EXE_TARGET}]} CURRENT_BUILD_TARGET_SOURCES=${EXECUTABLE_FILES_SOURCES[${CURRENT_EXE_TARGET}]} CURRENT_BUILD_TARGET_DEFINES=${EXECUTABLE_FILES_DEFINES[${CURRENT_EXE_TARGET}]} CURRENT_BUILD_TARGET_INCLUDES=${EXECUTABLE_FILES_INCLUDES[${CURRENT_EXE_TARGET}]} CURRENT_BUILD_TARGET_LIBS=${EXECUTABLE_FILES_LIBS[${CURRENT_EXE_TARGET}]} CURRENT_BUILD_TARGET_OUTPUT="output/${CURRENT_BUILD_TARGET_NAME}" let CURRENT_EXE_TARGET=CURRENT_EXE_TARGET+1 ;; LIB) CURRENT_BUILD_TARGET="LIB" CURRENT_BUILD_TARGET_NAME=${LIBRARY_FILES[${CURRENT_LIB_TARGET}]} CURRENT_BUILD_TARGET_SOURCES=${LIBRARY_FILES_SOURCES[${CURRENT_LIB_TARGET}]} CURRENT_BUILD_TARGET_DEFINES=${LIBRARY_FILES_DEFINES[${CURRENT_EXE_TARGET}]} CURRENT_BUILD_TARGET_INCLUDES=${LIBRARY_FILES_INCLUDES[${CURRENT_EXE_TARGET}]} CURRENT_BUILD_TARGET_LIBS=${LIBRARY_FILES_LIBS[${CURRENT_EXE_TARGET}]} CURRENT_BUILD_TARGET_OUTPUT="output/lib${CURRENT_BUILD_TARGET_NAME}.so" let CURRENT_LIB_TARGET=CURRENT_LIB_TARGET+1 ;; *) continue ;; esac CLEAN_OUTPUTS="${CLEAN_OUTPUTS} ${CURRENT_BUILD_TARGET_OUTPUT}" OUTPUT_OBJS=() CUR_OBJ_NUM=0 for SOURCE_FILE in ${CURRENT_BUILD_TARGET_SOURCES} do SOURCE_FILE_NAME="`basename ${SOURCE_FILE}`" SOURCE_FILE_NAME="`cut -d. -f1 <<<${SOURCE_FILE_NAME}`" SOURCE_FILE_DIR="`dirname ${SOURCE_FILE}`" OUTPUT_OBJ_DIR="output/objs/${SOURCE_FILE_DIR}" [ -d "${OUTPUT_OBJ_DIR}" ] || mkdir -p "${OUTPUT_OBJ_DIR}" >/dev/null 2>&1 if [ ! -d "${OUTPUT_OBJ_DIR}" ] then echo "failed." echo "ERROR: Directory ${OUTPUT_OBJ_DIR} for object files could not be created." FAIL fi OUTPUT_OBJS[${CUR_OBJ_NUM}]="${OUTPUT_OBJ_DIR}/${SOURCE_FILE_NAME}.o" let CUR_OBJ_NUM=CUR_OBJ_NUM+1 done unset CUR_OBJ_NUM unset SOURCE_FILE_NAME unset SOURCE_FILE_DIR unset OUTPUT_OBJ_DIR CLEAN_OBJS="${CLEAN_OBJS} ${OUTPUT_OBJS[@]}" DEP_LIBS= CURRENT_BUILD_TARGET_LIBS_NEW= for LIB in ${CURRENT_BUILD_TARGET_LIBS} do if [ "`cut -dl -f1 <<<$LIB`" != "-" -a "`cut -dL -f1 <<<$LIB`" != "-" ] then for LIB_TARGET in ${LIBRARY_FILES[@]} do if [ "$LIB_TARGET" = "$LIB" ] then DEP_LIBS="${DEP_LIBS} output/lib${LIB}.so" CURRENT_BUILD_TARGET_LIBS_NEW="${CURRENT_BUILD_TARGET_LIBS_NEW} -L./output -l${LIB}" break fi done unset LIB_TARGET else CURRENT_BUILD_TARGET_LIBS_NEW="${CURRENT_BUILD_TARGET_LIBS_NEW} ${LIB}" fi done CURRENT_BUILD_TARGET_LIBS=${CURRENT_BUILD_TARGET_LIBS_NEW} unset CURRENT_BUILD_TARGET_LIBS_NEW cat <<_EOF >>Makefile ${CURRENT_BUILD_TARGET_OUTPUT}: ${DEP_LIBS} ${OUTPUT_OBJS[@]} _EOF unset DEP_LIBS if [ "${CURRENT_BUILD_TARGET}" = "LIB" ] then cat >>Makefile <<_EOF g++ -g -shared -W1,-soname,lib${CURRENT_BUILD_TARGET_NAME}.so ${CURRENT_BUILD_TARGET_DEFINES} ${CURRENT_BUILD_TARGET_LIBS} ${OUTPUT_OBJS[@]} -o ${CURRENT_BUILD_TARGET_OUTPUT} -lc _EOF else cat >>Makefile <<_EOF g++ -Wall ${CURRENT_BUILD_TARGET_DEFINES} ${CURRENT_BUILD_TARGET_LIBS} ${OUTPUT_OBJS[@]} -o ${CURRENT_BUILD_TARGET_OUTPUT} _EOF fi #TODO: OBJS CUR_SOURCE_INDEX=0 if [ "${CURRENT_BUILD_TARGET}" = "LIB" ] then for SOURCE_FILE in ${CURRENT_BUILD_TARGET_SOURCES} do cat >>Makefile <<_EOF ${OUTPUT_OBJS[${CUR_SOURCE_INDEX}]}: ${SOURCE_FILE} g++ -fPIC -Wall -g -c -o ${OUTPUT_OBJS[${CUR_SOURCE_INDEX}]} ${CURRENT_BUILD_TARGET_INCLUDES} ${CURRENT_BUILD_TARGET_DEFINES} ${SOURCE_FILE} _EOF let CUR_SOURCE_INDEX=CUR_SOURCE_INDEX+1 done else for SOURCE_FILE in ${CURRENT_BUILD_TARGET_SOURCES} do cat >>Makefile <<_EOF ${OUTPUT_OBJS[${CUR_SOURCE_INDEX}]}: ${SOURCE_FILE} g++ -Wall -c -o ${OUTPUT_OBJS[${CUR_SOURCE_INDEX}]} ${CURRENT_BUILD_TARGET_INCLUDES} ${CURRENT_BUILD_TARGET_DEFINES} ${SOURCE_FILE} _EOF let CUR_SOURCE_INDEX=CUR_SOURCE_INDEX+1 done fi done # Makefile sections install, uninstall and strip cat <<_EOF >>Makefile install: all @exec ./install.sh uninstall: @exec ./uninstall.sh strip: all _EOF for I in ${TARGETS_OUTPUT_FILES[@]} do cat <<_EOF >>Makefile strip ${I} _EOF done cat <<_EOF >>Makefile clean: _EOF for I in ${CLEAN_OUTPUTS} ${CLEAN_OBJS} do cat <<_EOF >>Makefile @rm -f "$I" >/dev/null 2>&1 _EOF done echo "done."
Docela prasácky napsaný, ne zrovna 3x rychlé, ale funguje. Taky si můžete všimnout, že Toolkit se hezky přidá do databáze pkg-config :)
Toolkit má už 7248 řádků :) a má asi 250 kB po kompilaci. Bohužel však stále chybí dodělat spousta widgetů, ale to hlavní už funguje. Zatím jsem s tím udělal hlavní okno JXP Commanderu + about dialog. Není to moc, ale postupuju. Do konce roku už by mohla být funkční a stabilní verze JXP Commanderu. Možná k Vánocům pod stromeček :)
Tiskni
Sdílej:
[ -f Toolkit/Config.h ] && rm -f Toolkit/Config.h if [ -f Toolkit/Config.h ] then echo "failed." echo "ERROR: File Toolkit/Config.h exists in filesystem and could not be removed." FAIL fibych nahradil třeba za
rm Toolkit/Config.h 2>/dev/null || \ { echo "failed." echo "ERROR: File Toolkit/Config.h exists in filesystem and could not be removed." FAIL }Protože rm -f nevrací 1, když soubor neexistuje, tak raději -f nepoužijeme... A dvakrát checkovat jestli soubor existuje? Nebude lepší raději kontrolovat návraťák?
sed -e 'vyraz1' \ -e 'vyraz2' \ -e 'vyraz3' \ < nejaky_souborVýhodou oproti zápisu do jednoho -e '' se středníky to má tu, že v případě chyby sed řekne číslo řádku na kterém je, což odpovídá pořadí -e.
configure
skript generovaný autoconfem - jenže ten aspoň člověk nemusí udržovat a upravovat…
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.