/Build.PL

http://github.com/PerlGameDev/SDL · Perl · 647 lines · 553 code · 20 blank · 74 comment · 1 complexity · 46b0b963c626c4caa1c1c428012ed3b9 MD5 · raw file

  1. #! perl -w
  2. #
  3. # Copyright (C) 2003 chromatic
  4. # Copyright (C) 2004 David J. Goehrig
  5. # Copyright (C) 2010 Kartik Thakore
  6. use strict;
  7. use warnings;
  8. use Carp;
  9. use lib 'inc';
  10. use Alien::SDL;
  11. print STDERR <<BROKENMSG;
  12. *************************** !!!WARNING!!! ********************************
  13. This Release breaks back compatibility support with versions 2.4x and below
  14. **************************************************************************
  15. BROKENMSG
  16. ### We need the platform-specific module
  17. my %platforms = (
  18. MSWin32 => 'Windows',
  19. MacOS => 'Darwin',
  20. darwin => 'Darwin',
  21. cygwin => 'Unix',
  22. freebsd => 'Unix',
  23. gnukfreebsd => 'Unix',
  24. linux => 'Unix',
  25. netbsd => 'Unix',
  26. openbsd => 'Unix',
  27. solaris => 'Unix',
  28. );
  29. my $package = 'My::Builder::' . ( $platforms{$^O} || 'Unix' );
  30. print "Using '$package' class ...\n";
  31. eval "require $package" or Carp::confess "Require '$package' failed: $@\n";
  32. ### Subsystems to build
  33. # <subsystem>
  34. # <file> = hash of the following 2 values:
  35. # <from> = location of source file
  36. # <to> = location of build file to get name right
  37. # <libraries> = list reqiured libraries, names the same as keys to hash %libraries
  38. my %subsystems = (
  39. SDL => {
  40. file => {
  41. from => 'src/SDL.xs',
  42. to => 'lib/SDL_perl.xs',
  43. },
  44. libraries => [qw( SDL )],
  45. },
  46. Time => {
  47. file => {
  48. from => 'src/Core/Time.xs',
  49. to => 'lib/SDL/Time.xs',
  50. },
  51. libraries => [qw( SDL )],
  52. },
  53. Events => {
  54. file => {
  55. from => 'src/Core/Events.xs',
  56. to => 'lib/SDL/Events.xs',
  57. },
  58. libraries => [qw( SDL )],
  59. },
  60. Event => {
  61. file => {
  62. from => 'src/Core/objects/Event.xs',
  63. to => 'lib/SDL/Event.xs',
  64. },
  65. libraries => [qw( SDL )],
  66. },
  67. GFX => {
  68. file => {
  69. from => 'src/GFX/GFX.xs',
  70. to => 'lib/SDL/GFX.xs',
  71. },
  72. libraries => [qw( SDL SDL_gfx_primitives )],
  73. },
  74. BlitFunc => {
  75. file => {
  76. from => 'src/GFX/BlitFunc.xs',
  77. to => 'lib/SDL/GFX/BlitFunc.xs',
  78. },
  79. libraries => [qw( SDL SDL_gfx_blitfunc )],
  80. },
  81. Framerate => {
  82. file => {
  83. from => 'src/GFX/Framerate.xs',
  84. to => 'lib/SDL/GFX/Framerate.xs',
  85. },
  86. libraries => [qw( SDL SDL_gfx_framerate )],
  87. },
  88. FPSManager => {
  89. file => {
  90. from => 'src/GFX/FPSManager.xs',
  91. to => 'lib/SDL/GFX/FPSManager.xs',
  92. },
  93. libraries => [qw( SDL SDL_gfx_framerate )],
  94. },
  95. ImageFilter => {
  96. file => {
  97. from => 'src/GFX/ImageFilter.xs',
  98. to => 'lib/SDL/GFX/ImageFilter.xs',
  99. },
  100. libraries => [qw( SDL SDL_gfx_imagefilter )],
  101. },
  102. Primitives => {
  103. file => {
  104. from => 'src/GFX/Primitives.xs',
  105. to => 'lib/SDL/GFX/Primitives.xs',
  106. },
  107. libraries => [qw( SDL SDL_gfx_primitives )],
  108. },
  109. Rotozoom => {
  110. file => {
  111. from => 'src/GFX/Rotozoom.xs',
  112. to => 'lib/SDL/GFX/Rotozoom.xs',
  113. },
  114. libraries => [qw( SDL SDL_gfx_rotozoom )],
  115. },
  116. MultiThread => {
  117. file => {
  118. from => 'src/Core/MultiThread.xs',
  119. to => 'lib/SDL/MultiThread.xs',
  120. },
  121. libraries => [qw( SDL )],
  122. },
  123. Video => {
  124. file => {
  125. from => 'src/Core/Video.xs',
  126. to => 'lib/SDL/Video.xs',
  127. },
  128. libraries => [qw( SDL )],
  129. },
  130. Audio => {
  131. file => {
  132. from => 'src/Core/Audio.xs',
  133. to => 'lib/SDL/Audio.xs',
  134. },
  135. libraries => [qw( SDL )],
  136. },
  137. Rect => {
  138. file => {
  139. from => 'src/Core/objects/Rect.xs',
  140. to => 'lib/SDL/Rect.xs',
  141. },
  142. libraries => [qw( SDL )],
  143. },
  144. Color => {
  145. file => {
  146. from => 'src/Core/objects/Color.xs',
  147. to => 'lib/SDL/Color.xs',
  148. },
  149. libraries => [qw( SDL )],
  150. },
  151. Surface => {
  152. file => {
  153. from => 'src/Core/objects/Surface.xs',
  154. to => 'lib/SDL/Surface.xs',
  155. },
  156. libraries => [qw( SDL )],
  157. },
  158. SurfaceX => {
  159. file => {
  160. from => 'src/SDLx/Surface.xs',
  161. to => 'lib/SDLx/Surface.xs',
  162. },
  163. libraries => [qw( SDL SDL_gfx_primitives )],
  164. },
  165. TimerX => {
  166. file => {
  167. from => 'src/SDLx/Timer.xs',
  168. to => 'lib/SDLx/Controller/Timer.xs',
  169. },
  170. libraries => [qw( SDL )],
  171. },
  172. ValidateX => {
  173. file => {
  174. from => 'src/SDLx/Validate.xs',
  175. to => 'lib/SDLx/Validate.xs',
  176. },
  177. libraries => [qw( SDL )],
  178. },
  179. InterfaceX => {
  180. file => {
  181. from => 'src/SDLx/Controller/Interface.xs',
  182. to => 'lib/SDLx/Controller/Interface.xs',
  183. },
  184. libraries => [qw( SDL )],
  185. },
  186. StateX => {
  187. file => {
  188. from => 'src/SDLx/Controller/State.xs',
  189. to => 'lib/SDLx/Controller/State.xs',
  190. },
  191. libraries => [qw( SDL )],
  192. },
  193. Overlay => {
  194. file => {
  195. from => 'src/Core/objects/Overlay.xs',
  196. to => 'lib/SDL/Overlay.xs',
  197. },
  198. libraries => [qw( SDL )],
  199. },
  200. RWOps => {
  201. file => {
  202. from => 'src/Core/objects/RWOps.xs',
  203. to => 'lib/SDL/RWOps.xs',
  204. },
  205. libraries => [qw( SDL )],
  206. },
  207. PixelFormat => {
  208. file => {
  209. from => 'src/Core/objects/PixelFormat.xs',
  210. to => 'lib/SDL/PixelFormat.xs',
  211. },
  212. libraries => [qw( SDL )],
  213. },
  214. LayerManagerX => {
  215. file => {
  216. from => 'src/SDLx/LayerManager.xs',
  217. to => 'lib/SDLx/LayerManager.xs',
  218. },
  219. libraries => [qw( SDL )],
  220. },
  221. LayerX => {
  222. file => {
  223. from => 'src/SDLx/Layer.xs',
  224. to => 'lib/SDLx/Layer.xs',
  225. },
  226. libraries => [qw( SDL SDL_image )],
  227. },
  228. AudioSpec => {
  229. file => {
  230. from => 'src/Core/objects/AudioSpec.xs',
  231. to => 'lib/SDL/AudioSpec.xs',
  232. },
  233. libraries => [qw( SDL )],
  234. },
  235. AudioCVT => {
  236. file => {
  237. from => 'src/Core/objects/AudioCVT.xs',
  238. to => 'lib/SDL/AudioCVT.xs',
  239. },
  240. libraries => [qw( SDL )],
  241. },
  242. Mixer => {
  243. file => {
  244. from => 'src/Mixer/Mixer.xs',
  245. to => 'lib/SDL/Mixer.xs',
  246. },
  247. libraries => [qw( SDL SDL_mixer )],
  248. },
  249. MixerSamples => {
  250. file => {
  251. from => 'src/Mixer/Samples.xs',
  252. to => 'lib/SDL/Mixer/Samples.xs',
  253. },
  254. libraries => [qw( SDL SDL_mixer )],
  255. },
  256. MixerChannels => {
  257. file => {
  258. from => 'src/Mixer/Channels.xs',
  259. to => 'lib/SDL/Mixer/Channels.xs',
  260. },
  261. libraries => [qw( SDL SDL_mixer )],
  262. },
  263. MixerGroups => {
  264. file => {
  265. from => 'src/Mixer/Groups.xs',
  266. to => 'lib/SDL/Mixer/Groups.xs',
  267. },
  268. libraries => [qw( SDL SDL_mixer )],
  269. },
  270. MixerMusic => {
  271. file => {
  272. from => 'src/Mixer/Music.xs',
  273. to => 'lib/SDL/Mixer/Music.xs',
  274. },
  275. libraries => [qw( SDL SDL_mixer )],
  276. },
  277. MixerEffects => {
  278. file => {
  279. from => 'src/Mixer/Effects.xs',
  280. to => 'lib/SDL/Mixer/Effects.xs',
  281. },
  282. libraries => [qw( SDL SDL_mixer )],
  283. },
  284. MixChunk => {
  285. file => {
  286. from => 'src/Mixer/objects/MixChunk.xs',
  287. to => 'lib/SDL/Mixer/MixChunk.xs',
  288. },
  289. libraries => [qw( SDL SDL_mixer )],
  290. },
  291. MixMusic => {
  292. file => {
  293. from => 'src/Mixer/objects/MixMusic.xs',
  294. to => 'lib/SDL/Mixer/MixMusic.xs',
  295. },
  296. libraries => [qw( SDL SDL_mixer )],
  297. },
  298. Palette => {
  299. file => {
  300. from => 'src/Core/objects/Palette.xs',
  301. to => 'lib/SDL/Palette.xs',
  302. },
  303. libraries => [qw( SDL )],
  304. },
  305. VideoInfo => {
  306. file => {
  307. from => 'src/Core/objects/VideoInfo.xs',
  308. to => 'lib/SDL/VideoInfo.xs',
  309. },
  310. libraries => [qw( SDL )],
  311. },
  312. Mouse => {
  313. file => {
  314. from => 'src/Core/Mouse.xs',
  315. to => 'lib/SDL/Mouse.xs',
  316. },
  317. libraries => [qw( SDL )],
  318. },
  319. Cursor => {
  320. file => {
  321. from => 'src/Core/objects/Cursor.xs',
  322. to => 'lib/SDL/Cursor.xs',
  323. },
  324. libraries => [qw( SDL )],
  325. },
  326. Joystick => {
  327. file => {
  328. from => 'src/Core/Joystick.xs',
  329. to => 'lib/SDL/Joystick.xs',
  330. },
  331. libraries => [qw( SDL )],
  332. },
  333. CDROM => {
  334. file => {
  335. from => 'src/Core/CDROM.xs',
  336. to => 'lib/SDL/CDROM.xs',
  337. },
  338. libraries => [qw( SDL )],
  339. },
  340. CDTrack => {
  341. file => {
  342. from => 'src/Core/objects/CDTrack.xs',
  343. to => 'lib/SDL/CDTrack.xs',
  344. },
  345. libraries => [qw( SDL )],
  346. },
  347. CD => {
  348. file => {
  349. from => 'src/Core/objects/CD.xs',
  350. to => 'lib/SDL/CD.xs',
  351. },
  352. libraries => [qw( SDL )],
  353. },
  354. TTF => {
  355. file => {
  356. from => 'src/TTF/TTF.xs',
  357. to => 'lib/SDL/TTF.xs',
  358. },
  359. libraries => [qw( SDL SDL_ttf )],
  360. },
  361. TTF_Font => {
  362. file => {
  363. from => 'src/TTF/objects/Font.xs',
  364. to => 'lib/SDL/TTF/Font.xs',
  365. },
  366. libraries => [qw( SDL SDL_ttf )],
  367. },
  368. Version => {
  369. file => {
  370. from => 'src/Core/objects/Version.xs',
  371. to => 'lib/SDL/Version.xs',
  372. },
  373. libraries => [qw( SDL )],
  374. },
  375. Image => {
  376. file => {
  377. from => 'src/Image.xs',
  378. to => 'lib/SDL/Image.xs',
  379. },
  380. libraries => [qw( SDL SDL_image )],
  381. },
  382. SFont => {
  383. file => {
  384. from => 'src/SDLx/SFont.xs',
  385. to => 'lib/SDLx/SFont.xs',
  386. },
  387. libraries => [qw( SDL SDL_image )],
  388. },
  389. # SMPEG => {
  390. # file => {
  391. # from => 'src/SMPEG.xs',
  392. # to => 'lib/SDL/SMPEG.xs',
  393. # },
  394. # libraries => [qw( SDL smpeg)],
  395. # },
  396. # MPEG => {
  397. # file => {
  398. # from => 'src/SMPEG/Info.xs',
  399. # to => 'lib/SDL/SMPEG/Info.xs',
  400. # },
  401. # libraries => [qw( SDL smpeg)],
  402. # },
  403. Pango => {
  404. file => {
  405. from => 'src/Pango/Pango.xs',
  406. to => 'lib/SDL/Pango.xs',
  407. },
  408. libraries => [qw( SDL SDL_Pango )],
  409. },
  410. Context => {
  411. file => {
  412. from => 'src/Pango/objects/Context.xs',
  413. to => 'lib/SDL/Pango/Context.xs',
  414. },
  415. libraries => [qw( SDL SDL_Pango )],
  416. },
  417. # Net => {
  418. # file => {
  419. # from => 'src/Net/Net.xs',
  420. # to => 'lib/SDL/Net.xs',
  421. # },
  422. # libraries => [qw( SDL SDL_net )],
  423. # },
  424. # TCP => {
  425. # file => {
  426. # from => 'src/Net/TCP.xs',
  427. # to => 'lib/SDL/Net/TCP.xs',
  428. # },
  429. # libraries => [qw( SDL SDL_net )],
  430. # },
  431. # UDP => {
  432. # file => {
  433. # from => 'src/Net/UDP.xs',
  434. # to => 'lib/SDL/Net/UDP.xs',
  435. # },
  436. # libraries => [qw( SDL SDL_net )],
  437. # },
  438. # IPaddress => {
  439. # file => {
  440. # from => 'src/Net/objects/IPaddress.xs',
  441. # to => 'lib/SDL/Net/IPaddress.xs',
  442. # },
  443. # libraries => [qw( SDL SDL_net )],
  444. # },
  445. );
  446. ### External libraries
  447. # <library name> = symbolic library name
  448. # <define> = value that will be used as -D<value> option when compiling XS code
  449. # <header> = header related to the library that will be used for avalability detection,
  450. # could be a sigle value or an array of values
  451. # <lib> = value that will be used as -l<value> option when linking XS code
  452. my %libraries = (
  453. SDL => {
  454. define => 'HAVE_SDL',
  455. header => 'SDL.h',
  456. lib => 'SDL',
  457. },
  458. SDL_image => {
  459. define => 'HAVE_SDL_IMAGE',
  460. header => 'SDL_image.h',
  461. lib => 'SDL_image',
  462. },
  463. SDL_mixer => {
  464. define => 'HAVE_SDL_MIXER',
  465. header => 'SDL_mixer.h',
  466. lib => 'SDL_mixer',
  467. },
  468. # SDL_net => {
  469. # define => 'HAVE_SDL_NET',
  470. # header => 'SDL_net.h',
  471. # lib => 'SDL_net',
  472. # },
  473. SDL_ttf => {
  474. define => 'HAVE_SDL_TTF',
  475. header => 'SDL_ttf.h',
  476. lib => 'SDL_ttf',
  477. },
  478. SDL_gfx => {
  479. define => 'HAVE_SDL_GFX',
  480. header => 'SDL_gfxPrimitives.h',
  481. lib => 'SDL_gfx',
  482. },
  483. SDL_gfx_blitfunc => {
  484. define => 'HAVE_SDL_GFX_BLITFUNC',
  485. header => 'SDL_gfxBlitFunc.h',
  486. lib => 'SDL_gfx',
  487. },
  488. SDL_gfx_framerate => {
  489. define => 'HAVE_SDL_GFX_FRAMERATE',
  490. header => 'SDL_framerate.h',
  491. lib => 'SDL_gfx',
  492. },
  493. SDL_gfx_imagefilter => {
  494. define => 'HAVE_SDL_GFX_IMAGEFILTER',
  495. header => 'SDL_imageFilter.h',
  496. lib => 'SDL_gfx',
  497. },
  498. SDL_gfx_primitives => {
  499. define => 'HAVE_SDL_GFX_PRIMITIVES',
  500. header => 'SDL_gfxPrimitives.h',
  501. lib => 'SDL_gfx',
  502. },
  503. SDL_gfx_rotozoom => {
  504. define => 'HAVE_SDL_GFX_ROTOZOOM',
  505. header => 'SDL_rotozoom.h',
  506. lib => 'SDL_gfx',
  507. },
  508. SDL_Pango => {
  509. define => 'HAVE_SDL_PANGO',
  510. header => 'SDL_Pango.h',
  511. lib => 'SDL_Pango',
  512. },
  513. png => {
  514. define => 'HAVE_PNG',
  515. header => 'png.h',
  516. lib => 'png',
  517. },
  518. jpeg => {
  519. define => 'HAVE_JPEG',
  520. header => 'jpeglib.h',
  521. lib => 'jpeg',
  522. },
  523. tiff => {
  524. define => 'HAVE_TIFF',
  525. header => 'tiff.h',
  526. lib => 'tiff',
  527. },
  528. smpeg => {
  529. define => 'HAVE_SMPEG',
  530. header => 'smpeg/smpeg.h',
  531. lib => 'smpeg',
  532. },
  533. GL => {
  534. define => 'HAVE_GL',
  535. header => [ 'GL/gl.h', 'GL/glext.h' ],
  536. lib => ( $^O =~ /^(MSWin32|cygwin)$/ )
  537. ? 'opengl32'
  538. : 'GL', # xxx not nice
  539. },
  540. GLU => {
  541. define => 'HAVE_GLU',
  542. header => 'GL/glu.h',
  543. lib => ( $^O =~ /^(MSWin32|cygwin)$/ ) ? 'glu32' : 'GLU', # xxx not nice
  544. },
  545. );
  546. ### Mangle the compilable files into a format Module::Build can understand
  547. my %xs =
  548. map { $subsystems{$_}{file}{from} => $subsystems{$_}{file}{to} }
  549. keys %subsystems;
  550. ### Standard Module::Build stuff
  551. $My::Builder::config = $My::Builder::config; # Prevent a warning
  552. my $build = $package->new(
  553. module_name => 'SDL',
  554. dist_name => 'SDL',
  555. license => 'lgpl',
  556. dist_version_from => 'lib/SDL.pm',
  557. configure_requires => {
  558. 'ExtUtils::CBuilder' => '0.260301',
  559. 'Alien::SDL' => '1.446',
  560. 'File::Find' => '0',
  561. 'File::ShareDir' => '1.0',
  562. 'Tie::Simple' => '0',
  563. "Module::Build" => '0.40',
  564. 'Capture::Tiny' => '0',
  565. },
  566. build_requires => {
  567. 'Test::Simple' => '0.88',
  568. 'Capture::Tiny' => '0',
  569. 'Test::Most' => '0.21',
  570. 'Alien::SDL' => '1.446',
  571. 'File::Find' => '0',
  572. 'File::ShareDir' => '1.0',
  573. 'Tie::Simple' => '0',
  574. 'Scalar::Util' => '0',
  575. },
  576. requires => {
  577. 'Scalar::Util' => '0',
  578. 'Tie::Simple' => '0',
  579. 'File::ShareDir' => '1.0',
  580. 'CPAN' => '1.92',
  581. 'perl' => '5.008000',
  582. },
  583. share_dir => 'share',
  584. build_recommends => {
  585. 'Pod::ToDemo' => '0.20',
  586. },
  587. config => $My::Builder::config,
  588. c_source => 'src',
  589. xs_files => \%xs,
  590. meta_add => {},
  591. typemap_files => { 'typemap' => 'lib/SDL/typemap' },
  592. #create_readme => 1, ### make sense only if there is some POD doc in the file specified by dist_version_from
  593. meta_merge => {
  594. resources => {
  595. bugtracker => 'http://github.com/PerlGameDev/SDL/issues',
  596. repository => 'http://github.com/PerlGameDev/SDL'
  597. }
  598. },
  599. dist_abstract => 'SDL bindings to Perl',
  600. dist_author => 'Kartik Thakore <KTHAKORE@cpan.org>',
  601. );
  602. ### Alien::SDL quick check
  603. warn "###WARNING### Alien::SDL seems to be broken"
  604. unless Alien::SDL->config('prefix');
  605. ### See which subsystems can be built -- do we have headers for them?
  606. print "Detecting available libraries ...\n";
  607. my $build_systems = $build->find_subsystems( \%subsystems, \%libraries );
  608. my $lib_translate = $build->translate_table( \%subsystems, \%libraries );
  609. ### Save info about available subsystems for future SDL::ConfigData
  610. print "Writing config_data ...\n";
  611. $build->config_data( 'SDL_cfg', $build_systems );
  612. $build->config_data( 'SDL_lib_translate', $lib_translate );
  613. $build->config_data( 'subsystems', \%subsystems );
  614. $build->config_data( 'libraries', \%libraries );
  615. ### Something that was originally special to MacOS/Darwin
  616. # somebody MacOS/Darwin friendly should review whether it is still necessary
  617. $build->special_build_settings();
  618. ### Get some info into M::B notes
  619. print "Saving some info to 'notes' ...\n";
  620. $build->notes( 'subsystems', \%subsystems );
  621. $build->notes( 'libraries', \%libraries );
  622. $build->notes( 'build_systems', $build_systems );
  623. $build->notes( 'sdl_cflags', Alien::SDL->config('cflags') );
  624. $build->notes( 'sdl_libs', Alien::SDL->config('libs') );
  625. $build->set_file_flags(); # creates notes('file_flags')
  626. $build->add_build_element('typemap');
  627. $build->create_build_script();