Sponsored Content
Top Forums Shell Programming and Scripting Question in creating targets in makefile Post 302843986 by bakunin on Friday 16th of August 2013 03:49:29 AM
Old 08-16-2013
You need a generalized rule for how to get from a "source" file to an "object" file. If your source files carry the extension ".src" and your objects the extension ".obj" this would be:

Code:
.src.obj
               <actions here>

Now you only need a special variable which contains only the file name which triggered the rule to use in the action part - and fortunately there is such a thing: "$<". A possible rule would look like:

Code:
COMPILE=/path/to/compiler
FLAGS=-a -b -c
.src.obj
               $(COMPILE) $(FLAGS) $<

If the rule is triggered by the file "foo.src" the command executed would be:

Code:
/path/to/compiler -a -b -c foo.src

You might want to read the man page of the make-utility to learn more about the various special variables you can use. For instance, there is also a variable for the file name that will be the target of the rule: "$@".

C compilers per default write a file "a.out" instead of naming the object like the source file only with the extension replaced by ".obj". You would have to explicitly tell the compiler which name it should use for its output file with the "-o" option if you do not want this default behavior. This is what "$@" is for:

Code:
COMPILE=/path/to/compiler
FLAGS=-a -b -c
.src.obj
               $(COMPILE) $(FLAGS) $< -o $@

I am sure you will be able to adapt this to your needs with careful study of the man page.

I hope this helps.

bakunin
This User Gave Thanks to bakunin For This Post:
 

10 More Discussions You Might Find Interesting

1. UNIX for Advanced & Expert Users

Creating new system Makefile template

I am attempting to set-up a Makefile to use for a new system on a Sun Unix machine. I am new to creating Makefiles. I am trying to start simply by compiling a program. I am getting the following error message but an uncertain what 'Error Code 1' is. Is there a web site with Error Codes... (1 Reply)
Discussion started by: CaptainRo
1 Replies

2. UNIX for Dummies Questions & Answers

Makefile question

I'm trying to do string replacement with a Makefile and this is my scenario: Inside file "fileA", I have "#include<text>" statements and I want to replace it with the text inside a file called "params". I wish to perform this task using Makefiles. I've tried using m4 but that only works if... (1 Reply)
Discussion started by: hc29
1 Replies

3. Programming

Tough makefile question

At my company, we build some stuff using a makefile. While the makefile script is running, a developer may check in a newer version of a source file. The problem is, when we next run the make command, the target file isn't rebuilt, because the date of the target is after the dependency. Any... (1 Reply)
Discussion started by: mbbeaubi
1 Replies

4. UNIX for Dummies Questions & Answers

makefile Q about targets $@

Hi All I need to parse the target something like: ifeq '$@' 'first' echo 1 $@ endif ifeq '$@' 'second' echo 2 $@ endif The thing is to be able compare the target string to any string and then do the commands Thanks a lot ziv (0 Replies)
Discussion started by: zivsegal
0 Replies

5. Shell Programming and Scripting

Makefile question

Hi all, I've a makefile which has this line: @touch $@ I know $@ is for representing the target. But I don't know what's the @ preceding the touch. Can anyone help me? Thanks in advance. (4 Replies)
Discussion started by: mjdousti
4 Replies

6. UNIX for Dummies Questions & Answers

makefile Question

Hello, I'm trying to use the make command with a makefile I've made for an assignment. The professor supplied the code and I've copied it into a new file. I made sure to place the tabs in the correct spaces, however when I try to execute it in UNIX I get: "make: Fatal error in reader:... (5 Replies)
Discussion started by: Shinra1003
5 Replies

7. AIX

makefile question

Hi all, In a makefile I would like to grab the first line of a given parameter file using ‘head' and assign it to a variable, how do I do this? I've got a simple makefile but it does not work? #! /bin/ksh ... .sqc.c: db2prep $*.sqc bindfile if ] DB2_PARM=`/usr/bin/head -1 $*.prm`; fi... (2 Replies)
Discussion started by: apersak
2 Replies

8. UNIX for Advanced & Expert Users

Help in creating a makefile

Hi, I wanted to know whether there is any way to specify in a makefile how to compile sources from a directory directly by giving the directory path name instead of mentioning each and every source file name. Regards, Anil (1 Reply)
Discussion started by: anil_lami
1 Replies

9. UNIX for Advanced & Expert Users

makefile head-scratcher: multiple targets in one go

Hi! I've got a build process where scripts create multiple targets from their sources. But here I'm running into a conceptual problem of GNU make: If one has multiple targets in a dependency, make applies the rules once for every target that is out of sync - which is correct for normal... (3 Replies)
Discussion started by: treczoks
3 Replies

10. Programming

Problem creating a makefile

hello, I'm trying to create a makefile to run multiple c files. I am able to run one c file only with the code I have when I tried to run 2 or more c files I'm not able. here is my code # $Source: /home/hectormasencio/make/Makefile,v $ # $Date: 2012/11/27 11:35:30 $ CC= gcc OBJS= temp.o... (3 Replies)
Discussion started by: Hector M.
3 Replies
CCCONFIG(1p)						User Contributed Perl Documentation					      CCCONFIG(1p)

