Makefile for plain C source, how to? (IMAP proxy)

M66B

Mitglied
Mitglied seit
17 Feb 2010
Beiträge
225
Punkte für Reaktionen
0
Punkte
0
How do I create a makefile for a plain C source? (this one)
For now I have created an archive myself and am hosting it on my own site.

This is the makefile so far: (the Yahoo! IMAP proxy works okay on Freetz)
Code:
$(call PKG_INIT_BIN, 0.0)
$(PKG)_SITE:=<omitted>
$(PKG)_SOURCE:=yahooproxy.tar.gz
$(PKG)_DIR:=$($(PKG)_SOURCE_DIR)/yahooproxy
$(PKG)_BINARY:=$($(PKG)_DIR)/yahooproxy
$(PKG)_TARGET_BINARY:=$($(PKG)_DEST_DIR)/usr/bin/yahooproxy

$(PKG_SOURCE_DOWNLOAD)
$(PKG_UNPACKED)
$(PKG_CONFIGURED_NOP)

$($(PKG)_BINARY): $($(PKG)_DIR)/.unpacked
	$(MAKE_ENV) $(TARGET_CC) \
	$(TARGET_CFLAGS) $(TARGET_LDFLAGS) \
	$(YAHOOPROXY_DIR)/yahooproxy.c \
	-o $(YAHOOPROXY_DIR)/yahooproxy

$($(PKG)_TARGET_BINARY): $($(PKG)_BINARY)
	$(INSTALL_BINARY_STRIP)

$(pkg)-precompiled: $($(PKG)_TARGET_BINARY)

$(pkg)-clean:
	rm $(YAHOOPROXY_DIR)/yahooproxy

$(pkg)-uninstall:
	$(RM) $($(PKG)_TARGET_BINARY)

$(PKG_FINISH)
 
Zuletzt bearbeitet:
Thank you for your answer, but I am not sure what you mean.
Can you explain it a little bit more?
 
Ich meine, dass Du in deinem yahooproxy-Freetz-Paket ein Verzeichnis "patches" haben solltest, in dem sich der "Makefile.patch" befindet, der dann dem entpackten Quellcode das von dir gewünschte "Makefile" beifügt.
 
Maybe I didn't explain it properly.
There is no makefile available at all (just the one for Freetz I made, see above).
The author of yahooproxy only makes available a C source for download (uncompressed).
Since the Freetz build process expects an archive (zip, gz, etc) I have no idea how to make a package for yahooproxy.
(other than packing the C source and hosting the archive myself)
 
Maybe noteworthy is that the Freetz makefile takes care of the compilation.
Code:
$($(PKG)_BINARY): $($(PKG)_DIR)/.unpacked
	$(MAKE_ENV) $(TARGET_CC) \
	$(TARGET_CFLAGS) $(TARGET_LDFLAGS) \
	$(YAHOOPROXY_DIR)/yahooproxy.c \
	-o $(YAHOOPROXY_DIR)/yahooproxy
 
Maybe I didn't explain it properly.
Doch, ich habe dich schon richtig verstanden.;)
There is no makefile available at all (just the one for Freetz I made, see above).
The author of yahooproxy only makes available a C source for download (uncompressed).
Ja, es gibt zum Quellcode (in Format einer ungepackten *.c-Datei) kein Makefile und Du willst eins haben, weil Du die Kompilierung mit Hilfe eines Freetz-Paketes machen willst.
Since the Freetz build process expects an archive (zip, gz, etc) I have no idea how to make a package for yahooproxy.
(other than packing the C source and hosting the archive myself)
Den 1. Schritt hast Du schon gemacht. Du hast die *.c-Datei in ein Archiv gepackt:
Code:
$(PKG)_SOURCE:=yahooproxy.tar.gz
Jetzt fehlen noch die 2. Datein für dein Freetz-Paket: "Makefile.in", "Config.in", das Verzeichnis "patches" mit dem "Makefile.patch" und einige Änderungen an der Datei "yahooproxy.mk".
 
Doch, ich habe dich schon richtig verstanden.
Ja, es gibt zum Quellcode (in Format einer ungepackten *.c-Datei) kein Makefile und Du willst eins haben, weil Du die Kompilierung mit Hilfe eines Freetz-Paketes machen willst.
You did :p
Den 1. Schritt hast Du schon gemacht. Du hast die *.c-Datei in ein Archiv gepackt:
So this is required? Downloading a plain, uncompressed C source is not possible?

