# The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for # the specific language governing rights and limitations under the License. # # The Original Code is the Python XPCOM language bindings. # # The Initial Developer of the Original Code is ActiveState Tool Corp. # Portions created by ActiveState Tool Corp. are Copyright (C) 2000, 2001 # ActiveState Tool Corp. All Rights Reserved. # # Contributor(s): Trent Mick (original author) # Mark Hammond # # Dumb makefile to build PyXPCOM on linux # # The build is by no means clean. I just kept shoving in compiler and linker # options until it worked. :) # # USAGE: # 1. edit top section as appropriate # 2. build, install, and test PyXPCOM # > make -f makefile.stupid.linux DEBUG=1 # > make -f makefile.stupid.linux DEBUG=1 install # > make -f makefile.stupid.linux DEBUG=1 test # A debug build is suggested (DEBUG=1) by default because a default # mozilla build is a debug build. Exclude the "DEBUG=1" to build for a # release build of mozilla. # #------------------------- # You must edit the variables in this section as appropriate for your machine # The most common edits will just be: # MOZ_SRC, INSTALLDIR, and PYTHON_SRC # =========== START OF SECTION FOR COMMON EDITS ===================== # this will have an "xpcom" subdir on install INSTALLDIR=/usr/local/ActivePython-2.0/lib/python2.0/site-packages PYTHON_SRC=/usr/local/ActivePython-2.0 # =========== START OF SECTION FOR COMMON EDITS ===================== # We expect a "mozilla" directory under this MOZ_SRC=../../../.. MOZCOMPONENTSDIR=$(MOZ_SRC)/mozilla/dist/bin/components MOZINCLUDES=-I$(MOZ_SRC)/mozilla/dist/include -I$(MOZ_SRC)/mozilla/dist/include/nspr MOZLIBDIR=$(MOZ_SRC)/mozilla/dist/lib # this is setup to use the *installed* Python directory structure # - To use the development Python dir structure some changes are # necessary here *and* below (below, because there two lib dir # to include in LDFLAGS for the dev dir structure) PYTHON_SRC=/usr/local/ActivePython-2.0 PYTHONINCLUDES=-I$(PYTHON_SRC)/include/python2.0 PYTHONLIBDIR=$(PYTHON_SRC)/lib/python2.0/config XPIDL=$(MOZ_SRC)/mozilla/dist/bin/xpidl IDLINCLUDES=-I$(MOZ_SRC)/mozilla/dist/idl #------------------------- # You should not need to edit anything beyond this point. # # the main PyXPCOM engine library ENGINE=src/_xpcommodule.so # the PyXPCOM loader LOADER=src/loader/libpyloader.so all:: $(ENGINE) $(LOADER) #---- build the PyXPCOM loader LOADER_CFLAGS=-fpic -fno-rtti -fno-exceptions -Wconversion \ -Wpointer-arith -Wbad-function-cast -Wcast-align -Woverloaded-virtual \ -Wsynth -pedantic -Wno-long-long -pthread -DTRIMMED ifdef DEBUG LOADER_CFLAGS += -DDEBUG endif # NOTE: not sure if using -rpath is the best way to do this LOADER_LDFLAGS=-Xlinker -rpath -Xlinker $(MOZLIBDIR) \ -Xlinker -rpath -Xlinker $(MOZLIBDIR)/components \ -Xlinker -rpath -Xlinker $(PYTHONLIBDIR) \ -L$(MOZLIBDIR) -L$(PYTHONLIBDIR) # NOTE: can't remember if "-shared" is necessary here LOADER_LIBS=-lpython2.0 -ldl -lpthread -lutil -shared -lxpcom $(LOADER): src/loader/pyloader.cpp c++ $(LOADER_CFLAGS) $(MOZINCLUDES) $(PYTHONINCLUDES) \ -c src/loader/pyloader.cpp \ -o src/loader/pyloader.o c++ $(LOADER_CFLAGS) $(LOADER_LDFLAGS) $(LOADER_LIBS) \ -o $(LOADER) \ src/loader/pyloader.o #---- build the PyXPCOM engine ENGINE_CFLAGS=-fpic -fno-rtti -fno-exceptions -Wconversion \ -Wpointer-arith -Wbad-function-cast -Wcast-align -Woverloaded-virtual \ -Wsynth -pedantic -Wno-long-long -pthread -DTRIMMED -nostdlib ifdef DEBUG ENGINE_CFLAGS += -DDEBUG endif # -DXPCOM_EXPORTS XPCOM_SRC_OBJECTS = \ src/ErrorUtils.o \ src/PyGBase.o \ src/PyGModule.o \ src/PyGStub.o \ src/PyGInputStream.o \ src/PyGWeakReference.o \ src/PyIClassInfo.o \ src/PyIComponentManager.o \ src/PyIInputStream.o \ src/PyIEnumerator.o \ src/PyIID.o \ src/PyIInterfaceInfo.o \ src/PyIInterfaceInfoManager.o \ src/PyIServiceManager.o \ src/PyISimpleEnumerator.o \ src/PyISupports.o \ src/Pyxpt_info.o \ src/TypeObject.o \ src/VariantUtils.o \ src/dllmain.o \ src/xpcom.o %.o: %.cpp c++ $(ENGINE_CFLAGS) $(MOZINCLUDES) $(PYTHONINCLUDES) \ -c $< -o $@ # NOTE: not sure if using -rpath is the best way to do this # NOTE: can't remember if "-shared" is necessary here ENGINE_LDFLAGS=-Xlinker -rpath -Xlinker $(MOZLIBDIR) \ -Xlinker -rpath -Xlinker $(MOZLIBDIR)/components \ -Xlinker -rpath -Xlinker $(PYTHONLIBDIR) \ -Xlinker -shared ENGINE_LIBS=-lpython2.0 -ldl -lpthread -lutil -lxpcom \ -lnspr4 -lgtk -lgdk -rdynamic -lgmodule -lglib -lm -lplc4 \ -lpthread -lnsl -lresolv -lm -lc -lgcc $(ENGINE): $(XPCOM_SRC_OBJECTS) c++ $(ENGINE_CFLAGS) $(ENGINE_LDFLAGS) -o $(ENGINE) \ $(XPCOM_SRC_OBJECTS) -L$(MOZLIBDIR) -L$(PYTHONLIBDIR) $(ENGINE_LIBS) #---- install PyXPCOM XPCOM_PACKAGE_FILES = \ __init__.py \ components.py \ file.py \ nsError.py \ register.py \ xpcom_consts.py \ xpt.py \ client/__init__.py \ server/__init__.py \ server/enumerator.py \ server/factory.py \ server/loader.py \ server/module.py \ server/policy.py # this is a cheasy install # - no attention to permissions # - doesn't explicitly use $(XPCOM_PACKAGE_FILES) install:: all $(XPCOM_PACKAGE_FILES) mkdir -p $(INSTALLDIR)/xpcom/client mkdir -p $(INSTALLDIR)/xpcom/server cp -f *.py $(INSTALLDIR)/xpcom cp -f client/*.py $(INSTALLDIR)/xpcom/client cp -f server/*.py $(INSTALLDIR)/xpcom/server cp -f $(ENGINE) $(INSTALLDIR)/xpcom mkdir -p $(MOZCOMPONENTSDIR) cp -f $(LOADER) $(MOZCOMPONENTSDIR) ( \ export PYTHONPATH=$(INSTALLDIR):$(PYTHONPATH) ; \ export MOZILLA_FIVE_HOME=$(MOZ_SRC)/mozilla/dist/bin ; \ export LD_LIBRARY_PATH=$(MOZ_SRC)/mozilla/dist/bin ; \ $(MOZ_SRC)/mozilla/dist/bin/regxpcom \ ) #---- build and run the PyXPCOM test suite all:: test/test_component/py_test_component.xpt test/test_component/py_test_component.xpt: test/test_component/py_test_component.idl $(XPIDL) -m typelib -w $(IDLINCLUDES) -o test/test_component/py_test_component $< install:: mkdir -p $(MOZCOMPONENTSDIR) cp -f test/test_component/py_test_component.xpt $(MOZCOMPONENTSDIR) cp -f test/test_component/py_test_component.py $(MOZCOMPONENTSDIR) ( \ export PYTHONPATH=$(INSTALLDIR):$(PYTHONPATH) ; \ export MOZILLA_FIVE_HOME=$(MOZ_SRC)/mozilla/dist/bin ; \ export LD_LIBRARY_PATH=$(MOZ_SRC)/mozilla/dist/bin ; \ $(MOZ_SRC)/mozilla/dist/bin/regxpcom \ ) test:: install ( \ export PYTHONPATH=$(INSTALLDIR):$(PYTHONPATH) ; \ export MOZILLA_FIVE_HOME=$(MOZ_SRC)/mozilla/dist/bin ; \ export LD_LIBRARY_PATH=$(MOZ_SRC)/mozilla/dist/bin ; \ python test/regrtest.py \ ) runpython: install ( \ export PYTHONPATH=$(INSTALLDIR):$(PYTHONPATH) ; \ export MOZILLA_FIVE_HOME=$(MOZ_SRC)/mozilla/dist/bin ; \ export LD_LIBRARY_PATH=$(MOZ_SRC)/mozilla/dist/bin ; \ python \ ) clean: find . -name "*~" | xargs rm -f find . -name "*.o" | xargs rm -f find . -name "*.pyc" | xargs rm -f find . -name "*.so" | xargs rm -f