NAME
ccconfig - Get Convert::Binary::C configuration for a compiler SYNOPSIS
ccconfig options [-- compiler-options] options: -c --cc compiler compiler executable to test default: auto-determined -o --output-file file output filename default: output to stdout -f --output-format format output format default: dumper --basename name basename of the temporary test files default: _t_e_s_t -I --inc-path path manually set compiler include path --preprocess rule compiler rule for preprocessing --compile-obj rule compiler rule for compiling objects --compile-exe rule compiler rule for compiling executables --c-ext ext extension of C source files --pp-ext ext extension of preprocessor output files --obj-ext ext extension of object files --exe-ext ext extension of executable files --nodelete don't delete temporary files --norun don't try to run executables --quiet don't display anything --nostatus don't display status indicator --version print version number --debug debug mode Placeholders allowed in compiler rules: %c C source file %o object file %e executable file %i preprocessor output file | result is written to stdout (only at end of rule) DESCRIPTION
"ccconfig" will try to determine a usable configuration for Convert::Binary::C from testing a compiler executable. It is not necessary that the binaries generated by the compiler can be executed, so "ccconfig" can also be used for cross-compilers. This tool is still experimental, and you should neither rely on its output without checking, nor expect it to work in your environment. OPTIONS
"--cc" compiler This option allows you to explicitly specify a compiler executable. This is especially useful if you don't want to use your system compiler. If this options is not given, "ccconfig" tries to guess a compiler. "--output-file" file Write Convert::Binary::C configuration to the specified file. The default is to write the configuration to "stdout". "--output-format" format Specify the output format of the Convert::Binary::C configuration. The following formats are currently supported: dumper Output a %config hash using Data::Dumper require Output in a format suitable for require The default is "dumper". "--basename" name Allows you to change the base name of the temporary test files. This is used along with the various "-ext" options to build the filenames of C source files, preprocessor output files, object files and executables. "--inc-path" path This option allows you to manually set the include path of the compiler. This is useful if "ccconfig" cannot determine the include path automatically, most probably because it cannot parse the preprocessor output. This option can be specified more than once. "--preprocess" rule Using this option, you can specify a rule that "ccconfig" uses to run the compiler to get preprocessor output. Most compilers write the preprocessor output to standard output when given the "-E" option, i.e. cc -E foo.c will preprocess foo.c to standard output. The corresponding rule for "ccconfig" would be: ccconfig --preprocess='-E %c |' The <%c> will be replaced with the C source filename, and the pipe symbol signals that the result will be written to standard output. The following placeholders can be used in "ccconfig" rules: %c C source file %o object file %e executable file %i preprocessor output file Usually, "ccconfig" tries to figure out the correct rules on its own. "--compile-obj" rule Like "--preprocess", this option allows you to define a rule for how to compile an object file. For most compilers, this rule will be something like ccconfig --compile-obj='-c -o %o %c' "--compile-exe" rule Like "--preprocess", this option allows you to define a rule for how to compile an executable file. For most compilers, this rule will be something like ccconfig --compile-exe='-o %e %c' Note that it is sufficient to specify either "--compile-obj" or "--compile-exe". So if your compiler can only create object files, that's just fine. "--c-ext" This option is used along with "--basename" to build the name of a C source file. This is usually set to ".c". "--pp-ext" This option is used along with "--basename" to build the name of a preprocessor output file. "--obj-ext" This option is used along with "--basename" to build the name of an object file. "--exe-ext" This option is used along with "--basename" to build the name of an executable file. "--nodelete" Don't attempt to delete temporary files that have been created by the compiler. Normally, "ccconfig" will look for all files with the same basename as the temporary test file and delete them. "--norun" You can specify this option if the executables generated by your compiler cannot be run on your machine, i.e. if you have a cross-compiler. However, "ccconfig" will automatically find out that it cannot run the executables. When this option is set, a different set of algorithms is used to determine a couple of configuration settings. These algorithms are all based upon placing a special signature in the object file. They are less reliable that the standard algorithms, so you shouldn't use them unless you have to. "--quiet" Don't display anything except for the final configuration. "--nostatus" Hide the status indicator. Recommended if you want to redirect the script output to a file: ccconfig --nostatus >config.pl 2>ccconfig.log "--version" Writes the program name, version and path to standard output. "--debug" Generate tons of debug output. Don't use unless you know what you're doing. EXAMPLES
Normally, a simple ccconfig without arguments is enough if you want the configuration for your system compiler. While "ccconfig" is running, it will write lots of status information to "stderr". When it's done, it will usually dump a Perl hash table to "stdout" which can be directly used as a configuration for Convert::Binary::C. If you want the configuration for a different compiler, or "ccconfig" cannot determine your system compiler automatically, use ccconfig -c gcc32 if your compiler's name is "gcc32". If you want to pass additional options to the compiler, you can do so after a double-dash on the command line: ccconfig -- -g -DDEBUGGING or ccconfig -c gcc32 -- -ansi -fshort-enums If you'd like to interface with the Perl core, you may find a suitable configuration using something like: ccconfig --cc=`perl -MConfig -e 'print $Config{cc}'` -- `perl -MConfig -e 'print $Config{ccflags}'` COPYRIGHT
Copyright (c) 2002-2011 Marcus Holland-Moritz. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. SEE ALSO
See Convert::Binary::C. perl v5.14.2 2011-11-15 CCCONFIG(1p)
All times are GMT -4. The time now is 12:49 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy