Search code examples
makefilegettext

Using make to place message files in correct directory structure


I have an existing project where I am adding gettext support. Unfortunately, due to the project's structure and limitations, I cannot go through the recommended route of changing the project over to automake. Also unfortunately, my make-fu is pretty weak and I'm having troubles implementing rules to build my output archive:

  1. Take all .po files in the msg subdir and run msgfmt on them to produce .mo files (in my target dir)
  2. Put the .po files in the directory structure expected by gettext: (dir)/(locale)/LC_MESSAGES/(domainname).mo

Here's what I have so far

MSGSRC=msg/*.po
MSGOBJ=$(addprefix $(TARGET_BUILD_PATH)/$(target)/,$(MSG_SRC:.po=.mo))

$(TARGET_BUILD_PATH)/$(target)/msg/%.mo: msg/%.po
    msgfmt -c $< -o $@
    # Put in correct place
    mkdir -p $(TARGET_BUILD_PATH)/$(target)/msg/$(*F)/LC_MESSAGES
    cp $@ $(TARGET_BUILD_PATH)/$(target)/msg/$(*F)/LC_MESSAGES/myapp.mo

archive: $(MSGOBJ) (other objs....)
    (make the archive tarball...)

The problem with the existing code is that for some reason $(*F) comes out just * instead of the locale name (the .po files are named en_US.po, etc). It also seems incorrect because the target should be the real target, not the hacky msgfmt and copy I have. The directory structure is important because the makefile is run a few times for different cross-compiles ($(target)) and the output is archived into a tarball for installation on the devices.


Solution

  • I assume you can use GNU make.

    First of all, let make expand the wildcards. This is important for later postprocessing:

    MSGSRC=$(wildcard msg/*.po)
    

    Now you should get lists of file names in MSGSRC and MSGOBJ. Additionally, the make manual marks $(F) as obsolete, and $ (the stem of the name) should contain just the locale. So,

    mkdir -p $(TARGET_BUILD_PATH)/$(target)/msg/$*/LC_MESSAGES
    

    should do the trick just fine, the same for the cp rule.