Jetzt fehlen noch die 2. Datein für dein Freetz-Paket: "Makefile.in", "Config.in", das Verzeichnis "patches" mit dem "Makefile.patch" und einige Änderungen an der Datei "yahooproxy.mk".

IMHO compiling a simple source like this does not really need a seperate makefile.

To be complete:

Config.in:
Code:
config FREETZ_PACKAGE_YAHOOPROXY
	bool "yahooproxy (binary only)"
	default n
	help
		This proxy simply takes the commands sent to it by your mail client, 
		passes them on to Yahoo, and relays them back to your client.
		It all the while looks for your client to issue a "login" command
		so that it can inject the "id" command to unlock IMAP access.

Makefile.in:
Code:
ifeq ($(strip $(FREETZ_PACKAGE_YAHOOPROXY)),y)
PACKAGES+=yahooproxy
endif
 
So this is required? Downloading a plain, uncompressed C source is not possible?
Vielleicht geht es, ist mir aber nicht bekannt. Wenn Du den Qellcode im Archiv, in den dl-Ordner ablegst, wird er vom Freetz-Paket immer dort gefunden. Evtl. kann dir ein Freetz-Entwickler hier mehr sagen bzw. helfen.
IMHO compiling a simple source like this does not really need a seperate makefile.
Ja, geht auch ohne, ist aber IMHO eleganter.
To be complete:

Config.in:
Code:
config FREETZ_PACKAGE_YAHOOPROXY
	bool "yahooproxy (binary only)"
	default n
	help
		This proxy simply takes the commands sent to it by your mail client, 
		passes them on to Yahoo, and relays them back to your client.
		It all the while looks for your client to issue a "login" command
		so that it can inject the "id" command to unlock IMAP access.

Makefile.in:
Code:
ifeq ($(strip $(FREETZ_PACKAGE_YAHOOPROXY)),y)
PACKAGES+=yahooproxy
endif
OK.
 
You're right that Freetz doesn't support the download of a single C-Source. As this is the first time report of such a case, I think it is not worth the changes to support this, as you can create easily an archive containing the file. I also think the author should provide at least a Makefile, even for just one source file, and should create an archive with a version in the name.

You don't have to upload the archive to any site, you can just copy the archive to the dl directory in Freetz, and it will not try to download the file that is already there.
 
I just noticed that they offer a Zip-file for Cygwin. Assuming it contains the same C source, you can use that.

And maybe the author would create a package with a makefile, especially if you send one.
 
Zuletzt bearbeitet:
Good tip, I assumed it was a different source, but it isn't.
 
Unfortunately the .zip file does not contain a folder.
 
Verzeichnis kannst mit dem Freetz-Paket erstellen:
Code:
$(call PKG_INIT_BIN, win)
$(PKG)_SOURCE:=$(pkg)-$($(PKG)_VERSION).zip
$(PKG)_SOURCE_MD5:=aac337c15cda8c08a9d3c11177dccc2a
$(PKG)_SITE:=http://www.ameir.net/files/
$(PKG)_C:=$(SOURCE_DIR)
$(PKG)_DIR:=$(SOURCE_DIR)/$(pkg)
$(PKG)_BINARY:=$(SOURCE_DIR)/$(pkg)/$(pkg)
$(PKG)_TARGET_BINARY:=$($(PKG)_DEST_DIR)/usr/bin/$(pkg)

$(PKG_SOURCE_DOWNLOAD)
$(PKG_UNPACKED)
$(PKG_CONFIGURED_NOP)

$($(PKG)_BINARY): $($(PKG)_DIR)/.configured
		mv $(YAHOOPROXY_C)/yahooproxy.c \
		$(YAHOOPROXY_DIR)/yahooproxy.c 
		rm $(YAHOOPROXY_C)/yahooproxy.exe
		rm $(YAHOOPROXY_C)/cygwin1.dll
		$(SUBMAKE) -C $(YAHOOPROXY_DIR) \
		..........
		..........

$($(PKG)_TARGET_BINARY): $($(PKG)_BINARY)
	$(INSTALL_BINARY_STRIP)

$(pkg):

$(pkg)-precompiled: $($(PKG)_TARGET_BINARY)

$(pkg)-clean:
	-$(SUBMAKE) -C $(YAHOOPROXY_DIR) clean
	 $(RM) $(YAHOOPROXY_DIR)/.configured

