diff options
Diffstat (limited to 'doc')
-rw-r--r-- | doc/FAQ | 247 | ||||
-rw-r--r-- | doc/LICENSE | 129 | ||||
-rw-r--r-- | doc/Makefile | 47 | ||||
-rw-r--r-- | doc/NEWS | 1023 | ||||
-rw-r--r-- | doc/TODO | 229 | ||||
-rw-r--r-- | doc/dep_graph.dot | 16 | ||||
-rw-r--r-- | doc/my_prjs.dot | 51 | ||||
-rw-r--r-- | doc/presentation.tex | 1307 |
8 files changed, 1631 insertions, 1418 deletions
@@ -0,0 +1,247 @@ +---------------------------------------------------------------------- +Q: It looks like you are reimplenting the wheel. There are lots of + alternatives to GNU autoconf, e.g. CMake, scons, waf, + PMK (pre make kit) and others. + +A: mk-configure has different design and goals. Just to note a few: + simplicity for developers, Keep It Small and Simple, STOP CODE + GENERATION!, bmake is magic enough, using POSIX shell and POSIX for + implementing basic checks, and some others. If you like these + principles maybe you'll find mk-configure interesting. In this case + try to use it and help me to improve it. Any kind of feedback is + welcome, I don't ask you to send me patches ;-) + Otherwise just ignore it, why bother. + +---------------------------------------------------------------------- +Q: Using POSIX shell and POSIX utils for implementing a build system + sounds terrible to me. Why not to use more powerful languages like + Perl, Python, Ruby and others? + +A: Python, Ruby and Perl are very big. I don't want to depend on such + a big tools. I also don't like when backward compatibility is + broken with new releases of program language. Finally I dislike + Perl and Python for their stupid syntax. Ruby is much better but it + is also very big and the language is not very stable. + +---------------------------------------------------------------------- +Q: Perl/Python/Ruby are available on almost every OS that ever existed + even on Windows and Symbian. Why you limit mk-configure to POSIX + compatible operating systems? + +A: First, I don't use Windows and don't care about it. Second, if you + want to write software both for UNIX-like OSes and Windows there + are no problems. You can use Interix, Cygwin or any other POSIX + subsystem for Windows to build your software. By the way, + cross-compilation is one of my priorities. So, there is no problem + in cross-compiling your software for embedded platforms, Windows or + any other OS your software supports. + +---------------------------------------------------------------------- +Q: You say that portability is one of the main goal of your + mk-configure (build automation software MUST be portable. Right?). + At the same time you say you use POSIX shell and POSIX tools. + My experience says me that it is just not possible to write + something REALLY portable in shell/awk/sed etc. + +A: I know very well how broken POSIX tools may be on some OSes and + hardware platforms. At the moment mk-configure supports the + following platforms: NetBSD, Linux, FreeBSD, DragonFlyBSD, Darwin, + HP-UX, Tru64, QNX, OpenBSD, Interix, Cygwin, MirOS BSD and Solaris. + If you find a bug please let me know. Also note that + mk-configure has lots of regression tests. + I don't make releases without testing on all platforms + available to me. + +---------------------------------------------------------------------- +Q: You just didn't read autobook and don't know how to use GNU + autotools properly. Your criticism is inadequate. First, read the + documentation! + +A: The question is not about me personally. Try to maintain software + packages in BSD/Linux/... distributions and you'll understand that + LOTS of FOSS developers actually do not understand how to use GNU + autotools properly. I believe this is because autotools's + complexity has grown beyond all reasonable levels. + +---------------------------------------------------------------------- +Q: bmake? What is it? Is it for NetBSD only? + +A: bmake is a portable version of NetBSD make that supports at least + the following operating systems and POSIX environments (besides + NetBSD of course): FreeBSD, DragonFlyBSD, OpenBSD, Linux, Solaris, + AIX, HP-UX, QNX, A/UX, OSF/1, Darwin, Interix, UnixWare and IRIX. + +---------------------------------------------------------------------- +Q: NetBSD make? Then why not to support FreeBSD/OpenBSD makes? + +A: OpenBSD and FreeBSD make(1)s are different and NetBSD make + is more powerful. More over, NetBSD and Free/OpenBSD make(1)s are + incompatible in some aspects. + +---------------------------------------------------------------------- +Q: Learning yet another make doesn't look like a good idea to me. + Nobody will use your mk-configure because it requires learning + bmake. + +A: First, bmake is easy. Learning it doesn't require too much time. + bmake is MUCH simplier than e.g. Python (see scons). I also + assume that every UNIX programmer knows the basic make + concepts. Second, software building rules are usually rather simple + and therefore you need not be an expert in bmake for writing Makefiles. + If building rules for your project are extremely complex, maybe the + problem is with your project, try to simplify it ;-) + Moreover, mk-configure provides several examples in + examples/ subdirectory. I hope they simplify learning mk-configure + significantly. + +---------------------------------------------------------------------- +Q: Yet another build automation software makes a packager's life + harder. + +A: Not a big problem. First, packagers are specialists. They should + learn new things every time ;-) . Adding support for + mk-configure into your packaging system should not be a problem. + Have a look at pkgsrc (www.pkgsrc.org) for examples. Makefiles + for projects based on GNU autotools require the line + + GNU_CONFIGURE = yes + + Projects based on CMake need the following line + + USE_CMAKE = yes + + Projects using mk-files require + + USE_BSD_MAKEFILE = yes + + I think this is easy. If your packaging system doesn't allow the + similar functionality, improve it ;-) + +---------------------------------------------------------------------- +Q: Why NetBSD bmake was chosen? Why not "standard" GNU make? Today + Linux has MUCH more developers than FreeBSD/OpenBSD/Solaris and of + course NetBSD. Most programmers using Linux use GNU make. Without + support of Linux developers your project is dead. + +A: NetBSD make was chosen for the following reasons: 1) when I started + mk-configure I could not find good analogs for mk-files written for + GNU make; 2) in my view bmake is simpler and more convenient for use + than GNU make; 3) I hate gmake's foreach/eval/call construct, bmake's + .for/.endfor is MUCH more convenient and easier to use; 4) gmake + starts finding includes starting from CWD, this is terrible, bmake + starts searching for "includes" starting from the including + makefile's directory. Note that mk-configure and mk-files widely use + the .for/.endfor construct. + + Theoretically it is possible to implement a full analog for + mk-configure based on GNU make instead of bmake but I have no + time to do that. If you want to, let me know. + +---------------------------------------------------------------------- +Q: It's time to bury ALL make-like programs. + Use modern make replacements, Luke. + +A: It's true that make-like programs have some limitations. + But none of them seem critical to me. + I'm quite happy with traditional makes (NetBSD make and GNU make). + +---------------------------------------------------------------------- +Q: You propose setting build options through environment and + bmake's options instead of ./configure --option=xxx. + Are you serious? + +A: Yes, I don't see significant difference between setting paths and + build options via --options and command line arguments and + environment. The only thing lost is that autoconf's ./configure + checks for correctness of the given options but I don't think this + is a significant advantage. On the other hand using environment + variables for setting build options has its own advantages for + the development. You can set them ONCE in a shell session and + that's enough. Alternatively (and even better) you can add + + .sinclude "my_local_settings.mk" + + to Makefile and write your settings down to that file. Then + your local build options will take effect every time you run + mkcmake. Easy? + + If you don't like .sinclude you can use + + bmake -f my_local_settings.mk -f Makefile + + command. Interactive shell's aliases and functions might help to make + things even easier. + +---------------------------------------------------------------------- +Q: It's known that libxxx has different places in different Linux + distributions. Can mk-configure find it automatically? + +A: No. Software build tools MUST NOT have an artificial + intelligence inside. If you need libxxx tell mk-configure correct + CPPFLAGS (-I/headers/here) and LDFLAGS (-L/libraries/here). + This is how it works. mk-configure will not search for includes + in /usr/local, /opt/sfw or anywhere unless you ask it to do so + explicitely. + +---------------------------------------------------------------------- +Q: As far as I can see your mk-configure doesn't support ALL features + supported by GNU autotools and some other competitors. + +A: If you see this tell me what type of functionality you are talking + about. If I find it helpful I'll implement it in future + releases of mk-configure. + +---------------------------------------------------------------------- +Q: How about GUI for "configuration" stage? + +A: Most often today's users use software from their system in a + prebuilt form. I don't think software packagers need a GUI. On the + other hand, if you need a GUI, nothing prevents you from creating it. + +---------------------------------------------------------------------- +Q: GNU autotools provides two-phase project builds and this is a good + idea. mk-configure lacks support for it. + +A: I personally don't like two-phase ideology. I see one phase + "build the software taking into account my platform's features". + If you want to check for errors first, run + + bmake errorcheck + +---------------------------------------------------------------------- +Q: Does mk-configure support caching? + +A: If you mean caching of the platform features, my answer is YES. + Look at _mkc_* files and documentation for MKC_CACHEDIR variable. + If you mean caching of object files, then NO. This is not + mk-configure's task. For this use distcc(1) or similar tools. + +---------------------------------------------------------------------- +Q: mk-configure lacks support for Qt/KDE etc. + +A: Software is developed step-by-step. If you need something, let me + know. I'll implement missing features in future releases of + mk-configure. + +---------------------------------------------------------------------- +Q: mk-configure lacks support for my favourite + programming language XXX. + +A: First, let me know about it. Second, nobody prevents you from + creating rules for your language directly in Makefile or in your + own (local to your project) include files. + +---------------------------------------------------------------------- +Q: How about integration of mk-configure to Eclipse or... + +A: I don't use such IDEs but I agree it whould be nice to have such + support. + +---------------------------------------------------------------------- +Q: It looks like mk-configure is suitable for small-sized projects + but is not ready for huge ones. + +A: Suppose you are right. How about the fact that 99% of all FOSS + projects are small or medium in size? ;-) + +---------------------------------------------------------------------- diff --git a/doc/LICENSE b/doc/LICENSE new file mode 100644 index 0000000..1a914f1 --- /dev/null +++ b/doc/LICENSE @@ -0,0 +1,129 @@ +Different parts of mk-configure have different copyright holders. +All used licences are listed here. +See individual files for details. + +###################################################################### + +Copyright (c) 2009-2013 by Aleksey Cheusov + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND +CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +###################################################################### + +Copyright (c) 1988, 1989, 1993 + The Regents of the University of California. All rights reserved. +Copyright (c) 1988, 1989 by Adam de Boor +Copyright (c) 1989 by Berkeley Softworks + + +This code is derived from software contributed to Berkeley +by Adam de Boor. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +###################################################################### + +Copyright (c) 1994-2009 The NetBSD Foundation, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND +CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +###################################################################### + +Copyright 1991 by the Massachusetts Institute of Technology +Copyright 2013 by Aleksey Cheusov <vle@gmx.net> + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of M.I.T. not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. M.I.T. makes no +representations about the suitability of this software for any +purpose. It is provided "as is" without express or implied warranty. + +###################################################################### + +File examples/hello_strlcpy/strlcpy.c is licensed as follows: + +Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE +FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/doc/Makefile b/doc/Makefile index 5f8efb0..2295297 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,45 +1,4 @@ -################################################## +FILES = ../README NEWS TODO LICENSE FAQ +FILESDIR = ${DOCDIR} -all : presentation.pdf myprojects.pdf - -.PHONY : pdf dvi rtf -pdf : presentation.pdf -ps : presentation.ps -dvi : presentation.dvi - -.SUFFIXES: .ps .eps .pdf .dvi .tex .dot - -presentation.ps presentation.pdf presentation.dvi: my_prjs.eps dep_graph.eps - -.ps.pdf: - ps2pdf "$<" "$@" - -#.tex.pdf: -# pdflatex "$<" && pdflatex "$<" - -.dot.eps: - dot -Tps ${.IMPSRC} > ${.TARGET} - -.dvi.ps: - dvips $< - -.tex.dvi: - latex "${.IMPSRC}" && latex "${.IMPSRC}" - -.gz: - gzip ${.IMPSRC} - -GARBAGE= *.dvi *.aux *.vrb *.toc *.snm *.log *.nav *.out *.eps *.ps -CLEANFILES+= ${GARBAGE} *.pdf *.ps myprojects.tex - -.PHONY: clean-garbage -clean-garbage: - rm -f ${GARBAGE} - -################################################## -myprojects.tex : presentation.tex - awk '/^%%%begin-myprojects/, /^%%%end-myprojects/' \ - ${.ALLSRC} > ${.TARGET} -myprojects.ps myprojects.pdf myprojects.dvi: my_prjs.eps - -.include <mkc.files.mk> +.include <mkc.mk> diff --git a/doc/NEWS b/doc/NEWS new file mode 100644 index 0000000..43a0f4a --- /dev/null +++ b/doc/NEWS @@ -0,0 +1,1023 @@ +====================================================================== +Version 0.25.0, by Aleksey Cheusov, Wed, 1 Jan 2014 19:28:55 +0300 + + Build infrastructure for mk-c itself was completely reimplemented. + Now it looks much better and is more flexible for further extensions. + + NetBSD version of mkdep(1), traditional BSD mkdep(1) or + makedepend(1) is needed at build time. + + LDCOMPILER defaults to "yes". + + Variable TARGETS is now visible to users and is documented. It + contains all recursive targets and may be used for adding user's + functionality to mk-c. + + FIX: Parallel installation ("mkcmake install -jN") now works + correctly. "installdirs" is activated before "install". Report by + Michael Crogan. + + During build object directories are created automatically by default + when MAKEOBJDIR or MAKEOBJDIRPREFIX are set. New recursive target + "obj" and variable MKOBJDIRS were introduced. + Report by Michael Crogan. + + New variable MKRELOBJDIR was introduced. With its help one can + create object directories relative to top-level object directory + (like MAKEOBJDIRPREFIX but without top-level ${.CURDIR} in paths). + Thanks to Michael Crogan. + + target "depend": + - FIX. Original implementation relied on NetBSD version of + mkdep(1). So, it didn't work on Linux, FreeBSD and others with + original BSD mkdep(1). Type of mkdep(1) is detected at + mk-configure build time. Report by Michael Crogan. + + New variables LN, LN_S, MKDIR, RM, CLEANFILES_CMD, CLEANDIRS_CMD, + UNINSTALL, MAKEDEPEND, OBJTOP, CC_PREFIX, CXX_PREFIX were + introduced. + + New variable NODEPS was introduced. With its help one can cut off + the dependency graph for particular targets. + + New variable BMAKE_REQD was introduced. + + New variable SRCTOP was introduced. With its help + "mkcmake -C subdir target" may work just like "mkcmake target-subdir". + + New variables CFLAGS.dflt.${CC_TYPE} and CXXFLAGS.dflt.${CXX_TYPE} + were introduced. They default to -Qunused-arguments + for clang and clang++. + + mkc.init.mk can be invoked by users directly for setting all + required variables and further checks (CC_TYPE, LD_TYPE, OPSYS etc.). + + mkc_imp.links.mk: + - This module was reimplemented from scratch. + Bug with parallel installation (LINKS and MLINKS) was fixed. + + mkc.minitest.mk: + - new variable TEST_PREREQS was introduced. + + mkc_imp.inc.mk: fix for ${INCS} installation problem happened when + headers are built in ${.OBJDIR}. Report by Jan Smydke. + + mkc_imp.info.mk: + - fix for MKINSTALL=no. "installdirs" unexpectedly created target + directories. + + mkc.configure.mk: + - fix issue with MKC_CHECK_CUSTOM when ${.OBJDIR} != ${.CURDIR} + - MKC_CHECK_PROGS: PROG.<prog> is set even if full path was + specified. In addition existence and executability of the + specified file is always checked. + - fix for MKC_SOURCE_FUNCLIBS. Not all objects were cleaned + correctly by target "clean". Now objects are added to CLEANFILES + unconditionally. + - negative results for MKC_REQUIRE_* are not cached. This gives + users ability to fix the problem by changing the environment + and try again. + - MKC_CHECK_BUILTINS. Additional builtin checks were added: + "prog_mkdep" and "prog_nbmkdep" for original BSD mkdep(1) and + NetBSD version of mkdep(1) respectively. + + mkc_imp.intexts.mk fixes: + - Targets "clean" and "cleandir" do not fail anymore if INTEXTS_REPLS + contains empty variables. + - Target "all" works correctly if INFILES or INSCRIPTS contain + files with directories. + + mkc.sub{dir,prj}.mk: + - ${MAKEFLAGS} is passed to recursive ${MAKE}s. + - {nodeps-,subdir-,}dir:T are also targets, that is, one can also + use the last component of subdirectory as_a_part_of/as_a_whole + target. If you want to disable this, set SHORTPRJNAME to "no". + + mkc_imp.subdir.mk was reimplemented using mkc_imp.subprj.mk + + mkc_imp.dep.mk: + - documentation for this module was added. + - support for SHRTOUT=yes + - new variable DPSRCS was introduced + - MKDEP_SUFFIXES also contains .os and .op. Report by Michael Crogan. + - Target "clean" does not remove .depend and .d files. + Target "cleandir" does. NetBSD mk files work the same way. + Report by Michael Crogan. + + MKPIE/SHLIB_*: + - s/-KPIC/-xcode=pic32/ for SunStudio compilers + + MKSSP=yes: + - Support for IBM XL Compiler was added (not tested due to lack of such iron) + - Support for Intel C/C++ Compiler was added + + Documentation fixes, updates and improvements. A lot of new + examples/. A lot of new regression tests. + + Tools: + Long option --help was removed from all utilities + - mkc_install: + - fix for problem with parallel "installdirs" (race condition). + - Options -t and -b were removed. + - mkc_check_prog: option -i is documented in man page + - mkc_check_compiler: workarounds for buggy SunStudio C++ + compiler ("CC -E -" exits with error). + + All test are run with MKCATPAGES=no by default. + + myprojects.pdf: pipestatus also uses mk-configure. + +====================================================================== +Version 0.24.0, by Aleksey Cheusov, Fri, 8 Mar 2013 13:18:00 +0300 + + mkc.sub{dir,prj}.mk: + - support for subprojects containing / symbol was added. In + OBJDIR_<dir> variable slashes are replaced with underlines. + In addition OBJDIR_<dir:T> variable is set. + - now also run the target "errorcheck" + - now work correctly with non-empty MAKEOBJDIR + and MAKEOBJDIRPREFIX. + + Minor improvements in examples/*/linkme.mk + + DPLIBS is deprecated, use LDADD instead. + + ${MKC_SOURCE_FUNCLIBS}.o is added to CLEANFILES if it is set. + + Minor fixes in mkc_imp.lua.mk (LUA_MODULES vs. LUA_LMODULES). + + Some improvements and fixes in man page and FAQ. + Thanks to Jeremy Reed, Min Sik Kim and Jan Smydke. + +====================================================================== +Version 0.23.0, by Aleksey Cheusov, Sun, 22 Jul 2012 14:06:06 +0300 + + mkc.subprj.mk: + - Support for "virtual" subproject was added. Subprojects listed + in SUBPRJ and SUBPRJS_DFLT are not necessarily associated with + a subdirectory. See examples/hello_superfs for example. + Virtual subproject is a way to group several subprojects into + new one. + + New variables were introduced: COPTS_<proj> OBJCOPTS_<proj> + LDADD_<proj> LDFLAGS_<proj> CPPFLAGS_<proj> CXXFLAGS_<proj>. + See the manual page for details. + + Fix: OBJDIR_<subdir> variables now always contain full paths. + + Fix in mkc_which(1). Now it differs directories and regular files. + + Minor fixes in regression tests for EXPORT_SYMBOLS. + + mkc.lib.mk: + - SHLIB_MINOR unconditionally defaults to 0 + + More slides in .pdf presentation: + - cross-compilation + - EXPORT_SYMBOLS + + Fixes for Pascal support + + Minor fixes in the man page + +====================================================================== +Version 0.22.0, by Aleksey Cheusov, Fri, 9 Mar 2012 20:26:34 +0300 + + Improvements in cross-compilation. The following variables were + introduced: TOOLDIR, SYSROOT, TOOLCHAIN_PREFIX and + MACHINE_GNU_PLATFORM. + + PROGS variable was introduced (sf.net bug #3445658). + + Support for Lua submodules was added (e.g. net.socket.lua -> + net/socket.lua). New variable LUA_MODULES was introduced for this + purpose. + + MKPIE (Position Independent Executables), USE_SSP (Stack Smashing + Protection), USE_FORT and USE_RELRO variables were introduced for + security reasons. + + Variable OBJDIR_<dir> was introduced. + + mkc.subdir.mk and mkc.subprj.mk: Commands associated with targets + "all", "install", "clean", "cleandir", "depend", "test", + "installdirs", "uninstall", "errorcheck" and "filelist" in Makefile + override the standard behaviour. + + MKC_REQUIRE_HEADERS, MKC_REQUIRE_DEFINES, MKC_REQUIRE_TYPES, + MKC_REQUIRE_VARS, MKC_REQUIRE_MEMBERS, MKC_REQUIRE_FUNCS<n> and + MKC_REQUIRE_CUSTOM do not change CFLAGS. + + mkc.subdir.mk and mkc.subprj.mk: "cleandir" target takes into + account CLEANFILES, CLEANDIRS, DISTCLEANFILES and DISTCLEANDIRS + variables (removes files). + + PCNAME.<lib> variable was introduced in mkc_imp.pkg-config.mk, this + is a map from library name to pcname (.pc). + + Improvements for SHRTOUT. + + New variable OBJCOPY was introduced. + + Update of the presentation. + + Fix in manual page (sf.net bug #3441610). + + New regression tests (examples). + +====================================================================== +Version 0.21.2, by Aleksey Cheusov, Sat, 22 Oct 2011 01:50:05 +0300 + + mkc_check_compiler has been reimplemented. This fixes problems + on system with /bin/sh == bash (affected versions: 0.21.1) + and makes it drammatically faster. + +====================================================================== +Version 0.21.1, by Aleksey Cheusov, Tue, 13 Sep 2011 11:28:26 +0300 + + Target "errorcheck" ("configure") cannot work in parallel. + + Fix bug appeared in parallel builds (make -j). + Thanks to Alexander Nasonov. + + Support for IRIX64 and Haiku was implemented. + + PDF presentation update + + Minor clean-ups + +====================================================================== +Version 0.21.0, by Aleksey Cheusov, Sun, 24 Oct 2010 17:47:19 +0300 + + Support for clang compiler was implemented. + + Documentation and presentation were updated. There are new projects + using mk-configure. + + mkc_install is always used for installing mk-configure. + This simplifies an installation process on non-BSD platforms. + + WARNS variable: support for icc was added. + + New variable LEXLIB library responsible for -ll/-lfl was introduced. + See examples/hello_calc2. + + mkc_check_compiler: in order to differentiate icc from gcc, a check + for Intel C/C++ compiler is run first. + + New target "filelist" that outputs a list of files for the whole + project was introduced. + + Makefile: mk-configure's mk files are unconditionally installed to + its own directory in order to avoid potential conflicts with + system-wide sys.mk on BSD platforms. + + mkc.configure.mk: HAVE_FUNCLIB.main is always set to 1. + mkc_check_funclibs is not run for checking presense of function + "main" in libc. + + New variable MKCHECKS was introduced. + + Useless rule ".sh:" was removed. + +====================================================================== +Version 0.20.0, by Aleksey Cheusov, Sun, 19 Sep 2010 21:46:25 +0300 + + New variable PROJECTNAME, see the manual page. + + New variable EXPORT_DYNAMIC for making all symbols in executable + visible to linked or dlopen'ed libraries. It is supported on *BSD, + Linux, SunOS, QNX, Interix, OSF1, HP-UX. + + New variable CFLAGS.pic. See the manual page. + + EXPORT_SYMBOLS: On systems using GNU ld, i.e. *BSD, Linux, QNX + etc. 'ld --version-script' is used in order to specify a list of + exported symbols instead of --retain-symbols-file + + Lua support: + - Lua support didn't work properly if only one of LUA_LMODULES or + LUA_CMODULE were specified. Now it is fixed. + - New regression test examples/hello_lua2. + - Force building Lua modules with .so extension. + + Darwin: + - support for EXPORT_SYMBOLS was added + - DLLs (MKDLL=yes) are built as bundles and have .bundle extension + + /usr/bin/install is used as INSTALL only on *BSD platforms. On all + others mkc_install is used. + + Interix: + - 775:664 permissions are used only for +Administrator user. + - "installdirs" target creates directories with 775 permission if + needed. + + OSF1: + - better handling the so_location files. + + mkc_imp.arch.mk: + - PROJECTNAME variable is used for creating archives and .deb + package. + +====================================================================== +Version 0.19.0, by Aleksey Cheusov, Fri, 3 Sep 2010 23:19:44 +0300 + + FIX: LPREFIX, YPREFIX and YHEADER now works as + documented. Regression test for them is added. + + As of this release target "install" creates target directories by + default, i.e. it envokes target "installdirs" before installing + files. For disabling this behaviour, you may set MKINSTALLDIRS + variable to "no". + + mkc.lib.mk: + - New variable EXPORT_SYMBOLS for exporting (in shared object + library) only specified symbols. At the moment the following + platforms support this: Solaris and those using GNU ld, + that is *BSD and Linux. + - "ld -h" is enabled on Solaris. + + mkc.subdir.mk and mkc.subprj.mk: + - Two new variables: EXPORT_VARNAMES and NOEXPORT_VARNAMES for + exporting variables before building subprojects. By default + MKC_CACHEDIR is exported. As a result _mkc_* cache files will + be placed in one directory for all subprojects. + - New variable NOSUBDIR for excluding specified subprojects from + build. Useful side effect: by using this variable you may + disable some regression tests while running "bmake test". + - Makefile.rec file if present is included by ALL subprojects + recursively. See tests/rec_makefiles. + + mkc.subprj.mk: + - New target subdir-<trg>-<subdir>, synonym for + nodeps-<trg>-<subdir>. + + mkc.configure.mk: + - MKC_CHECK_PROGS: mkc_check_progs is not called if path to + program is absolute. + + mk-configure.7 shows in <> typical place where variables shall be used. + + On Solaris LD=/usr/ccs/bin/ld by default. + On OSF1 LD=/usr/bin/ld by default. + On QNX mkc_install is used as install program by default. + + mkc_check_custom: + - FIXED: ambiguous arguments of command "test" (seen on QNX) + + regression tests: + - New test examples/hello_plugins replacing + examples/hello_dlopen and examples/hello_dll + - New test examples/hello_calc + +====================================================================== +Version 0.18.0, by Aleksey Cheusov, Tue, 27 Jul 2010 21:06:56 +0300 + + Several new variables are introduced: + - LUA_LMODDIR and LUA_CMODDIR - installation directories + for Lua modules written in Lua and C. + - MKC_VERSION is now documented. + - MLINKS now works just like in NetBSD. + - CFLAGS.warns.<cctype>.<warn-level> and + CXXFLAGS.warns.<cctype>.<warn-level> are now documented. + Feel free to set them in sys.mk before installation. + - WARNERR for forcing warnings to be reported as errors. + + New targets are introduced: bin_tar, bin_targz, bin_tarbz2, + bin_zip and bin_deb for creating archive files or .deb + package containing an installation image (Ex: + examples/hello_files). This also introduces new variables: TAR, + GZIP, BZIP2 and ZIP. + + Documentation: + - Just a few notes about cross-compilation in mk-configure.7 + - New slides, fixes and improvements in doc/presentation.pdf + - README: feel free to edit sys.mk before installation + - README: a few notes about tools used for development. + + Support for POD (Plain Old Documentation) is added + (.pod.1, ..., .pod.9 and .pod.html suffix rules). + New variables for this: POD2MAN, POD2MAN_FLAGS, POD2HTML + and POD2HTML_FLAGS. Ex: examples/hello_xxzip + + ../Makefile.inc is included automatically if exists just like + in NetBSD. Ex: hello_superfs. + + .ORDER: installdirs install. This should fix -j<N> problem. + Thanks to FreeBSD buys, + swell.k at gmail.com and Mikolaj Golub + + WARNS: add support for HP-UX C/C++ + + all:${FILES} ${MAN} etc. for the case when FILES are generated. + Thanks to Jan Smydke. + + New examples (regression tests): hello_superfs, hello_xxzip. + +====================================================================== +Version 0.17.0, by Aleksey Cheusov, Tue, 22 Jun 2010 23:44:08 +0300 + + mkc_imp.pkg-config.mk: + - FIXED: double applying -L, -l and -I options got from pkg-config. + Solution: .unset PKG_CONFIG_DEPS + - Additional checks for INSTALL_{C,L}MOD pkg-config variables, + they must be defined. + + CC_TYPE, CXX_TYPE and LD_TYPE variables are a part of mk-c's API, + now they are documented. + + mkcmake: + - MKC_BMAKE environment variable is introduced. See mkcmake.1 + + Documentation for /etc/mk.conf, @sysconfdir@/mk.conf and MAKECONF. + + doc/presentation.pdf: New slides and updates + + FAQ: updates + + mkc_imp.lua.mk: + - Check for lua.h header if other checks succeeded. + + mkc_imp.lib.mk: + - MKDLL is also case-insensitive. + + Makefile: + - make shipped with NetBSD-5 does not have option -C, + so I remove it. + +====================================================================== +Version 0.16.0, by Aleksey Cheusov, Sat, 12 Jun 2010 15:06:10 +0300 + + Support for Lua programming language. See documentation for + mkc_imp.lua.mk in mk-configure(7). + + mkc.pkg-config.mk: + - Significant improvements! For details see + mk-configure(7) manual page and examples/hello_glib2 example. + New supported variables: PKG_CONFIG.exists.<lib>, PKG_CONFIG_VARS.<lib> + and PKG_CONFIG.var.<lib>.<var>. + - becomes internal include file and therefore + renamed to mkc_imp.pkg-config.mk. Symlink mkc.pkg-config.mk is + provided for backward compatibility. mkc_imp.pkg-config.mk is + included by mkc.prog.mk and mkc.lib.mk. + + mkc.intexts.mk: + - becomes internal include file and therefore + renamed to mkc_imp.intexts.mk. + Symlink mkc.intexts.mk is provided for backward compatibility. + It is included from mkc.prog.mk, mkc.lib.mk and mkc.files.mk. + - New variable INTEXTS_REPLS. See mk-configure(7). + + mkc.lib.mk: + - includes mkc_imp.intexts.mk + - supports SCRIPTS* variables (includes newly created mkc_imp.scripts.mk) + - New variable MKDLL for creating dinamically loaded libraries (<lib>.so). + + mkc_imp.subprj.mk: + - New variable SUBPRJ_DFLT. See mk-configure(7). + + mkc.*.mk try to open ${MAKECONF}, @sysconfdir@/mk.conf and /etc/mk.conf. + This is now documented. + + mk-configure.7 is reorganized. Several internal include files + document their own variables. Further improvements of man page are + needed. + + All boolean variables becomes case-insensitive. + That is "no", "No", "NO" and "nO" are equal. + The same for "yes", "Yes"... + + mkc_check_custom(1): + - New options: -p, -n, -m and -s. + + Minor fixes and clean-ups in .mk files, tools and regression tests. + + New regression tests and examples. + +====================================================================== +Version 0.15.1, by Aleksey Cheusov, Fri, 28 May 2010 22:39:36 +0300 + + FIX: in version 0.15.0 mkc.subprjs.mk was added, but it was not + installed because I forgot to add it to Makefile. Now it is + installed just like all other *.mk files. + + FIX: 'all : errorcheck' is not for bsd.subdir.mk and bsd.subprj.mk + + mkc.subprjs.mk has been renamed to mkc.subprj.mk. + mkc.subprjs.mk is installed as a symlink. + +====================================================================== +Version 0.15.0, by Aleksey Cheusov, Tue, 25 May 2010 22:52:28 +0300 + + New presentation for mk-configure is in doc/ subdirectory. + + New top-level include file "mkc.subprjs.mk", more powerful + replacement for mkc.subdir.mk. It handles subprojects organized as a + dependency graph. + + New variables are added: MKPICLIB, MKSHLIB, MKSTATICLIB and + MKPROFILELIB for building PIC, shared, static and profile libraries. + See mk-configure.7 for details. + + MKPIC, MKPROFILE and MKPICINSTALL variables are removed. Use + MKPICLIB, MKSHLIB, MKPROFILELIB and MKINSTALL variables instead. + + Implementation for variable "WARNS" (currently only for gcc). + + New variable "SHRTOUT". If it is not "no", shortened formatted + messages are output about compiling, linking etc. + + Manual page for mkcmake(1). + + Target "depend" is added for generating .depend file. + + Minor fixes in mkc_check_funclib. + + Support for Cygwin is added (no support for shared libraries yet). + + Clean-ups in target "clean". + + More regression tests and examples. + + Minor fix in mkc_imp.subdir.mk: do not run "installdirs" if MKINSTALL=no. + + Internal target "error-check" is renamed to "errorcheck". + +====================================================================== +Version 0.14.0, by Aleksey Cheusov, Sun, 31 Jan 2010 16:37:21 +0200 + + Support for OSF1. Tested on Tru64-5.1/alpha with gcc and DEC C + compiler. + + Support for HP-UX. Tested on HP-UX-11.0/hppa with gcc. + + Support for DragonFlyBSD. Tested on DragonFlyBSD-2.4.1/x86 with gcc. + + Support for MirOS BSD. Tested on MirBSD-10/x86 with gcc. + + SHLIBMODE variable is introduced which sets a shared library mode. + + FIX: mkc.subdir.mk now takes into account MKINSTALL variable. + Thanks to Mikolaj Golub for pointing out. + + FIX: targets "installdirs" and "uninstall" now takes into account + MKINSTALL variable. + + fix in mkc.minitest.mk: HP-UX's diff doesn't have -u flag, so I + remove it. + + fix in mkc_imp.platform.sys.mk: CC/CXX type should be detected AFTER + setting CC/CXX variables. + + mkc_check_compiler: + - support for DEC C compiler (OSF1/Tru64) + - minor fixes. + + More regression tests. + +====================================================================== +Version 0.13.0, by Aleksey Cheusov, Sun, 27 Dec 2009 17:06:06 +0200 + + CC, CXX and LD types are automatically detected and options passed + to them (e.g. options for generating a position independent code or + options for building a shared library) depend on this type. + At the moment the following systems and compilers are supported: + + - NetBSD. Tested under NetBSD-5.0/x86 and NetBSD-2.0/alpha with + gcc and pcc (Portable C compiler). + + - FreeBSD. Tested under FreeBSD-6.2/x86, 7.1/spark64 and 7.1/x86 + with gcc. + + - OpenBSD. Tested under OpenBSD-3.8/x86 and 4.5/x86 with gcc. + + - Solaris. Tested under Solaris-10/x86 and Solaris-10/spark64 + with sunpro-11, sunpro-12 and gcc. + + - Darwin (MacOS-X). Tested under Darwin-8.11.0/ppc (MacOS-X + Tiger) with native gcc. + + - Interix. Tested under Interix-3.5/x86 with gcc. + + - QNX. Tested under QNX-6.3/x86 with gcc. + + - Partial support for AIX, HP-UX and Tru64 and their native + compilers and linkers. Support is not complete because I have + no access to "big iron". Any help? ;-) + + If you don't see your favourite system/compiler here and want to + help me to improve mk-configure, feel free to contact + me. mk-configure needs your help! ;-) + + The default directory for mk-files is ${PREFIX}/share/mkc-mk, where + an empty sys.mk is installed unless NOSYSMK is defined while + installation. See an explanation about this in README. + + So called built-in checks are implemented. See MKC_CHECK_BUILTINS + variable. Built-in checks are checks provided by mk-configure. At + the moment the following checks are implemented: endianess, + prog_flex, prog_bison, prog_gawk, prog_gm4. See mk-configure.7 for + the documentation. + + mkc.configure.mk: + - At the end of this file MKC_{REQUIRE,CHECK}_XXX variables as + well as MKC_{CFLAGS,LDADD,SRCS} are .undef-ed. This allows one + to .include mkc.configure.mk several times. + - This include file is activated automatically from mkc.prog.mk + and mkc.lib.mk. You need to .include mkc.configure.mk + explicitely only if postcheck actions are needed. + + SCRIPTS variable can contain subdir/<script>s, they are installed + just as <script>s, i.e. subdir/ is silently stripped. + SCRIPTSDIR_subdir_<script> and SCRIPTSNAME_subdir_<script> can be + used for specifying an alternative destination path and filename. + + If .l or .y source files are listed in SRCS variable, mk-configure + automatically checks weather ${LEX} and ${YACC} are available or + not. The same for .c/${CC}, .cpp|.cc|.cxx|.C/${CXX}, .f/${FC} and + .p/${PC}. In case of absense of appropriate tool bmake exits with + error on early stage. + + MKC_CHECK_CUSTOM, MKC_REQUIRE_CUSTOM: + - HAVE_CUSTOM.xxx bmake's variables and HAVE_CUSTOM_xxx #defines + have been renamed to CUSTOM.xxx and CUSTOM_xxx respectively. + Formally speaking this breaks backward compatibility with + earlier mk-c releases. + - Support for checks written in C++ (.cc, .cxx, .C and .cpp) and + Fortran (.f) is added. + - Support for checks implemented as an executable program/script is added. + + FIXES: + - mkc_imp.man.mk: useless TMACDIR and dependencies on tmac files + under /usr/share are removed + - mkc_check_decl: + void function() cannot 'return 0' (thanks to SunPro compiler!) + - If C++ source files are listed in SRCS, ${CXX} is used as a + linker both for executables and shared libraries. + - Linux, SunOS and lots of others have no "wheel" group. They use + "root". + - "make installdirs" should not create man/htmlN directories + unless MKHTML is set to "yes" + - mkc_imp.lib.mk: .so build rule must use ${LDFLAGS} + + ADDED: mkcmake utility (trivial wrapper over bmake) which should be + used for building a software instead of bmake. + + .c:, .f:, .l: and similar useless rules are removed. It is enough to + have .c.o:, .f.o:, .l.c etc. + + Improvements for cross-compilation. + + Lots of new regression tests: + + mkc_check_common.sh: + if MKC_NOCACHE=1, tmp.c, tmp.o, tmp.exe and tmp.err are + removed. + + Support for lex: + -ll is added to linker if needed. + + mkc_check_compiler: + - Added support for the following compilers: IBM Visual Age, HP + cc/aCC, SunPro C/C++, Watcom, Borland, DEC C/C++ and Comeau C/C++ + - New option '-x' for checking C++ compiler type. + + mkc_which: + Accepts full paths. /path/to/program -> /path/to/program + + In order to avoid confusion, position independent object files (.so) + have been renamed to .os. Also, .po has been renamed to .op. + + mkc_imp.lib.mk: + - suffix rules for .cpp, widely used extension for C++ sources, are + added. + - LDCOMPILER variable is introduced, if "yes", compiler is used + for linking a shared library. + + INCSSRCDIR variable is introduced, see the documentation. + + mkc_install: New utility for platforms having no BSD compatible + install(1). INSTALL variable is set to mkc_install if needed. + + mkc.intexts.mk is included from mkc.prog.mk and mkc.lib.mk + automatically just like mkc_imp.*.mk includes. + +====================================================================== +Version 0.12.0, by Aleksey Cheusov, Thu, 12 Nov 2009 17:58:09 +0200 + + mk-configure doesn't depend on external pkgsrc-mk-files anymore! + The only required thing is bmake itself. Everything else is inside + mk-configure tarball now (yes, I've forked mk-files. Lots of fixes, + clean-ups, reorganizations, additions, improvements, removals of + useless code...). Some interesting things were stolen from NetBSD + base system's mk-files. Do not rely on things you found in + NetBSD/pkgsrc/sjg mk-files or even mk-c sources! Only features + documented in mk-configure.7 will be supported. + + A target "install-dirs" has been renamed to "installdirs". + Ask mkc.subdir.mk why ;-) + + mkc.lib.mk: + - Commands for building a .so/.dylib shared library + is overridable by user (using bmake's "commands"). + + Shared libraries + - support for Darwin (.dylib and Apple's ld) + - support for Solaris (gcc + Solaris' ld) + - support for shared libraries is still terrible, more flexibility + is needed. + + Variables: + - New variables CLEANDIRS and DISTCLEANDIRS. + - As of this release MKC_SHOW_CACHED defaults to 0. + - New variable MKINSTALL. You can use it for internal static libraries. + - New variable MKC_REQD. Minimal mk-configure version required. If + this check fails, an entire build fails. + - New variable USETBL. NOTE: It is "yes"/"no" variable. + - New variable MANZ. NOTE: It is "yes"/"no" variable. + - New variable SCRIPTSBIN that defaults to ${BINDIR}. + - HTMLDIR is introduced containing directry for .html pages + generated from manual pages. html pages are automatically + installed if MKHTML=yes. + - LDLIBS is not used anymore. Use LDADD for libraries. + - DISTCLEANFILES modifyable by user contains a list of files + removed by targets "cleandir" and "distdir" + - New variable NROFF_MAN2DOC. + + Fixes: + - A target "uninstall" now works correctly with .cat files. + - configure.mk + Workaround for buggy 20081111 < bmake < 20090909. + See NetBSD BTS bin/41998: + /usr/bin/make: .for loop + ":" inside iter_var = bug + + mk-configure: + - "make distclean" run at the root mk-c's directory really removes + all garbage. + - TONS OF NEW REGRESSION TESTS. If you are running an exotic platform, + run "bmake test" and send me results ;-) + + mkc_check_prog (MKC_CHECK_PROG): + - Path to a found program is output instead of just "found" message. + + mkc_check_compiler - new utility, not used in mkc.*.mk yet. + +====================================================================== +Version 0.11.1, by Aleksey Cheusov, Sat, 5 Sep 2009 17:25:18 +0300 + + fixed: path to awk in mkc_check_version script + +====================================================================== +Version 0.11.0, by Aleksey Cheusov, Sat, 5 Sep 2009 15:26:01 +0300 + + mk-configure(7) + + Simon Gerrary's mk-files is not supported anymore. + Use pkgsrc mk-files! + + Regression tests have been reorganized and significantly improved. + All examples become regression tests. Lots of new tests. + Run 'bmake test' to run them. + + mk-configure uses its own mkc.*.mk scripts to build and install + itself. As a result Free/OpenBSD make cannot be used anymore for + building and installations. Use bmake! + + ADDED: FAQ document to answer frequently asked questions. + Thanks to Michael Shigorin for corrections. + + New simple module for regression tests: mkc.minitest.mk. Besides + its simplicity it is quite useful. mk-configure uses it for testing + itself. + + Initial version of mkc.pkg-config.mk module + See examples/hello_glib2 for the sample of use. + Note that it is not complete yet. + + mkc.configure.mk and configure.mk: + + - checks are not run if appropriate HAVE_xxx.yyy variable is + already defined. This makes possible to effectively build + software in a well defined stable environment. + Ex: bmake -f predefined_settings.mk -f Makefile all + + - ADDED: MKC_CHECK_TYPES for checking for types. + See the documentation in configure.mk.in and examples/. + + - ADDED: MKC_CHECK_CUSTOM for custom user's checks. + Custom check is a user's code. + Check itself -- is this code compilable or not. + See the documentation in configure.mk.in and examples/. + + - Behaviour of MKC_CHECK_MEMBERS changed: Now "struct " prefix + is not hardcoded. This gives an ability to check members in + struct-s, enum-s and typedef-s. + + - NEW: MKC_REQUIRE_HEADERS, MKC_REQUIRE_FUNCLIBS, + MKC_REQUIRE_DEFINES, MKC_REQUIRE_TYPES, MKC_REQUIRE_VARS, + MKC_REQUIRE_MEMBERS, MKC_REQUIRE_CUSTOM and + MKC_REQUIRE_FUNCS<N>. If these checks failure, bmake exits + with error and prints an error message. See configure.mk.in + for the documentation and examples/ for the samples of use. + + - NEW: MKC_CHECK_PROGS and MKC_REQUIRE_PROGS. + See configure.mk.in for the documentation and + examples/ for the samples of use. + + - NEW: targets "distclean" and "cleandir" removes _mkc_* cache files. + + - NEW: target "configure" runs all checks + and creates _mkc_ cache files. + + - all checks are disabled for targets "clean", "cleandir" and + "distclean". + + - Cache file names changed. Now they are: + _mkc_type_<type>, _mkc_sizeof_<type>, _mkc_header_<header>, + _mkc_funclib_<funclib>, _mkc_funcN_<func>, + _mkc_variable_<variable>, _mkc_custom_<custom-check>, + _mkc_prog_<progname>, _mkc_define_<define>, _mkc_member_<member> + + mkc.info.mk and mkc.man.mk are removed. They are included automatically + from mkc.prog.mk, mkc.lib.mk and mkc.files.mk if needed. + + mkc.prog.mk, mkc.lib.mk, mkc.files.mk and mkc.subdir.mk: + + - NEW: target "uninstall" is supported. + + - performance improvements. "Hard" sections of mkc.common.mk are + activated if and only if appropriate target is in action. + + - FIX: target "install-dirs" now works correctly with MAN + containing .N pages where N is not 1. + + - FIX: target "install-dirs" now takes into account LINKS and + SYMLINKS. + + - Better support for TEXINFO: + - "uninstall" target takes TEXINFO into account. + - "clean" target removes generated .info files. + + - mkc.{prog,lib,files}.mk supports a target "test". By default + it does nothing. The target "test" of mkc.subdir.mk runs + 'bmake test' for each SUBDIR. If you want to define your own + "test" target overriding the default one, define it in your + project's Makefile before any .include <mkc.*.mk> directive. + + - MKC_REQD variable + + Makefile of mk-configure: README, NEWS, TODO, FAQ and LICENSE + files are also installed unless EXTRAFILES is set to an empty string. + + "mkc_check_sizeof" and "mkc_check_decl type" don't create cache + files with spaces in its name anymore. Space inside a filename is + replaced with symbol ~ (tilde). + + FIXED: mkc_check_custom, mkc_check_decl, mkc_check_funclib, + mkc_check_header and mkc_check_sizeof failed if CC contains space. + Thanks to Vitaly Lipatov for the report. + + mkc_check_sizeof now works drammatically faster. + + MKHTML defaults to "no". + + mkc_check_sizeof, mkc_check_custom: + - fixes for problems with Solaris' /bin/sh + + Other fixes and improvements. + +====================================================================== +Version 0.10.0, by Aleksey Cheusov, Sun, 31 May 2009 14:54:10 +0300 + + mkc.configure.mk: + + New: MKC_CHECK_MEMBERS, mechanism for checking for structure + members. Regression tests for this new feature. Man page update + for mkc_check_decl. See the documentation for MKC_CHECK_MEMBERS + in configure.mk file. + + Fix: HAVE_FUNCN.funcname.dir.header_h -> + HAVE_FUNCN.funcname.dir_header_h + New: Support for HAVE_VAR.varname.dir_header_h (dir/header.h!) + New: Support for HAVE_DEFINE.defname.dir_header.h (dir/header.h!) + New: MKC_COMMON_DEFINES.`uname -s`, e.g. MKC_COMMON_DEFINES.NetBSD, + MKC_COMMON_DEFINES.Linux etc. + + "install-dirs" now work fully correctly, i.e. creates + all required directories. + + New variable DPLIBS for listing -llibs for linking. Use DPLIBS + instead of LDADD for linking with local libraries. + See examples/8/hello/Makefile. + + mkc_check_decl: + workaround for buggy ksh and FreeBSD /bin/sh. + +====================================================================== +Version 0.9.0, by Aleksey Cheusov, Sun, 29 Mar 2009 16:53:57 +0300 + + Huge amount of changes were made since previous release. Now + mk-configure provides a number of mkc.*.mk scripts working on top of + pkgsrc's mk files or Simon Gerraty's mk-files and therefore provides + a replacement not only for GNU autoconf but for GNU automake too. + It makes sense to reread README file. + Lots of new information is there. + + Lots of examples (yes, hello_worlds applications :-) ) were created + in examples/ subdirectory. + + Lots of new mkc.*.mk files were added. They work on top of bsd.*.mk + files and provide new functions. See README. + + Regression tests were added. Thanks to them a number of bugs were + detected and fixed. + + Fixes in configure.mk: + - s/return/exit/ in ${.OBJDIR}/.error-check section. + This bug is seen under Linux/bash. + + - bmake's variable SIZEOF.long_long was not set correctly + (long-long din't work) + + - MKC_CHECK_SIZEOF+=type:header.h + bmake's variable SIZEOF.<type>.<header_h> is set + instead of plain SIZEOF.<type> + + - MKC_CHECK_HEADERS += dir/hdr.h + bmake's variable: s/HAVE_HEADER.dir.hdr_h/HAVE_HEADER.dir_hdr_h/ + (`.' vs. `_') + I hope this is a last change in configure.mk's API. + + My own mkc.intexts.mk bmake module (mk file). + + configure.mk: + If CHECK_SIZEOF_xxx check fails, MKC_CFLAGS is not changed. Only + sucessful data type sizes are registered in MKC_CFLAGS and CFLAGS. + + mkc_check_decl, mkc_check_sizeof: they don't use MKC_COMMON_DEFINES + environment enymore, everything should be passed through CFLAGS and + CPPFLAGS. + + MKC_SHELL is currently disabled + +====================================================================== +Version 0.7.0, by Aleksey Cheusov, Sun, 15 Mar 2009 11:02:29 +0200 + + No CFLAGS+=-DHAVE_XXXX=0 anymore, if XXX is not found + it is not defined at all. autoconf works the same way. + + mkc_check_xxx scripts: + - installed to bin/ directory just like normal scripts. + + - if MKC_VERBOSE variable is equal to '1', verbose messages + are output to stderr. + + - -h|--help options printing usage information. + + - manual pages are created. + + new variable MKC_NOCACHE, if it is set to not empty string, + caching is disabled. + + fix in mkc_check_decl: long-long is treated as 'long long'. + + MKC_SHOW_CACHED, MKC_VERBOSE, MKC_DELETE_TMPFILES, MKC_NOCACHE + variables: 1 - true, other values - false. + + minor clean-ups in Makefile + +====================================================================== +Version 0.6.0, by Aleksey Cheusov, Sun, 8 Mar 2009 19:35:13 +0200 + + MKC_FUNCLIBS_NOAUTO.ftime.compat is replaced + with MKC_NOAUTO_FUNCLIBS list. + + Ex.: + MKC_NOAUTO_FUNCLIBS += ftime:compat crypt:crypt + MKC_NOAUTO_FUNCLIBS = 1 # for disabling + # all potential LDADD += ... + + fix: "checking for..." messages is now sent to stderr + before result is calculated, not after. + + Support for heirloom-sh and ancient Solaris-10 /bin/sh + + added: MKC_SHELL variable defaulting to /bin/sh, mkc_check_XXX + scripts are run with with this shell. This is variable is mainly for + testing purposes but who knows. + +====================================================================== +Version 0.5.0, by Aleksey Cheusov, Tue, 3 Mar 2009 00:04:52 +0200 + + Huge amount of changes. 0.5.0 is completely incompatible with 0.4.0 + because 0.4.0 was proof-of-concept only ;-) Everything was + inspired by discussion in fido7.ru.unix.prog. + + Changing in API is also possible in the future until + I stabilize it. + +====================================================================== +Version 0.4.0, by Aleksey Cheusov, Sat, 21 Feb 2009 22:47:20 +0200 + + First publicly available release. Happy birth day! :-) diff --git a/doc/TODO b/doc/TODO new file mode 100644 index 0000000..bcfa7de --- /dev/null +++ b/doc/TODO @@ -0,0 +1,229 @@ +============================================================ +Plan 0.25.0 + +Some thoughts inspired by talks with Michael Crogan + +- During development of huge projects it may make sense to always keep + "installed" version of the software somewhere (FAKEPREFIX?) + and always keep it synced. + mk-configure needs a mechanism to always "install" + after "all" and "uninstall" before "clean". Options: develop this in + mk-c and make it optional feature; provide a mechanism for + auto-depend one target from TARGETS from another one. In the latter + case users will be able to implement this kind of things themself. + (myall -> "myall-* : all-* .WAIT install-*) + (myclean -> "myclean-* : uninstall-* .WAIT clean-*) + +- VARIANTS for libraries. + +- project "roundup" for testing + +- Better explain how "test" target works, maybe as a couple of slides + in the PDF presentation. With and without mkc.minitest.mk. +- One more example/ for TARGETS, demonstrating such things as + "mkcmake release/debug/profile" or "mkcmake all_clang/all_gcc" + or "valgrind_test"/"gcov_test" etc. +- Additional slides in PDF for virtual subprojects. + Notes about "virtual subproject" in examples/. +- Notes in examples/hello_dictd and other examples based on + mkc.subprj.mk about what mkc.subprj.mk really does. Reference (man page) + is not enough for newcomers. Notes about clean-SUBPRJ, all-SUBPRJ etc. +- Better explain ../Makefile.inc included automatically. For those who + are not familiar with *BSD it is not obvious how to use it. +- "errorcheck/configure" tests should be run in parallel. Something + like shlock(1) or flock(1) is needed for this. +- Example is needed for how to embed autoconf-based subproject into a + project based on mk-configure. The sad fact is autoconf/automake is + everywhere. So, it would be nice integrate mk-c into reality. + mkc_imp.autotools.mk is needed for this. +- Alternative .depend generation, e.g. like it is described in GNU + make info files +- Higher priority for fixing handling of dependencies between + libraries and programs. In addition examples/ is needed for + triggering rebuild of subproject if "something" was rebuild in + another subproject (build script for example). +- For better extensibility it makes sense to implement user-implementable + pre_all, post_all, pre_install, post_install etc. targets. +- Interdependencies between targetX-subprjA and targetY-subprjB (for + example all-prject1 and install-prject2). Maybe this is cool idea + for examples/ and slides. I need some good example for this. + <<<depend-project1:errorcheck-autotools_based_project2>>>!!! +- Steal cool features from Simon Gerraty's mk files and analyse + "meta mode" he invented. +- Better support for working without installation to /. -rpath, additional + directories for objects, binaries and libs. + +Some "targets" from TARGETS should set MKCHECKS to "no" + +ronn(1) : markdown to man pages + +----------------------------------------- +gcc -L/usr/pkg/lib -R/usr/pkg/lib -o hello_lex hello_lex.o -ll +yacc calc.y +mv y.tab.c calc.c +gcc -I/usr/pkg/include -c -o calc.o calc.c +gcc -L/usr/pkg/lib -R/usr/pkg/lib -o hello_calc calc.o +ERROR: cannot find program -y +Cannot find bison, good bye! +------------------------------------------ + + custom test failed -> exit status of mkcmake should not be zero + MKC_CUSTOM_ERR.qqqq -> error message before exiting just like + + mkcmake configure doesn't work + New variable MKC_CUSTOM_ENV.xxx + + Add script_check to MKC_CHECK_CUSTOM + Ex. MKC_CHECK_CUSTOM+= nested_funcs + MKC_CUSTOM_FN.nested_funcs= nested_funcs.c + MKC_CUSTOM_FN.script_check= checks/script_check + + - BINSUBDIR, LIBSUBDIR, LIBEXECSUBDIR etc... + - Fix USE_SSP support for clang (-mllvm -stack-protector-buffer-size=1) + - @sysconfdir@/mkc.conf + - LDFLAGS vs. LDFLAGS in link.me (global paths before project's) + - Reimplement linkme.mk. It is not flexible enough. + - USE_RPATH + - OBJCOPTS_<proj> + - Regression tests: + * optional .f tests + * optional .p tests + * optional .m tests + * optional(!) glib2 tests + +============================================================ +Plan 1) + + - Support for MKDEBUG like in NetBSD mk files + - .lua.luac: + - Implement mkc_imp.libtool.mk to build + the shared libraries using GNU libtool(1). + - MKSTRIP, STRIP, mkc_install: use STRIP, not STRIPPROG + + Slides for: + - Slide "extensibility" about Lua module. + - code specific to GNU ld(1) (.def?) + +============================================================ +Plan 2) + + - ./configure written in shell? + - EXPORT_DYNAMIC_SYMBOLS - add the specified symbols to + dynamic symbol table (GNU ld) + - EXPORT_SYMBOLS_REGEXP + + - recheck documentation for Makefile.rec + - Syllable, Haiku, OpenServer/UnixWare and HURD + - lcc and tcc compilers + - epm -> rpm, SVR4 pkg etc. + - mkc_imp.filelist.mk + - FL_NOPREFIX + - FL_PERSUBPRJ + - IRIX: "endianess" and EXPORT_SYMBOLS + +============================================================ +Plan 3) + + = sample for home-made .mk file (Ocaml? Pike?) + = marker for user's custom tests that + run generated executables, i.e. not ready + for cross-compilation + + = symlinks to executables and libraries in ${OBJDIR}/{bin,lib} + + = support for gettext + + = xxxDIR variable for /var + + = mkclint? + + = Command line may be limited in size. + Save defines to config.h and set HAVE_CONFIG_H to 1 + for compiling. + + = MKC_NEED_FUNCLIBS - the same as MKC_SOURCE_FUNCLIBS but + implementation is taken from mk-c. + Ex: MKC_NEED_FUNCLIBS += strlcat strlcpy getline + + = MKC_CUSTOM_premk, MKC_CUSTOM_postmk + + = Online tutorial + + = shared libraries support for AIX, UnixWare, Hurd, Haiku. + = shared libraries support for nwcc and other compilers. + + = Comparison with quagmire, kBuild, CMake, scons, waf, framewerk, pmk, + MagicMakefiles, bjam, pymake etc. + + = Often compilers need special options to compile pthread code. + Support for MKPTHREAD=yes|no is needed. + + = implement MANBZ2? + + = man page for mkc_check_compiler + +============================================================ +Plan 4) + + = EXPORT_SYMBOLS for HP-UX, AIX, SCO etc. + + = Single cache file as an automatically loaded (if exists) + bmake makefile. + + = Targets bin_rpm, bin_epm + = Targets src_tar, src_targz, src_tarbz2 + + = mkc.subdir.mk: + - continue bulding even if some subprojects failed + + = MKC_CHECK_CUSTOM: + - MKC_CUSTOM_FN=xxx.f + - MKC_CUSTOM_FN=xxx.objc + + = Implement mkc.qt.mk + + = Implement mkc.doxygen.mk? + +============================================================ +Plan 5) + + = mkc.configure.mk functionality but for bourne shell, e.g. + + Upstream creates ./configure shell script: + MKC_CONFIG_MK=mkc_config.mk + MKC_CONFIG_H=mkc_config.h + + MKC_CHECK_HEADERS=' + header1.h + header2.h + header3.h' + MKC_CHECK_FUNCLIBS=' + func1:lib1 + func2 + func3:lib3' + #<...> + . mkc_configure + mkc_run # generating mkc_config.h and mkc_config.mk + + User runs + ./configure ... + <any>make all + + = MKC_CHECK_DECL_TYPE (define, function|variable) + + = MKC_DEFINE_01 - -DHAVE_XXX=0 or -DHAVE_XXX=1 + +============================================================ +Plan 6) + = MKC_BUILTINS (from autoconf): + broken_free_NULL, + exit_ret_int, + isinf, isnan, malloc_0, putenv_xxx, realloc, signal, + snprintf, sprintf, sscanf, strerror_r, strnlen, + sysconf, unlink, unsetenv, va_copy, va_list, + signed_shr, int_div, chown_minus_1,... + (autoconf.info/Particular Function Checks) + + AC_FUNC_ALLOCA + = autoconf (Portability of headers) + = autoconf (Particular Header Checks) diff --git a/doc/dep_graph.dot b/doc/dep_graph.dot deleted file mode 100644 index 73ad03f..0000000 --- a/doc/dep_graph.dot +++ /dev/null @@ -1,16 +0,0 @@ -digraph FSA { - graph [ ratio=compress layout=dot rankdir=UB ratio=0.4 ]; - - node [ shape = oval style=filled fontsize=18 ]; - - "libmaa" -> "dict"; - "libmaa" -> "dictd"; - "libmaa" -> "dictfmt"; - "libmaa" -> "dictzip"; - "libcommon" -> "dict"; - "libcommon" -> "dictd"; - "libcommon" -> "dictfmt"; - "libcommon" -> "dictzip"; - "libdz" -> "dictzip"; - "doc"; -} diff --git a/doc/my_prjs.dot b/doc/my_prjs.dot deleted file mode 100644 index 863e2ee..0000000 --- a/doc/my_prjs.dot +++ /dev/null @@ -1,51 +0,0 @@ -digraph FSA { - graph [ ratio=compress layout=dot rankdir=UB ratio=0.4 ]; - - node [ shape = hexagon style=filled fontsize=20 ]; - - "mk-configure" [ fillcolor = grey60, fontcolor = white ]; - "lmdbg"; - "paexec"; - "distbb"; - "pkg_online"; - "runawk"; - "pkg_summary-utils"; - "nih"; - - node [ shape = oval style=solid ]; - - "dictd"; - "dictem"; - - node [ shape = box ]; - - "runawk" -> "pkg_summary-utils"; - "runawk" -> "lmdbg"; - "runawk" -> "paexec"; - "runawk" -> "distbb"; - "runawk" -> "nih"; - "pkg_summary-utils" -> "distbb"; - "paexec" -> "distbb"; - "dictd" -> "dictem"; - "pkg_summary-utils" -> "pkg_online"; - "pkg_summary-utils" -> "pkg_conflicts"; - "pkg_summary-utils" -> "nih"; - "pkg_online" -> "nih"; - - "pkg_summary-utils"; - "pkg_conflicts"; - - node [ shape = oval style=solid ]; - - "dictd" -> "pkg_online"; - "pipestatus" -> "pkg_summary-utils"; - -} - -digraph FSA { - graph [ ratio=compress layout=dot rankdir=UB ratio=0.4 ]; - - node [ shape = hexagon style=filled fontsize=20 ]; - "lua-alt-getopt"; - "judyhash"; -} diff --git a/doc/presentation.tex b/doc/presentation.tex deleted file mode 100644 index f28356b..0000000 --- a/doc/presentation.tex +++ /dev/null @@ -1,1307 +0,0 @@ -%%%begin-myprojects -\documentclass[hyperref={colorlinks=true}]{beamer} - -\usepackage{fancyvrb,relsize} -\usepackage{graphicx} - -\setbeamertemplate{navigation symbols}{} - -%\usetheme{Boadilla} -%\usetheme{CambridgeUS} -%\usetheme{Malmoe} -%\usetheme{Singapore} -%\usetheme{boxes} - -%\usecolortheme{crane} -%\usecolortheme{dove} -\usecolortheme{seagull} % very cool with \usetheme{default} -%\usefonttheme{professionalfonts} -%\useinnertheme{rectangles} - -\mode<presentation> -\title{MK-CONFIGURE (MK-C) -- lightweight, - easy to use alternative for GNU Autotools} -\author{Aleksey Cheusov \\ \texttt{vle@gmx.net}} -\date{Minsk, Belarus, 2012} - -\begin{document} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\newenvironment{Code}[1]% - {\Verbatim[label=\bf{#1},frame=single,% - fontsize=\small,% - commandchars=\\\{\}]}% - {\endVerbatim} - -%\newenvironment{Code}[1]% -% {\semiverbatim[]}% -% {\endsemiverbatim} - -\newenvironment{CodeNoLabel}% - {\Verbatim[frame=single,% - fontsize=\small,% - commandchars=\\\{\}]}% - {\endVerbatim} - -\newenvironment{CodeNoLabelSmallest}% - {\Verbatim[frame=single,% - fontsize=\footnotesize,% - commandchars=\\\{\}]}% - {\endVerbatim} -\newenvironment{CodeLarge}% - {\Verbatim[frame=single,% - fontsize=\large,% - commandchars=\\\{\}]}% - {\endVerbatim} - -%\newcommand{\prompt}[1]{\textcolor{blue}{#1}} -%\newcommand{\prompt}[1]{\textbf{#1}\textnormal{}} -\newcommand{\prompt}[1]{{\bf{#1}}} -%\newcommand{\h}[1]{\textbf{#1}} -%\newcommand{\h}[1]{\bf{#1}\textnormal{}} -\newcommand{\h}[1]{{\bf{#1}}} -\newcommand{\URL}[1]{\textbf{#1}} -\newcommand{\AutohellFile}[1]{\textcolor{red}{#1}} -\newcommand{\MKCfile}[1]{\textcolor{green}{#1}} -\newcommand{\ModuleName}[1]{\textbf{#1}\textnormal{}} -\newcommand{\ProgName}[1]{\textbf{#1}\textnormal{}} -\newcommand{\ProjectName}[1]{\textbf{#1}\textnormal{}} -\newcommand{\PackageName}[1]{\textbf{#1}\textnormal{}} -\newcommand{\MKC}[1]{\large\textsf{#1}\textnormal{}\normalsize} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% \begin{frame} -%% \frametitle{qqq} -%% \begin{code}{files in the directory} -%% bla bla bla -%% \end{code} -%% \end{frame} - -%%%end-myprojects - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame} - \titlepage -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame} - \frametitle{About this presentation} - \begin{block}{} - \begin{itemize} - \item It is a part of official documentation. - Latest version is available for download from here\\ - \URL{http://mova.org/\~{}cheusov/pub/mk-c/mk-c.pdf} -% \item -% \URL{http://sourceforge.net/projects/mk-configure} \\ -% \URL{http://freshmeat.net/projects/mk-configure} - \item part 1: Introduction - \item part 2: A number of samples of use - \item part 3: More complete list of features, TODO and more. - \end{itemize} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame} - \frametitle{Concepts behind mk-configure} - \begin{block}{Design principles and goals} - \begin{itemize} - \item \h{I detest code generation} as in Autotools and CMake!\\ - \h{Library approach} is used instead. - \item Written in \h{bmake}, portable version of \h{NetBSD make(1)}, - and UNIX tools. \h{No heavy dependencies} like python, ruby and perl. - As a programming language - bmake is not as powerful as RuPyPe, but\\ - \h{\mbox{bmake+sh} is good enough} for this task. - \item Basic principles are \h{similar to - traditional \mbox{bsd.*.mk} files}. - Actually mk-c contains heavily reworked Mk files from NetBSD. - \item \h{Portability} to all UNIX-like systems. - \item KISS. Only about 4000 lines of code. - \end{itemize} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame} - \frametitle{Concepts behind mk-configure} - \begin{block}{Design principles and goals} - \begin{itemize} - \item mk-configure is not only for end-users and packagers - but for developers too. - So, one of the main goals is to provide a convenient \h{tool for - development}. - \item Declarative approach of writing Makefile(s). Build and - installation process is controlled with a help of special - variables and bmake's include files. - \item \h{Cross-compilation}. - \item \h{Extensibility}. Extensions to mk-configure are implemented - using bmake include files and standard UNIX tools, i.e. shell, - awk, sed, grep etc. when needed. - \item MK-C is \h{Easy to use}. Only one command is needed to build - a project --- \h{mkcmake}. \h{Only Makefile(s)} are needed for - specifying build instructions. - \end{itemize} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame} - \frametitle{Concepts behind mk-configure} - \begin{block}{Negative side-effects} - \begin{itemize} - \item End-users/packagers have to install bmake and - mk-configure to build applications based on mk-configure. - \end{itemize} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 1: Hello world application} - - \begin{block}{Source code} - \begin{Code}{Makefile} -PROG = hello - -.include <\h{mkc.prog.mk}> - \end{Code} - \begin{Code}{hello.c} -#include <stdio.h> - -int main (int, char **) -\{ - puts ("Hello World!"); - return 0; -\} - \end{Code} -% \end{columns} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 1: Hello world application} - -% \begin{block} -\begin{block}{How it works} -\begin{CodeNoLabel} -\prompt{\$ export PREFIX=/usr SYSCONFDIR=/etc} -\prompt{\$ mkcmake} -checking for compiler type... gcc -checking for program cc... /usr/bin/cc -cc -c hello.c -cc -o hello hello.o -\prompt{\$ ./hello} -Hello World! -\prompt{\$ DESTDIR=/tmp/fakeroot mkcmake install} -for d in \_ /tmp/fakeroot/usr/bin; do test "\$d" = \_ || - install -d "\$d"; done -install -c -s -o cheusov -g users -m 755 - hello /tmp/fakeroot/usr/bin/hello -\prompt{\$} -\end{CodeNoLabel} -\end{block} -Supported targets: all, clean, cleandir (distclean), install, -uninstall, installdirs, depend etc. -% \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 2: Application using non-standard strlcpy(3)} - -\begin{block}{Source code} - % files - \begin{Code}{files in the directory} -\prompt{\$ ls -l} -total 12 --rw-r--r-- 1 cheusov users 158 May 2 15:04 Makefile --rw-r--r-- 1 cheusov users 187 May 2 15:05 main.c --rw-r--r-- 1 cheusov users 332 May 2 15:09 \h{strlcpy.c} -\prompt{\$} - \end{Code} - -% Makefile - \begin{Code}{Makefile} -PROG = strlcpy_test -SRCS = main.c - -\h{MKC\_SOURCE\_FUNCLIBS} = strlcpy -\h{MKC\_CHECK\_FUNCS3} = strlcpy:string.h - -.include <mkc.prog.mk> - \end{Code} -\end{block} - -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 2: Application using non-standard strlcpy(3)} - -\begin{block}{Source code} -\begin{Code}{main.c} -#include <string.h> - -#ifndef \h{HAVE\_FUNC3\_STRLCPY\_STRING\_H} -size_t strlcpy(char *dst, const char *src, size_t siz); -#endif - -int main (int argc, char** argv) -\{ - /* Use strlcpy(3) here */ - return 0; -\} -\end{Code} -\end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 2: Application using non-standard strlcpy(3)} - - \begin{block}{How it works on Linux} -\begin{CodeNoLabel} -\prompt{\$ CC=icc mkcmake} -checking for compiler type... \h{icc} -checking for function strlcpy... \h{no} -checking for func strlcpy ( string.h )... \h{no} -checking for program icc... /opt/intel/cc/10.1.008/bin/icc -icc -c main.c -icc -c strlcpy.c -icc -o strlcpy_test main.o \h{strlcpy.o} -\prompt{\$ echo \_mkc\_*} -_mkc_compiler_type.err _mkc_compiler_type.res -_mkc_func3_strlcpy_string_h.c -_mkc_func3_strlcpy_string_h.err -_mkc_func3_strlcpy_string_h.res -_mkc_funclib_strlcpy.c _mkc_funclib_strlcpy.err -_mkc_funclib_strlcpy.res _mkc_prog_cc.err _mkc_prog_cc.res -\prompt{\$} -\end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 2: Application using non-standard strlcpy(3)} - - \begin{block}{How it works on NetBSD} -\begin{CodeNoLabel} -\prompt{\$ mkcmake} -checking for compiler type... gcc -checking for function strlcpy... \h{yes} -checking for func strlcpy ( string.h )... \h{yes} -checking for program cc... /usr/bin/cc -cc -D\h{HAVE\_FUNC3\_STRLCPY\_STRING\_H}=1 -c main.c -cc -o strlcpy_test main.o -\prompt{\$} -\end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 3: Application using plugins} - - \begin{block}{Source code} - \begin{Code}{Makefile} -PROG = myapp - -\h{MKC\_CHECK\_FUNCLIBS} = dlopen:dl - -.include <\h{mkc.configure.mk}> - -.if $\{\h{HAVE\_FUNCLIB.dlopen}:U0\} || \ {} - $\{\h{HAVE\_FUNCLIB.dlopen.dl}:U0\} -CFLAGS += -DPLUGINS_ENABLED=1 -.endif - -.include <mkc.prog.mk> - \end{Code} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 3: Application using plugins} - - \begin{block}{How it works on QNX} -\begin{CodeNoLabel} -\prompt{\$ mkcmake} -checking for compiler type... gcc -checking for function dlopen ( \h{-ldl} )... \h{yes} -checking for function dlopen... \h{no} -checking for program gcc... - /usr/qnx650/host/qnx6/x86/usr/bin/gcc -gcc \h{-DPLUGINS\_ENABLED=1} -c myapp.c -gcc -o myapp myapp.o \h{-ldl} -\prompt{\$} -\end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 3: Application using plugins} - - \begin{block}{How it works on OpenBSD} -\begin{CodeNoLabel} -\prompt{\$ mkcmake} -checking for compiler type... gcc -checking for function dlopen ( \h{-ldl} )... \h{no} -checking for function dlopen... \h{yes} -checking for program cc... /usr/bin/cc -cc \h{-DPLUGINS\_ENABLED=1} -c myapp.c -cc -o myapp myapp.o -\prompt{\$} -\end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 4: Support for shared libraries and C++} - - \begin{block}{Source code} - \begin{Code}{Makefile} -LIB = foobar -SRCS = foo.\h{cc} bar.\h{cc} baz.\h{cc} - -MKPICLIB ?= no -MKSTATICLIB ?= no - -\h{SHLIB\_MAJOR} = 1 -\h{SHLIB\_MINOR} = 0 - -.include <\h{mkc.lib.mk}> - \end{Code} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 4: Support for shared libraries} - - \begin{block}{How it works on Solaris with SunStudio compiler} -\begin{CodeNoLabel} -\prompt{\$ mkcmake} -checking for compiler type... \h{sunpro} -checking for program CC... /opt/SUNWspro/bin -CC -c \h{-KPIC} foo.cc -o foo.os -CC -c \h{-KPIC} bar.cc -o bar.os -CC -c \h{-KPIC} baz.cc -o baz.os -building shared foobar library (version \h{1.0}) -CC \h{-G} \h{-h libfoobar.so.1} - -o libfoobar.so.1.0 foo.os bar.os baz.os -ln -sf libfoobar.so.1.0 libfoobar.so -ln -sf libfoobar.so.1.0 libfoobar.so.1 -\prompt{\$} -\end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 4: Support for shared libraries} - - \begin{block}{How it works on Darwin} -\begin{CodeNoLabel} -\prompt{\$ mkcmake} -checking for compiler type... gcc -checking for program c++... /usr/bin/c++ -c++ -c \h{-fPIC -DPIC} foo.cc -o foo.os -c++ -c \h{-fPIC -DPIC} bar.cc -o bar.os -c++ -c \h{-fPIC -DPIC} baz.cc -o baz.os -building shared foobar library (version 1.0) -c++ \h{-dynamiclib -install\_name} - /usr/local/lib/libfoobar.1.0.\h{dylib} - \h{-current\_version 2.0 -compatibility\_version 2} - -o libfoobar.1.0.dylib foo.os bar.os baz.os -ln -sf libfoobar.1.0.dylib libfoobar.dylib -ln -sf libfoobar.1.0.dylib libfoobar.1.dylib -\prompt{\$} -\end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 4: Support for shared libraries (Exported symbols)} - - \begin{block}{} -\begin{CodeNoLabel} -\prompt{\$ cat Makefile} -LIB = foo -INCS = foo.h -\h{EXPORT\_SYMBOLS} = foo.sym -SHLIB_MAJOR = 1 -MKSTATICLIB = no -.include <mkc.lib.mk> -\prompt{\$ mkcmake} -awk 'BEGIN \{print "\{ global:"\} \{print \$0 ";"\} - END \{print "local: *; \};"\}' foo.sym - > foo.sym.tmp1 && mv foo.sym.tmp1 foo.sym.tmp -cc -I. -c -fPIC -DPIC foo.c -o foo.os -building shared foo library (version 1) -ld -shared -soname libfoo.so.1 - \h{--version-script foo.sym.tmp} -o libfoo.so.1 foo.os -\prompt{\$} -\end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 5: Big project consisting of several subprojects} - - \begin{block}{Dependency graph for all subprojects} -This project consists of several subprojects: dict, dictd, dictfmt, -dictzip, libdz, libmaa and libcommon. libcommon contains common code -for executables and should not be installed. - \begin{figure} - \includegraphics[width=\textwidth, height=0.50\textheight, keepaspectratio=false]{dep_graph.eps} - \end{figure} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 5: Big project consisting of several subprojects} - - \begin{block}{Files and directories} - \begin{CodeNoLabel} -\prompt{\$ ls -l} -total 4 -drwxr-xr-x 2 cheusov users 1 Jan 26 12:01 dict -drwxr-xr-x 2 cheusov users 1 Jan 26 12:01 dictd -drwxr-xr-x 2 cheusov users 1 Jan 26 12:01 dictfmt -drwxr-xr-x 2 cheusov users 1 Jan 26 12:01 dictzip -drwxr-xr-x 2 cheusov users 1 Jan 26 12:03 doc -drwxr-xr-x 2 cheusov users 1 Jan 26 12:01 libcommon -drwxr-xr-x 2 cheusov users 1 Jan 26 12:01 libdz -drwxr-xr-x 2 cheusov users 1 Jan 26 12:01 libmaa --rw-r--r-- 1 cheusov users 306 Jan 26 12:03 \h{Makefile} -\prompt{\$} - \end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 5: Big project consisting of several subprojects} - - \begin{block}{Source code} - \begin{Code}{Makefile} -SUBPRJ = libcommon:dict # dict depends on libcommon -SUBPRJ += libcommon:dictd -SUBPRJ += libcommon:dictzip -SUBPRJ += libcommon:dictfmt -SUBPRJ += libmaa:dict -SUBPRJ += libmaa:dictd -SUBPRJ += libmaa:dictfmt -SUBPRJ += libmaa:dictzip -SUBPRJ += libdz:dictzip -SUBPRJ += doc - -.include <\h{mkc.subprj.mk}> - \end{Code} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 5: Big project consisting of several subprojects} - - \begin{block}{Source code} - \begin{Code}{libcommon/Makefile} -# Internal static library that implements functions -# common for dict, dictd, dictfmt and dictzip applications - -LIB = common -SRCS = str.c iswalnum.c # and others - -\h{MKINSTALL} = no # Do not install internal library! - -.include <mkc.lib.mk> - \end{Code} - \begin{Code}{libcommon/linkme.mk} -PATH.common := \$\{.PARSEDIR\} - -CPPFLAGS += -I\$\{PATH.common\}\h{/include} -DPLIBDIRS += \$\{PATH.common\} - \end{Code} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 5: Big project consisting of several subprojects} - - \begin{block}{Source code} - \begin{Code}{libmaa/Makefile} -LIB = maa -SRCS = set.c prime.c log.c # etc. - -\h{INCS} = maa.h - -SHLIB_MAJOR = 1 -SHLIB_MINOR = 2 -SHLIB_TEENY = 0 - -# list of exported symbols -\h{EXPORT\_SYMBOLS} = maa.sym - -.include <mkc.lib.mk> - \end{Code} - \begin{Code}{libmaa/linkme.mk} -PATH.maa := \$\{.PARSEDIR\} -CPPFLAGS += -I\$\{PATH.maa\} -DPLIBDIRS += \$\{PATH.maa\} - \end{Code} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 5: Big project consisting of several subprojects} - - \begin{block}{Source code} - \begin{Code}{libmaa/maa.sym} -hsh_create -hsh_destroy -hsh_insert -hsh_delete -hsh_retrieve -... -lst_create -lst_destroy -lst_insert -... -set_create -set_destroy -set_add -set_union -... - \end{Code} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 5: Big project consisting of several subprojects} - - \begin{block}{Source code} - \begin{Code}{libdz/Makefile} -LIB = dz -SRCS = dz.c - -INCS = dz.h - -\h{MKC\_REQUIRE\_HEADERS} = zlib.h -\h{MKC\_REQUIRE\_FUNCLIBS} = deflate:z -EXPORT_SYMBOLS = dz.sym -SHLIB_MAJOR = 1 -SHLIB_MINOR = 0 -LDADD = -lz - -.include <mkc.lib.mk> - \end{Code} - \begin{Code}{libdz/linkme.mk} -PATH.dz := \$\{.PARSEDIR\} -CPPFLAGS += -I\$\{PATH.dz\} -DPLIBDIRS += \$\{PATH.dz\} - \end{Code} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 5: Big project consisting of several subprojects} - - \begin{block}{Source code} - \begin{Code}{dictzip/Makefile} -PROG = dictzip -MAN = dictzip.1 - -\h{.include} "../libcommon/linkme.mk" -\h{.include} "../libdz/linkme.mk" -\h{.include} "../libmaa/linkme.mk" - -DPLIBS += -lcommon -ldz -lmaa - -.include <mkc.prog.mk> - \end{Code} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 5: Big project consisting of several subprojects} - - \begin{block}{How it fails ;-)} - \begin{CodeNoLabel} -\prompt{\$ mkcmake errorcheck-dictzip} -================================================== -errorcheck ===> \h{libcommon} -... -errorcheck ===> \h{libmaa} -... -================================================== -errorcheck ===> \h{libdz} -checking for header zlib.h... \h{no} -checking for function deflate ( -lz )... \h{no} -checking for function deflate... \h{no} -\h{ERROR: cannot find header zlib.h} -\h{ERROR: cannot find function deflate:z} -... -\prompt{\$ echo \$?} -1 -\prompt{\$} - \end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 5: Big project consisting of several subprojects} - - \begin{block}{How it works} - \begin{CodeNoLabel} -\prompt{\$ mkcmake dictzip} -... -================================================== -all ===> \h{libdz} -... -checking for header zlib.h... \h{yes} -checking for function deflate ( -lz )... \h{yes} -... -================================================== -all ===> \h{dictzip} -... -cc \h{-I../libcommon -I../libdz -I../libmaa} -c dictzip.c -cc \h{-L/tmp/hello\_dictd/libcommon -L/tmp/hello\_dictd/libdz} - \h{-L/tmp/hello\_dictd/libmaa} -o dictzip - dictzip.o -lcommon -lmaa -ldz -\prompt{\$} - \end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 6: Support for Lua programming language} - - \begin{block}{Source code} - \begin{Code}{Makefile} -SCRIPTS = foobar # scripts written in Lua -LUA\_LMODULES = foo bar # modules written in Lua -LUA\_CMODULE = baz # Lua module written in C - -.include <mkc.lib.mk> - \end{Code} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 6: Support for Lua programming language} - - \begin{block}{How it works} - \begin{CodeNoLabel} -\prompt{\$ mkcmake errorcheck} -checking for program pkg-config... - /usr/pkg/bin/pkg-config -checking for [pkg-config] lua... 1 (yes) -checking for [pkg-config] lua --cflags... - -I/usr/pkg/include -checking for [pkg-config] lua --libs... - -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -llua -lm -checking for [pkg-config] lua --variable=INSTALL_LMOD... - /usr/pkg/share/lua/5.1 -checking for [pkg-config] lua --variable=INSTALL_CMOD... - /usr/pkg/lib/lua/5.1 -checking for compiler type... gcc -checking for header lua.h... yes -checking for program cc... /usr/bin/cc -\prompt{\$} - \end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 6: Support for Lua programming language} - - \begin{block}{How it works} - \begin{CodeNoLabel} -\prompt{\$ export PREFIX=/usr/pkg} -\prompt{\$ mkcmake all} -cc -DHAVE_HEADER_LUA_H=1 -I/usr/pkg/include - -c -fPIC -DPIC baz.c -o baz.os -building shared baz library (version 1.0) -cc -shared -Wl,-soname -Wl,libbaz.so.1 -o baz.so baz.os - -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -llua -lm -\prompt{\$} - \end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 6: Support for Lua programming language} - - \begin{block}{How it works} - \begin{CodeNoLabel} -\prompt{\$ mkcmake install DESTDIR=/tmp/fakeroot} - ... -\prompt{\$ find /tmp/fakeroot -type f} -/tmp/fakeroot/usr/pkg/bin/foobar -/tmp/fakeroot/usr/pkg/lib/lua/5.1/baz.so -/tmp/fakeroot/usr/pkg/share/lua/5.1/foo.lua -/tmp/fakeroot/usr/pkg/share/lua/5.1/bar.lua -\prompt{\$} - \end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 7: Custom tests and sizeof of system types} - -\begin{block}{Source code} -\begin{Code}{Makefile} -MKC\_CUSTOM\_DIR = \h{\$\{.CURDIR\}/checks} - -# m4 supports -P flag (GNU, NetBSD) -M4 ?= m4 # overridable (\h{gm4}) -MKC\_REQUIRE\_CUSTOM += m4P -MKC\_CUSTOM\_FN.m4P = \h{m4P.sh} -.export: M4 - -# \_\_attribute ((\{con,de\}structor)) -MKC\_REQUIRE\_CUSTOM += \h{constructor destructor} - -# sizeof -MKC\_CHECK\_SIZEOF = char short int long void* long-long - -LIB = mylib -CFLAGS += -DM4\_CMD='"\$\{M4\}"' -.include <mkc.lib.mk> -\end{Code} -\end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 7: Custom tests and sizeof of system types} - -\begin{block}{Source code} -\begin{Code}{Files in checks/ subdirectory} -\prompt{\$ ls checks/} -constructor.c -destructor.c -m4P.sh -\prompt{\$} -\end{Code} -\end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 7: Custom tests and sizeof of system types} - -\begin{block}{Source code} -\begin{Code}{checks/m4P.sh} -#!/bin/sh - -input ()\{ - cat <<'EOF' -m4\_define(fruit, apple) -fruit -EOF -\} - -M4=\$\{M4-m4\} - -if input | \$\{M4\} -P | grep \^{}apple > /dev/null; then - echo 1 -else - echo 0 -fi -\end{Code} -\end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 7: Custom tests and sizeof of system types} -\begin{block}{Source code} -\begin{Code}{checks/constructor.c} -void __attribute ((constructor)) - dummy (void) -\{ -\} -\end{Code} -\begin{Code}{checks/destructor.c} -void __attribute ((destructor)) - dummy (void) -\{ -\} -\end{Code} -\end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 7: Custom tests and sizeof of system types} - - \begin{block}{How it works on FreeBSD} - \begin{CodeNoLabel} -\prompt{\$ mkcmake} -checking for compiler type... gcc -checking for sizeof char... \h{1} -checking for sizeof short... \h{2} -checking for sizeof int... \h{4} -checking for sizeof long... \h{4} -checking for sizeof void*... \h{4} -checking for sizeof long long... \h{8} -checking for custom test \h{m4P... 0 (no)} -checking for custom test \h{constructor}... \h{1 (yes)} -checking for custom test \h{destructor}... \h{1 (yes)} -checking for program cc... /usr/bin/cc -\h{ERROR: custom test m4P failed} -*** Error code 1 -... -\prompt{\$} - \end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 7: Custom tests and sizeof of system types} - - \begin{block}{How it works on FreeBSD with GNU m4} - \begin{CodeNoLabel} -\prompt{\$ M4=gm4 mkcmake} -checking for compiler type... gcc -checking for sizeof char... 1 -checking for sizeof short... 2 -checking for sizeof int... 4 -checking for sizeof long... 4 -checking for sizeof void*... 4 -checking for sizeof long long... 8 -checking for custom test \h{m4P... 1 (yes)} -checking for custom test constructor... 1 (yes) -checking for custom test destructor... 1 (yes) -checking for program cc... /usr/bin/cc -... -\prompt{\$} - \end{CodeNoLabel} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 8: Portable version of AWK from NetBSD} - -\begin{block}{http://mova.org/\~{}cheusov/pub/mk-configure/nbawk/} -\begin{Code}{Makefile (part 1)} -PROG = awk -SRCS = awkgram.y b.c lex.c lib.c main.c parse.c - proctab.c run.c tran.c -YHEADER = yes - -MKC\_COMMON\_DEFINES.Linux = -D\_GNU\_SOURCE -MKC\_COMMON\_HEADERS = ctype.h stdio.h string.h -MKC\_CHECK\_FUNCS1 = \_\_fpurge:stdio\_ext.h fpurge isblank -MKC\_CHECK\_FUNCS3 = strlcat -MKC\_SOURCE\_FUNCLIBS = fpurge strlcat - -WARNS= 4 -WARNERR= no # do not treat warnings as errors - -MKC\_REQD= 0.19.0 # mk-configure>=0.19.0 is required -... # to be continued on the next slide -\end{Code} -\end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 8: Portable version of AWK from NetBSD} - -\begin{block}{http://mova.org/\~{}cheusov/pub/mk-configure/nbawk/} -\begin{Code}{Makefile (part 2)} -... # beginning is on the previous slide -\h{.include} <mkc.configure.mk> - -\h{.if} \$\{HAVE\_FUNC1.isblank:U0\} -CPPFLAGS += -DHAS\_ISBLANK -\h{.endif} - -\h{.if} !\$\{HAVE\_FUNC1.fpurge:U1\} && - !\$\{HAVE_FUNC1.\_\_fpurge.stdio\_ext\_h:U1\} -MKC\_ERR\_MSG+= "fpurge(3) cannot be found" -\h{.endif} - -CPPFLAGS += -I. -LDADD += -lm - -\h{.include} <mkc.prog.mk> -\end{Code} -\end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 8: Portable version of AWK from NetBSD} - -\begin{block}{run.c} -\begin{CodeNoLabelSmallest} ---- nbawk-20100903/run.c.orig -+++ nbawk-20100903/run.c -@@ -40,6 +40,14 @@ - #include "awk.h" - #include "awkgram.h" - -+#ifndef HAVE_FUNC1_FPURGE -+int fpurge (FILE *stream); -+#endif -+ -+#ifndef HAVE\_FUNC3\_STRLCAT -+size\_t strlcat(char *dst, const char *src, size_t size); -+#endif -+ - #define tempfree(x) if (istemp(x)) tfree(x); else - - void stdinit(void); -\end{CodeNoLabelSmallest} -\end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 8: Portable version of AWK from NetBSD} - -\begin{block}{fpurge.c} -\begin{CodeNoLabelSmallest} -#include <stdio.h> - -#if HAVE\_FUNC1\_\_\_FPURGE\_STDIO\_EXT\_H -#include <stdio\_ext.h> -#endif - -int fpurge(FILE *stream); - -int fpurge(FILE *stream) -\{ -#if HAVE\_FUNC1\_\_\_FPURGE\_STDIO\_EXT\_H - \_\_fpurge (stream); - return 0; -#else -#error "cannot find fpurge(3), sorry" -#endif -\} -\end{CodeNoLabelSmallest} -\end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 8: Portable version of AWK from NetBSD} - -\begin{block}{strlcpy.c} -\begin{CodeNoLabel} -If you need this code, you know where to get it from! ;-) -\end{CodeNoLabel} -\end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 8: Portable version of AWK from NetBSD} - -% \begin{block} -\begin{block}{How it works on Linux} -\begin{CodeNoLabel} -\prompt{\$ mkcmake} -checking for compiler type... gcc -checking for function fpurge... \h{no} -checking for function strlcat... \h{no} -checking for func __fpurge ( stdio_ext.h )... \h{yes} -checking for func fpurge... \h{no} -checking for func isblank... \h{yes} -checking for func strlcat... \h{no} -checking for program yacc... \h{/usr/bin/yacc} -... -cc \h{-Wall -Wstrict-prototypes ...} - -I. \h{-D\_GNU\_SOURCE} -c awkgram.c -... -cc -o awk awkgram.o ... \h{fpurge.o strlcat.o} -lm -\prompt{\$ ./awk} -usage: ./awk [-F fs] [-v var=value] [-f progfile - | 'prog'] [file ...] -\prompt{\$} -\end{CodeNoLabel} -\end{block} -Supported targets: all, clean, cleandir (distclean), install, -uninstall, installdirs, depend etc. -% \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Example 9: Cross-compilation} - -\begin{block}{How it works} -\begin{CodeNoLabel} -\prompt{\$ export SYSROOT=/tmp/destdir.sparc64} -\prompt{\$ export TOOLCHAIN\_PREFIX=sparc64--netbsd-} -\prompt{\$ export TOOLCHAIN\_DIR=/tmp/tooldir.sparc64/bin} -\prompt{\$ uname -srm} -NetBSD 5.99.56 amd64 -\prompt{\$ mkcmake} -checking for compiler type... gcc -/tmp/tooldir.sparc64/bin/sparc64--netbsd-gcc - --sysroot=/tmp/destdir.sparc64 -c hello.c -o hello.o -/tmp/tooldir.sparc64/bin/sparc64--netbsd-gcc - --sysroot=/tmp/destdir.sparc64 -o hello hello.o -\prompt{\$ file hello} -hello: ELF 64-bit MSB executable, SPARC V9, relaxed - memory ordering, (SYSV), dynamically linked (uses - shared libs), for NetBSD 5.99.56, not stripped -\prompt{\$ } -\end{CodeNoLabel} -\end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile] - \frametitle{Features} - \begin{block}{} - \begin{enumerate} - \item Automatic detection of OS features - (\ModuleName{mkc.configure.mk}) - \begin{itemize} - \item \h{header presence} (MKC\_\{CHECK,REQUIRE\}\_HEADERS) - \item \h{function declaration} (MKC\_\{CHECK,REQUIRE\}\_FUNCS[n]) - \item \h{type declaration} (MKC\_\{CHECK,REQUIRE\}\_TYPES) - \item \h{structure member} (MKC\_\{CHECK,REQUIRE\}\_MEMBERS) - \item \h{variable declaration} (MKC\_\{CHECK,REQUIRE\}\_VARS) - \item \h{define declaration} (MKC\_\{CHECK,REQUIRE\}\_DEFINES) - \item \h{type size} (MKC\_CHECK\_SIZEOF) - \item \h{function} implementation \h{in the library} - (MKC\_\{CHECK,REQUIRE\}\_FUNCLIBS and MKC\_SOURCE\_FUNCLIBS) - \item \h{checks for programs} (MKC\_\{CHECK,REQUIRE\}\_PROGS) - \item \h{user's custom checks} (MKC\_\{CHECK,REQUIRE\}\_CUSTOM) - \item \h{built-in checks} (MKC\_CHECK\_BUILTINS), e.g. endianess, - prog\_flex, prog\_bison, prog\_gawk or prog\_gm4) - \end{itemize} - \end{enumerate} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begin{frame}[fragile,t] - \frametitle{Features} - \begin{block}{} - \begin{enumerate} - \setcounter{enumi}{1} - \item Building, installing, uninstalling, cleaning - etc. Supported targets: \h{all}, \h{install}, - \h{uninstall}, - \h{clean}, \h{cleandir} (\h{distclean}), \h{installdirs}, \h{depend} - and others. - \item Building \h{standalone programs} (\ModuleName{mkc.prog.mk}), - \h{static, shared and dynamically loaded libraries} - (\ModuleName{mkc.lib.mk}) using \h{C}, - \h{C++}, \h{Objective C}, \h{Pascal} and \h{Fortran} compilers. - Shared libraries - support is provided for numerous OSes: \h{NetBSD}, \h{FreeBSD}, - \h{OpenBSD}, - \h{DragonFlyBSD}, \h{MirOS BSD}, \h{Linux}, \h{Solaris}, \h{Darwin} - (MacOS-X), \h{Interix}, \h{Tru64}, - \h{QNX}, \h{HP-UX}, \h{Cygwin} (no support for shared libraries - and DLLs yet) and - compilers: \h{GCC}, \h{Intel C/C++} compilers, \h{Portable C compiler} AKA - \h{pcc}, \h{DEC C/C++ compiler}, \h{HP C/C++ compiler}, - \h{Oracle SunStudio} and others. - \end{enumerate} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\begin{frame}[fragile,t] - \frametitle{Features} - \begin{block}{} - \begin{enumerate} - \setcounter{enumi}{3} - \item Handling \h{man} pages, \h{info} manuals and \h{POD} documents. - \item Handling \h{scripts} as well as \h{plain text files}, - i.e. installing, uninstalling and handling \h{.in files} - (replacing, for example, \h{@bindir@}, \h{@sysconfdir@}, \h{@version@} - fragments with real values). - \item \h{Cross-compilation}. mk-configure itself doesn't run - target system - executables, so you can freely use cross-tools (compiler, linker - etc.). You can also override/set any variable initialized by mk-configure. - \item Support for \h{pkg-config}. - \item Support for \h{Lua} programming language. - \item Support for \h{yacc} and \h{lex}. - \end{enumerate} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\begin{frame}[fragile,t] - \frametitle{Features} - \begin{block}{} - \begin{enumerate} - \setcounter{enumi}{10} - \item Support for projects with multiple subprojects - (\ModuleName{mkc.subprj.mk} and \ModuleName{mkc.subdir.mk}). - \item Special targets bin\_tar, bin\_targz, bin\_tarbz2, bin\_zip, - bin\_deb creates .tar, .tar.gz, .tar.bz2, .zip archives and .deb - package (on Debian Linux). - \item Parts of mk-configure functionality is - accesible via individual programs, e.g. \ProgName{mkc\_install}, - \ProgName{mkc\_check\_compiler}, - \ProgName{mkc\_check\_header}, \ProgName{mkc\_check\_funclib}, - \ProgName{mkc\_check\_decl}, - \ProgName{mkc\_check\_prog}, \ProgName{mkc\_check\_sizeof} and - \ProgName{mkc\_check\_custom}. - \end{enumerate} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\begin{frame}[fragile,t] - \frametitle{MK-CONFIGURE in real world} - \begin{block}{Packagers are welcome! ;-)} - \small - NetBSD make (bmake) is packaged in the following OSes: - \begin{itemize} - \item FreeBSD, pkgsrc (NetBSD, DragonFlyBSD...) (\h{devel/bmake}) - \item Gentoo Linux, Fedora Linux, AltLinux - \item Debian/Ubuntu\\ - deb http://mova.org/\~{}cheusov/pub/debian lenny main\\ - deb-src http://mova.org/\~{}cheusov/pub/debian lenny main - \end{itemize} - mk-configure is packaged in the following OSes - \begin{itemize} - \item FreeBSD, pkgsrc (NetBSD, DragonFlyBSD...) (\h{devel/mk-configure}) - \item Debian/Ubuntu\\ - deb http://mova.org/\~{}cheusov/pub/debian lenny main\\ - deb-src http://mova.org/\~{}cheusov/pub/debian lenny main - \end{itemize} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\begin{frame}[fragile,t] - \frametitle{MK-CONFIGURE in real world} - \begin{block}{Real life samples of use} - \begin{itemize} - \item Lightweight modular malloc Debugger.\\ - \URL{http://sourceforge.net/projects/lmdbg/} - \URL{http://pkgsrc.se/wip/lmdbg/}\\ - \item NetBSD version of AWK programming language, ported - to other Operating Systems.\\ - \URL{http://mova.org/\~{}cheusov/pub/mk-configure/nbawk/} - \item Modules support for AWK programming language\\ - \URL{http://sourceforge.net/projects/runawk/} - \URL{http://pkgsrc.se/lang/runawk/}\\ - \item Tool for distributing tasks over network or CPUs\\ - \URL{http://sourceforge.net/projects/paexec/} - \URL{http://pkgsrc.se/wip/paexec/}\\ - \end{itemize} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\begin{frame}[fragile,t] - \frametitle{MK-CONFIGURE in real world} - \begin{block}{Real life samples of use} - \begin{itemize} - \item Distributed fault tolerant bulk build tool for pkgsrc\\ - \URL{http://mova.org/\~{}cheusov/pub/distbb/}\\ - \URL{http://pkgsrc.se/wip/distbb/}\\ - \item Client/server package search system for pkgsrc\\ - \URL{http://mova.org/\~{}cheusov/pub/pkg\_online/} - \URL{http://pkgsrc.se/wip/pkg\_online-client/}\\ - \URL{http://pkgsrc.se/wip/pkg\_online-server/}\\ - \item Any project based on traditional - \ModuleName{bsd.\{prog,lib,subdir\}.mk} can easily be converted - to \MKC{mk-configure}. - \end{itemize} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%begin-myprojects - -\begin{frame}[fragile,t] - \frametitle{MK-CONFIGURE in real world} - \begin{block}{My opensource projects using - mk-configure (filled hexagon), Mk files (box) and others (oval)} - \begin{figure} - \includegraphics[width=\textwidth, height=0.60\textheight, keepaspectratio=false]{my_prjs.eps} - \end{figure} -% \begin{figure} -% \includegraphics[width=0.7\textwidth, height=0.10\textwidth, keepaspectratio=false]{my_prjs2.eps} -% \end{figure} - \end{block} -\end{frame} - -%%%end-myprojects - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\begin{frame}[fragile,t] - \frametitle{MK-C needs your help ;-)} - \begin{block}{} - \begin{itemize} - \item Packagers are welcome (Linux distros, OpenBSD etc.) - \item MK-C distribution contains \h{a lot of regression tests and - samples of use} (samples are used for testing too).\\ - \h{Shell accounts} on - "exotic" UNIX-like platforms are needed (AIX, HP-UX, non-ELF BSDs, - IRIX, Solaris, Hurd etc.) for testing and development. - \item Review of the documentation. At the moment only mk-configure(7), - samples/ and this presentation are available. - \item sf.net provides two mailing lists:\\ - \h{mk-configure-help} and \h{mk-configure-discuss}. - \item TODO file in the distribution is full of tasks. - \end{itemize} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\begin{frame}[fragile] - \frametitle{} - \begin{block}{} - \begin{center} - \Huge{The END.} - \end{center} - \end{block} -\end{frame} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%begin-myprojects - -\end{document} - -%%%end-myprojects |