Skip to main content

[LINUX] Hiding the source file and Linking the objects file

In order to prepare the exercise for students in RTEMS on Raspberry Pi, I dig into Makefile (which is auto generated by automake) this week.
(The way to build up the example in RTEMS on Raspberry Pi : here)

The perspective of exercise is to let the students adopt our library to design a simpler real-time application.
However, I want to hide the source code of library, but let the framework of makefile still work well.
That is, we have to exclude the data dependency from the auto generated makefile.

Assume we already compile the essential object as the library and place it at Source code directory, i.e., "...../rtems-gpio/testsuites/samples/SEMAPHORE_TEST".
If we open Build directory, i.e., "build-rtems-rpi-gpio/arm-rtems4.11/c/raspberrypi/testsuites/samples/SEMAPHORE_TEST", we can find a Makefile that is generated by using automake with Makefile.am in Source code directory.

As the typical rule in Makefile framework, all the dependencies of object will be denoted like this:

Pibrella.o:\
 ../../../../../../../rtems-gpio/c/src/../../testsuites/samples/SEMAPHORE_TEST/Pibrella.c \
../config.h \
... so on.

However, we cannot directly find this kind of information from Makefile in Build directory.

Lets trace the file by bottom-up (This example is called SEMAPHORE_TEST):

...
SEMAPHORE_TEST$(EXEEXT): $(SEMAPHORE_TEST_OBJECTS) $(SEMAPHORE_TEST_DEPENDENCIES)
        @rm -f GPIO_Pibrella$(EXEEXT)
        $(make-exe) 
...

You can find the same rule here and the dependent files are defined with the object.

...
am_SEMAPHORE_TEST_OBJECTS = init.$(OBJEXT) Pibrella.$(OBJEXT) \
        tasks.$(OBJEXT)
SEMAPHORE_TEST_OBJECTS = $(am_SEMAPHORE_TEST_OBJECTS)

Here OBJEXT is ".o".
...
include ./$(DEPDIR)/Pibrella.Po
include ./$(DEPDIR)/init.Po
include ./$(DEPDIR)/tasks.Po
...
Behind the implicit keyword, .SUFFIXES:, we can find the include line as include ./$(DEPDIR)/Pibrella.Po, which is used to reveal the dependency of Pibrella.o generated by automake.
DEPDIR here is an invisible directory called .desp in Source code directory.

By marking this line, we can exclude the checking of dependent file and keep the assumed object file with the source codes of example.
Therefore, we reach our perspective.

------------BTW, one of my friends ask me that how to enable math library in RTEMS compilation:
For example, it is a question like this:
https://lists.rtems.org/pipermail/users/2006-March/014215.html

Ad-hoc way is to open Makefile.am in the same folder:
LINK_LIBS = $(NXT_LDLIBS) 
add -lm at the end of line.
LINK_LIBS = $(NXT_LDLIBS) -lm

Comments

Popular posts from this blog

RSB+RTEMS 5/6 with QEMU-SMP (ARM realview_pbx_a9_qemu as example)

Since I got a request regarding this blog  written in 2016, summarizing again the complete flow with the latest version of RTEMS could be a good idea. Prepare a suitable workspace according to the adopted operating system on your host ( https://docs.rtems.org/branches/master/user/hosts/index.html ):  sudo apt-get build-dep build-essential gcc-defaults g++ gdb git unzip pax bison flex texinfo unzip python3-dev libpython-dev libncurses5-dev zlib1g-dev Checkout RSB and build: git clone git://git.rtems.org/rtems-source-builder.git rsb change directory to rsb/rtems/ and type ../source-builder/sb-set-builder --prefix=<the path you like to store the built toolchains> <the name of bsp> For example, to use QEMU, I need toolchains for ARM, so: ../source-builder/sb-set-builder --prefix=/home/kh.chen/respository/build/. 6/rtems-arm This will take a while. Please ensure your connection is reliable. Add the built folder into your PATH. For example, you can add one line in ~/.bas...

[ubuntu] Removing the instance/package which is not fully installed from apt-get

When I'm installing g77-3.4 for pgplot, I trivially use dkpg to install it. However, g77-3.4-doc is not able to fully installed. And I stuck for this kind of error due to the broken packages (refer to here ): dpkg: error processing realplayer (--configure/--purge/--remove): (Whatever messages) Errors were encountered while processing: g77-3.4-doc cd /var/lib/dpkg/info sudo rm g77-3.4-doc* sudo dpkg --remove --force-remove-reinstreq g77-3.4-doc Hmm, now apt-get works well again. https://www.youtube.com/watch?v=S9HJ-iAzf3k

[Ubuntu/Windows] nxtOSEK / ticking block of NXT

In Windows 7: http://www.reddit.com/r/FTC/comments/1vvwq9/for_those_who_have_or_have_had_a_clicking_nxt/ I strongly recommend you to read this article, which really saves my life / 300 Euro! The critical point is that Windows 7 will automatically recognize the usb plug-in as bossa program, which is not available to excess as a NXT. All you have to do is to break down your internet and follow the steps in the article. [Quote] Plug in clicking nxt to computer Disable internet connection(very important) Open Device manager Under ports you should see Bossa program port, right click on it uninstall driver, on popup make sure to select delete from system (Don't forget to check the box that deleting all the installed driver) after uninstalling driver plug nxt into another port Because bossa driver is missing it should register as nxt brick Now you can reload Robotc firmware (with offical NXT software or NxTTool whatever) After firware installed reconnect internet Option ...