$(pkg)-uninstall:
	$(RM) $(YAHOOPROXY_TARGET_BINARY)

$(PKG_FINISH)

EDIT:
Mit dieser Makefile-Datei kannst Du dein binary kompilieren:
Code:
TGT=yahooproxy

CC=
CFLAGS=
LIBS=
ARCH=mipsel-linux

PREFIX = /usr
CONFDIR = /var/mod/etc
BINDIR = /usr/bin

${TGT}: Makefile ${TGT}.c 
	${CC} ${CFLAGS} -D${ARCH} -DPREFIX=\"${PREFIX}\" ${TGT}.c -o ${TGT} ${LIBS}

Code:
:~/myfreetz/freetz4945/freetz-trunk> file packages/yahooproxy-win/root/usr/bin/yahooproxy
packages/yahooproxy-win/root/usr/bin/yahooproxy: ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked (uses shared libs), stripped

So sieht meine ergänzte "yahooproxy.mk"-Datei aus:
Code:
$(call PKG_INIT_BIN, win)
$(PKG)_SOURCE:=$(pkg)-$($(PKG)_VERSION).zip
$(PKG)_SOURCE_MD5:=aac337c15cda8c08a9d3c11177dccc2a
$(PKG)_SITE:=http://www.ameir.net/files/
$(PKG)_C:=$(SOURCE_DIR)
$(PKG)_DIR:=$(SOURCE_DIR)/$(pkg)
$(PKG)_BINARY:=$(SOURCE_DIR)/$(pkg)/$(pkg)
$(PKG)_TARGET_BINARY:=$($(PKG)_DEST_DIR)/usr/bin/$(pkg)

$(PKG_SOURCE_DOWNLOAD)
$(PKG_UNPACKED)
$(PKG_CONFIGURED_NOP)

[COLOR="Red"]$($(PKG)_BINARY): $($(PKG)_DIR)/.configured
		mv $(YAHOOPROXY_C)/yahooproxy.c \
		$(YAHOOPROXY_DIR)/yahooproxy.c 
		cp $(YAHOOPROXY_C)/Makefile \
		$(YAHOOPROXY_DIR)/
		rm $(YAHOOPROXY_C)/yahooproxy.exe
		rm $(YAHOOPROXY_C)/cygwin1.dll
		$(SUBMAKE) -C $(YAHOOPROXY_DIR) \
		CC="$(TARGET_CC)" \
		CFLAGS="$(TARGET_CFLAGS)"[/COLOR]

$($(PKG)_TARGET_BINARY): $($(PKG)_BINARY)
	$(INSTALL_BINARY_STRIP)

$(pkg):

$(pkg)-precompiled: $($(PKG)_TARGET_BINARY)

$(pkg)-clean:
	-$(SUBMAKE) -C $(YAHOOPROXY_DIR) clean
	 $(RM) $(YAHOOPROXY_DIR)/.configured

$(pkg)-uninstall:
	$(RM) $(YAHOOPROXY_TARGET_BINARY)

$(PKG_FINISH)
 
Zuletzt bearbeitet:
Man muß nicht zwangsläufig ein SUBMAKE verwenden, man kann den Compiler auch aus dem anderen Makefile direkt aufrufen.
Und das Beispiel-Makefile übergibt unnötigerweise PREFIX und ARCH, wobei speziell ARCH seltsame Effekte hätte, wenn es verwendet werden würde.
 
Danke für die Korrektur bzw. für den Verbesserungsvorschlag.
 
Works perfectly, thanks.

Attached a complete patch, for if someone wants to use this proxy.
 

Anhänge

  • yahooproxy.0.patch.txt
    2.3 KB · Aufrufe: 2
So ganz verstehe ich den roten Teil oben nicht. Ich würde sogar vermuten, daß DU ihn nicht ausprobiert hast.

Mein Kommentar bezog sich auf diese Zeile im anderen Makefile:
Code:
${CC} ${CFLAGS} -D${ARCH} -DPREFIX=\"${PREFIX}\" ${TGT}.c -o ${TGT} ${LIBS}

Vermutlich ist es doch sinnvoller, ein Archiv mit Pfadnamen zu erstellen.
 
So ganz verstehe ich den roten Teil oben nicht. Ich würde sogar vermuten, daß DU ihn nicht ausprobiert hast.
[...]
Deine Vermutung ist leider falsch.;) I. d. R. poste ich nur Sachen die ich getestet habe. Und das ist hier auch der Fall. Bei mir funktioniert auch der "rote Teil".

