1# 2# Library Makefile for CUPS. 3# 4# Copyright © 2007-2018 by Apple Inc. 5# Copyright © 1997-2006 by Easy Software Products, all rights reserved. 6# 7# These coded instructions, statements, and computer programs are the 8# property of Apple Inc. and are protected by Federal copyright 9# law. Distribution and use rights are outlined in the file "LICENSE.txt" 10# which should have been included with this file. If this file is 11# missing or damaged, see the license at "http://www.cups.org/". 12# 13# This file is subject to the Apple OS-Developed Software exception. 14# 15 16include ../Makedefs 17 18 19# 20# Options to build libcups without the use of deprecated APIs... 21# 22 23OPTIONS = -D_CUPS_NO_DEPRECATED=1 -D_PPD_DEPRECATED="" 24 25 26# 27# Object files... 28# 29 30LIBOBJS = \ 31 adminutil.o \ 32 array.o \ 33 auth.o \ 34 backchannel.o \ 35 backend.o \ 36 debug.o \ 37 dest.o \ 38 dest-job.o \ 39 dest-localization.o \ 40 dest-options.o \ 41 dir.o \ 42 encode.o \ 43 file.o \ 44 getdevices.o \ 45 getifaddrs.o \ 46 getputfile.o \ 47 globals.o \ 48 hash.o \ 49 http.o \ 50 http-addr.o \ 51 http-addrlist.o \ 52 http-support.o \ 53 ipp.o \ 54 ipp-support.o \ 55 langprintf.o \ 56 language.o \ 57 md5.o \ 58 md5passwd.o \ 59 notify.o \ 60 options.o \ 61 ppd.o \ 62 ppd-attr.o \ 63 ppd-cache.o \ 64 ppd-conflicts.o \ 65 ppd-custom.o \ 66 ppd-emit.o \ 67 ppd-localize.o \ 68 ppd-mark.o \ 69 ppd-page.o \ 70 ppd-util.o \ 71 pwg-media.o \ 72 request.o \ 73 sidechannel.o \ 74 snmp.o \ 75 snprintf.o \ 76 string.o \ 77 tempfile.o \ 78 thread.o \ 79 tls.o \ 80 transcode.o \ 81 usersys.o \ 82 util.o 83TESTOBJS = \ 84 testadmin.o \ 85 testarray.o \ 86 testcache.o \ 87 testconflicts.o \ 88 testcreds.o \ 89 testcups.o \ 90 testdest.o \ 91 testfile.o \ 92 testgetdests.o \ 93 testhttp.o \ 94 testi18n.o \ 95 testipp.o \ 96 testoptions.o \ 97 testlang.o \ 98 testppd.o \ 99 testpwg.o \ 100 testsnmp.o \ 101 tlscheck.o 102OBJS = \ 103 $(LIBOBJS) \ 104 $(TESTOBJS) 105 106 107# 108# Header files to install... 109# 110 111HEADERS = \ 112 adminutil.h \ 113 array.h \ 114 backend.h \ 115 cups.h \ 116 dir.h \ 117 file.h \ 118 http.h \ 119 ipp.h \ 120 language.h \ 121 ppd.h \ 122 pwg.h \ 123 raster.h \ 124 sidechannel.h \ 125 transcode.h \ 126 versioning.h 127 128HEADERSPRIV = \ 129 array-private.h \ 130 cups-private.h \ 131 debug-private.h \ 132 file-private.h \ 133 http-private.h \ 134 ipp-private.h \ 135 language-private.h \ 136 md5-private.h \ 137 ppd-private.h \ 138 pwg-private.h \ 139 raster-private.h \ 140 snmp-private.h \ 141 string-private.h \ 142 thread-private.h 143 144 145# 146# Targets in this directory... 147# 148 149LIBTARGETS = \ 150 $(LIBCUPSSTATIC) \ 151 $(LIBCUPS) 152 153UNITTARGETS = \ 154 testadmin \ 155 testarray \ 156 testcache \ 157 testconflicts \ 158 testcreds \ 159 testcups \ 160 testdest \ 161 testfile \ 162 testgetdests \ 163 testhttp \ 164 testi18n \ 165 testipp \ 166 testlang \ 167 testoptions \ 168 testppd \ 169 testpwg \ 170 testsnmp \ 171 tlscheck 172 173TARGETS = \ 174 $(LIBTARGETS) 175 176 177# 178# Make all targets... 179# 180 181all: $(TARGETS) 182 183 184# 185# Make library targets... 186# 187 188libs: $(LIBTARGETS) 189 190 191# 192# Make unit tests... 193# 194 195unittests: $(UNITTARGETS) 196 197 198# 199# Remove object and target files... 200# 201 202clean: 203 $(RM) $(OBJS) $(TARGETS) $(UNITTARGETS) 204 $(RM) libcups.so libcups.dylib 205 206 207# 208# Update dependencies (without system header dependencies...) 209# 210 211depend: 212 $(CC) -MM $(ALL_CFLAGS) $(OBJS:.o=.c) >Dependencies 213 214 215# 216# Run oclint to check code coverage... 217# 218 219oclint: 220 oclint -o=oclint.html -html $(LIBOBJS:.o=.c) -- $(ALL_CFLAGS) 221 222 223# 224# Install all targets... 225# 226 227install: all install-data install-headers install-libs install-exec 228 229 230# 231# Install data files... 232# 233 234install-data: 235 236 237# 238# Install programs... 239# 240 241install-exec: 242 243 244# 245# Install headers... 246# 247 248install-headers: 249 echo Installing header files into $(INCLUDEDIR)/cups... 250 $(INSTALL_DIR) -m 755 $(INCLUDEDIR)/cups 251 for file in $(HEADERS); do \ 252 $(INSTALL_DATA) $$file $(INCLUDEDIR)/cups; \ 253 done 254 if test "x$(privateinclude)" != x; then \ 255 echo Installing private header files into $(PRIVATEINCLUDE)...; \ 256 $(INSTALL_DIR) -m 755 $(PRIVATEINCLUDE); \ 257 for file in $(HEADERSPRIV); do \ 258 $(INSTALL_DATA) $$file $(PRIVATEINCLUDE)/$$file; \ 259 done; \ 260 fi 261 262 263# 264# Install libraries... 265# 266 267install-libs: $(INSTALLSTATIC) 268 echo Installing libraries in $(LIBDIR)... 269 $(INSTALL_DIR) -m 755 $(LIBDIR) 270 $(INSTALL_LIB) $(LIBCUPS) $(LIBDIR) 271 if test $(LIBCUPS) = "libcups.so.2"; then \ 272 $(RM) $(LIBDIR)/`basename $(LIBCUPS) .2`; \ 273 $(LN) $(LIBCUPS) $(LIBDIR)/`basename $(LIBCUPS) .2`; \ 274 fi 275 if test $(LIBCUPS) = "libcups.2.dylib"; then \ 276 $(RM) $(LIBDIR)/libcups.dylib; \ 277 $(LN) $(LIBCUPS) $(LIBDIR)/libcups.dylib; \ 278 fi 279 if test "x$(SYMROOT)" != "x"; then \ 280 $(INSTALL_DIR) $(SYMROOT); \ 281 cp $(LIBCUPS) $(SYMROOT); \ 282 dsymutil $(SYMROOT)/$(LIBCUPS); \ 283 fi 284 285installstatic: 286 $(INSTALL_DIR) -m 755 $(LIBDIR) 287 $(INSTALL_LIB) -m 755 $(LIBCUPSSTATIC) $(LIBDIR) 288 $(RANLIB) $(LIBDIR)/$(LIBCUPSSTATIC) 289 $(CHMOD) 555 $(LIBDIR)/$(LIBCUPSSTATIC) 290 291 292# 293# Uninstall object and target files... 294# 295 296uninstall: 297 $(RM) $(LIBDIR)/libcups.2.dylib 298 $(RM) $(LIBDIR)/$(LIBCUPSSTATIC) 299 $(RM) $(LIBDIR)/libcups.dylib 300 $(RM) $(LIBDIR)/libcups.so 301 $(RM) $(LIBDIR)/libcups.so.2 302 -$(RMDIR) $(LIBDIR) 303 for file in $(HEADERS); do \ 304 $(RM) $(INCLUDEDIR)/cups/$$file; \ 305 done 306 -$(RMDIR) $(INCLUDEDIR)/cups 307 308 309# 310# libcups.so.2 311# 312 313libcups.so.2: $(LIBOBJS) 314 echo Linking $@... 315 $(DSO) $(ARCHFLAGS) $(LDFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBGSSAPI) \ 316 $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 317 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 318 $(RM) `basename $@ .2` 319 $(LN) $@ `basename $@ .2` 320 321 322# 323# libcups.2.dylib 324# 325 326libcups.2.dylib: $(LIBOBJS) $(LIBCUPSORDER) 327 echo Creating export list for $@... 328 nm -gm $(LIBOBJS) 2>/dev/null | grep "__text" | grep -v weak | \ 329 awk '{print $$NF}' | \ 330 grep -v -E -e '^(_cupsConnect|_cupsCharset|_cupsEncodingName|_cupsSetDefaults|_cupsSetHTTPError|_cupsUserDefault)$$' | \ 331 sort >t.exp 332 echo Linking $@... 333 $(DSO) $(ARCHFLAGS) $(LDFLAGS) $(DSOFLAGS) -o $@ \ 334 -install_name $(libdir)/$@ \ 335 -current_version 2.13.0 \ 336 -compatibility_version 2.0.0 \ 337 -exported_symbols_list t.exp \ 338 $(LIBOBJS) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ 339 $(COMMONLIBS) $(LIBZ) 340 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 341 $(RM) libcups.dylib t.exp 342 $(LN) $@ libcups.dylib 343 344 345# 346# libcups.la 347# 348 349libcups.la: $(LIBOBJS) 350 echo Linking $@... 351 $(LD_CC) $(ARCHFLAGS) $(LDFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) \ 352 -rpath $(LIBDIR) -version-info 2:13 $(LIBGSSAPI) $(SSLLIBS) \ 353 $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 354 355 356# 357# libcups.a 358# 359 360libcups.a: $(LIBOBJS) 361 echo Archiving $@... 362 $(RM) $@ 363 $(AR) $(ARFLAGS) $@ $(LIBOBJS) 364 $(RANLIB) $@ 365 366 367# 368# libcups2.def (Windows DLL exports file...) 369# 370 371libcups2.def: $(LIBOBJS) Makefile 372 echo Generating $@... 373 echo "LIBRARY libcups2" >libcups2.def 374 echo "VERSION 2.13" >>libcups2.def 375 echo "EXPORTS" >>libcups2.def 376 (nm $(LIBOBJS) 2>/dev/null | grep "T _" | awk '{print $$3}'; \ 377 echo __cups_strcpy; echo __cups_strlcat; echo __cups_strlcpy) | \ 378 grep -v -E \ 379 -e 'cups_debug|Apple|BackChannel|Backend|FileCheck|Filter|GSSService|SetNegotiate|SideChannel|SNMP' \ 380 -e 'Block$$' | \ 381 sed -e '1,$$s/^_//' | sort >>libcups2.def 382 383 384# 385# testadmin (dependency on static CUPS library is intentional) 386# 387 388testadmin: testadmin.o $(LIBCUPSSTATIC) 389 echo Linking $@... 390 $(LD_CC) $(LDFLAGS) -o $@ testadmin.o $(LIBCUPSSTATIC) \ 391 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 392 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 393 394 395# 396# testarray (dependency on static CUPS library is intentional) 397# 398 399testarray: testarray.o $(LIBCUPSSTATIC) 400 echo Linking $@... 401 $(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testarray.o $(LIBCUPSSTATIC) \ 402 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 403 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 404 echo Running array API tests... 405 ./testarray 406 407 408# 409# testcache (dependency on static CUPS library is intentional) 410# 411 412testcache: testcache.o $(LIBCUPSSTATIC) 413 echo Linking $@... 414 $(LD_CC) $(LDFLAGS) -o $@ testcache.o $(LIBCUPSSTATIC) \ 415 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 416 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 417 418 419# 420# testconflicts (dependency on static CUPS library is intentional) 421# 422 423testconflicts: testconflicts.o $(LIBCUPSSTATIC) 424 echo Linking $@... 425 $(LD_CC) $(LDFLAGS) -o $@ testconflicts.o $(LIBCUPSSTATIC) \ 426 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 427 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 428 429 430# 431# testcreds (dependency on static CUPS library is intentional) 432# 433 434testcreds: testcreds.o $(LIBCUPSSTATIC) 435 echo Linking $@... 436 $(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testcreds.o $(LIBCUPSSTATIC) \ 437 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 438 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 439 440 441# 442# testcups (dependency on static CUPS library is intentional) 443# 444 445testcups: testcups.o $(LIBCUPSSTATIC) 446 echo Linking $@... 447 $(LD_CC) $(LDFLAGS) -o $@ testcups.o $(LIBCUPSSTATIC) \ 448 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 449 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 450 451 452# 453# testdest (dependency on static CUPS library is intentional) 454# 455 456testdest: testdest.o $(LIBCUPSSTATIC) 457 echo Linking $@... 458 $(LD_CC) $(LDFLAGS) -o $@ testdest.o $(LIBCUPSSTATIC) \ 459 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 460 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 461 462 463# 464# testfile (dependency on static CUPS library is intentional) 465# 466 467testfile: testfile.o $(LIBCUPSSTATIC) 468 echo Linking $@... 469 $(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testfile.o $(LIBCUPSSTATIC) \ 470 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 471 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 472 echo Running file API tests... 473 ./testfile 474 475 476# 477# testgetdests (dependency on static CUPS library is intentional) 478# 479 480testgetdests: testgetdests.o $(LIBCUPSSTATIC) 481 echo Linking $@... 482 $(LD_CC) $(LDFLAGS) -o $@ testgetdests.o $(LIBCUPSSTATIC) \ 483 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 484 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 485 486 487# 488# testhttp (dependency on static CUPS library is intentional) 489# 490 491testhttp: testhttp.o $(LIBCUPSSTATIC) 492 echo Linking $@... 493 $(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testhttp.o $(LIBCUPSSTATIC) \ 494 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 495 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 496 echo Running HTTP API tests... 497 ./testhttp 498 499 500# 501# testipp (dependency on static CUPS library is intentional) 502# 503 504testipp: testipp.o $(LIBCUPSSTATIC) 505 echo Linking $@... 506 $(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testipp.o $(LIBCUPSSTATIC) \ 507 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 508 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 509 echo Running IPP API tests... 510 ./testipp 511 512 513# 514# testi18n (dependency on static CUPS library is intentional) 515# 516 517testi18n: testi18n.o $(LIBCUPSSTATIC) 518 echo Linking $@... 519 $(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testi18n.o $(LIBCUPSSTATIC) \ 520 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 521 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 522 echo Running internationalization API tests... 523 ./testi18n 524 525 526# 527# testlang (dependency on static CUPS library is intentional) 528# 529 530testlang: testlang.o $(LIBCUPSSTATIC) 531 echo Linking $@... 532 $(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testlang.o $(LIBCUPSSTATIC) \ 533 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 534 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 535 echo Creating locale directory structure... 536 $(RM) -r locale 537 $(MKDIR) locale/en 538 echo 'msgid "No"' > locale/en/cups_en.po 539 echo 'msgstr "No"' >> locale/en/cups_en.po 540 echo 'msgid "Yes"' >> locale/en/cups_en.po 541 echo 'msgstr "Yes"' >> locale/en/cups_en.po 542 for po in ../locale/cups_*.po; do \ 543 lang=`basename $$po .po | sed -e '1,$$s/^cups_//'`; \ 544 $(MKDIR) locale/$$lang; \ 545 $(LN) ../../$$po locale/$$lang; \ 546 done 547 echo Running language API tests... 548 LOCALEDIR=locale ./testlang 549 550 551# 552# testoptions (dependency on static CUPS library is intentional) 553# 554 555testoptions: testoptions.o $(LIBCUPSSTATIC) 556 echo Linking $@... 557 $(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testoptions.o $(LIBCUPSSTATIC) \ 558 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 559 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 560 echo Running option API tests... 561 ./testoptions 562 563 564# 565# testppd (dependency on static CUPS library is intentional) 566# 567 568testppd: testppd.o $(LIBCUPSSTATIC) test.ppd test2.ppd 569 echo Linking $@... 570 $(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testppd.o $(LIBCUPSSTATIC) \ 571 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 572 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 573 echo Running PPD API tests... 574 ./testppd 575 576 577# 578# testpwg (dependency on static CUPS library is intentional) 579# 580 581testpwg: testpwg.o $(LIBCUPSSTATIC) test.ppd 582 echo Linking $@... 583 $(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testpwg.o $(LIBCUPSSTATIC) \ 584 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 585 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 586 echo Running PWG API tests... 587 ./testpwg test.ppd 588 589 590# 591# testsnmp (dependency on static CUPS library is intentional) 592# 593 594testsnmp: testsnmp.o $(LIBCUPSSTATIC) 595 echo Linking $@... 596 $(LD_CC) $(LDFLAGS) -o $@ testsnmp.o $(LIBCUPSSTATIC) \ 597 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 598 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 599 600 601# 602# tlscheck (dependency on static CUPS library is intentional) 603# 604 605tlscheck: tlscheck.o $(LIBCUPSSTATIC) 606 echo Linking $@... 607 $(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ tlscheck.o $(LIBCUPSSTATIC) \ 608 $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) 609 $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ 610 611 612# 613# Automatic API help files... 614# 615 616apihelp: 617 echo Generating CUPS API help files... 618 $(RM) cupspm.xml 619 mxmldoc --section "Programming" --body cupspm.md \ 620 cupspm.xml \ 621 auth.c cups.h dest*.c encode.c http.h http*.c ipp.h ipp*.c \ 622 options.c tls-darwin.c usersys.c util.c \ 623 --coverimage cupspm.png \ 624 --epub ../doc/help/cupspm.epub 625 mxmldoc --section "Programming" --body cupspm.md \ 626 cupspm.xml > ../doc/help/cupspm.html 627 $(RM) cupspm.xml 628 mxmldoc --section "Programming" --title "Administration APIs" \ 629 --css ../doc/cups-printable.css \ 630 --header api-admin.header --intro api-admin.shtml \ 631 api-admin.xml \ 632 adminutil.c adminutil.h getdevices.c >../doc/help/api-admin.html 633 $(RM) api-admin.xml 634 mxmldoc --section "Programming" --title "PPD API (DEPRECATED)" \ 635 --css ../doc/cups-printable.css \ 636 --header api-ppd.header --intro api-ppd.shtml \ 637 api-ppd.xml ppd.h ppd-*.c >../doc/help/api-ppd.html 638 $(RM) api-ppd.xml 639 mxmldoc --section "Programming" \ 640 --title "Filter and Backend Programming" \ 641 --css ../doc/cups-printable.css \ 642 --header api-filter.header --intro api-filter.shtml \ 643 api-filter.xml \ 644 backchannel.c backend.h backend.c sidechannel.c sidechannel.h \ 645 >../doc/help/api-filter.html 646 $(RM) api-filter.xml 647 648 649# 650# Lines of code computation... 651# 652 653sloc: 654 echo "libcups: \c" 655 sloccount $(LIBOBJS:.o=.c) 2>/dev/null | grep "Total Physical" | awk '{print $$9}' 656 657 658# 659# Dependencies... 660# 661 662include Dependencies 663tls.o: tls-darwin.c tls-gnutls.c tls-sspi.c 664