EDIT:
Das hat M66B in seinem Patch:
Code:
+$($(PKG)_BINARY): $($(PKG)_DIR)/.configured
+	mv $(YAHOOPROXY_C)/yahooproxy.c \
+	$(YAHOOPROXY_DIR)/yahooproxy.c 
+	rm $(YAHOOPROXY_C)/yahooproxy.exe
+	rm $(YAHOOPROXY_C)/cygwin1.dll
+	$(MAKE_ENV) $(TARGET_CC) \
+	$(TARGET_CFLAGS) $(TARGET_LDFLAGS) \
+	$(YAHOOPROXY_DIR)/yahooproxy.c \
+	-o $(YAHOOPROXY_DIR)/yahooproxy

EDIT 2:
Hier ein "make yahooproxy-precompiled" mit meinem "kranken" Makefile;):
Code:
:~/myfreetz/freetz4945/freetz-trunk> make yahooproxy-precompiled
mkdir -p packages/yahooproxy-win/root
if test -d make/yahooproxy/files; then tar -c -C make/yahooproxy/files --exclude=.svn . | tar -x -C packages/yahooproxy-win ; fi
---> package/yahooproxy: preparing... unzip  -u dl/yahooproxy-win.zip -d source/target-mipsel_uClibc-0.9.29
Archive:  dl/yahooproxy-win.zip
  inflating: source/target-mipsel_uClibc-0.9.29/yahooproxy.exe
  inflating: source/target-mipsel_uClibc-0.9.29/cygwin1.dll
  inflating: source/target-mipsel_uClibc-0.9.29/yahooproxy.c
set -e; shopt -s nullglob; for i in make/yahooproxy/patches/*.patch; do tools/freetz_patch source/target-mipsel_uClibc-0.9.29/yahooproxy $i; done
mv source/target-mipsel_uClibc-0.9.29/yahooproxy.c \
                source/target-mipsel_uClibc-0.9.29/yahooproxy/yahooproxy.c
cp source/target-mipsel_uClibc-0.9.29/Makefile \
                source/target-mipsel_uClibc-0.9.29/yahooproxy/
rm source/target-mipsel_uClibc-0.9.29/yahooproxy.exe
rm source/target-mipsel_uClibc-0.9.29/cygwin1.dll
cmd() { PATH="/home/gm/myfreetz/freetz4945/freetz-trunk/toolchain/target/bin:/home/gm/myfreetz/freetz4945/freetz-trunk/toolchain/kernel/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin" LD_RUN_PATH="/usr/lib/freetz" make -j2  "$@"  || { printf "\n\\033[33m%s\\033[m\n" "ERROR: Build failed.";  exit 1; } };      if [ -e source/.echo_item_start -a ! -e source/.echo_item_build ]; then echo -n "building... "; touch source/.echo_item_build; fi; cmd -C source/target-mipsel_uClibc-0.9.29/yahooproxy \
                CC="/home/gm/myfreetz/freetz4945/freetz-trunk/toolchain/target/bin/mipsel-linux-uclibc-gcc" \
                CFLAGS="-Os -pipe -march=4kc -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64"
building... make[1]: Entering directory `/home/gm/myfreetz/freetz4945/freetz-trunk/source/target-mipsel_uClibc-0.9.29/yahooproxy'
/home/gm/myfreetz/freetz4945/freetz-trunk/toolchain/target/bin/mipsel-linux-uclibc-gcc -Os -pipe -march=4kc -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dmipsel-linux -DPREFIX=\"/usr\" yahooproxy.c -o yahooproxy
<command-line>: warning: missing whitespace after the macro name
make[1]: Leaving directory `/home/gm/myfreetz/freetz4945/freetz-trunk/source/target-mipsel_uClibc-0.9.29/yahooproxy'
mkdir -p packages/yahooproxy-win/root/usr/bin/; cp source/target-mipsel_uClibc-0.9.29/yahooproxy/yahooproxy packages/yahooproxy-win/root/usr/bin/yahooproxy; /home/gm/myfreetz/freetz4945/freetz-trunk/toolchain/target/bin/mipsel-linux-uclibc-strip --remove-section={.comment,.note,.pdr} packages/yahooproxy-win/root/usr/bin/yahooproxy;
done.
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.